使用唯讀複本來卸載唯讀查詢工作負載
適用於:
Azure SQL 資料庫
Azure SQL 受控執行個體
作為高可用性架構的一部分,進階版和業務關鍵服務層級中的每個單一資料庫或彈性集區資料庫,都會自動佈建主要讀寫複本和一個或多個次要唯讀複本。 次要複本會部署與主要複本相同的計算資源大小。
讀取縮放功能可讓您使用其中一個唯讀複本的計算容量來卸載唯讀工作負載,而不是在讀寫複本上執行這些工作負載。 如此一來,某些唯讀工作負載就可以與讀寫工作負載隔離,而且不會影響其效能。 這項功能是為包含邏輯上分隔的唯讀工作負載(如分析)的應用程式設計的。 在進階和業務關鍵服務層級中,應用程式可以使用此額外容量獲得效能優勢,而且無需額外成本。
在超大規模服務層級中,當新增至少一個次要複本時,也可以使用讀取縮放功能。 超大規模資料庫的次要具名複本可提供獨立的規模調整、存取隔離、工作負載隔離、支援各種讀取縮放案例和其他優點。 當唯讀工作負載需要的資源超過一個次要 HA 複本的可用資源時,可使用多個次要 HA 複本對唯讀工作負載進行負載平衡。
基本、標準和一般用途服務層級的高可用性架構不包含任何複本。 在這些服務層級中無法使用讀取縮放功能。 但使用 Azure SQL Database 時,異地複本可以在這些服務層級中提供類似的功能。 使用 Azure SQL 受控執行個體和容錯移轉群組時,容錯移轉群組唯讀接聽程式可以分別提供類似功能。
下圖說明進階資料庫、業務關鍵資料庫及受控執行個體的功能。
新的進階、業務關鍵和超大規模資料庫都會預設為啟用讀取縮放功能。
注意
在 SQL 受控執行個體的業務關鍵服務層級中,以及至少有一個次要複本的超大規模資料庫上,都一律會啟用讀取縮放功能。
如果您的 SQL 連接字串是設定為 ApplicationIntent=ReadOnly
,則應用程式會重新導向至該資料庫或受控執行個體的唯讀複本。 如需如何使用 ApplicationIntent
屬性的詳細資訊,請參閱指定應用程式意圖。
僅針對 Azure SQL Database,如果不論 SQL 連接字串中的 ApplicationIntent
設定為何,您都希望確保應用程式會連線至主要複本,則必須在建立資料庫或變更其設定時,明確停用讀取縮放。 例如,如果您將資料庫從標準或一般用途層升級為高階或企業關鍵性,而且想要確定您的所有連線都會繼續連接到主要副本,則請停用讀取擴展。如需有關如何將其停用的詳細資訊,請參閱啟用和停用讀取擴展。
注意
唯讀複本不支援查詢存放庫和 SQL Profiler 的功能。
在主要複本上進行的資料變更會以同步或非同步方式保存在唯讀複本上 (視複本類型而定)。 不過,無論複本類型為何,從唯讀複本對主要複本的讀取一律是非同步的。 在連線到唯讀副本的會話中,讀取作業總是在交易上保持一致。 由於資料傳播延遲是變數,因此不同的複本可能會以稍微不同的時間點 (相對於主要複本) 傳回資料。 如果唯讀複本變得無法使用,而且工作階段重新連線,則可能會連線到與原始複本時間點不同的複本。 同樣地,如果應用程式在主伺服器上使用讀寫工作階段來變更資料,然後立即在唯讀副本上以唯讀工作階段來讀取,則最新的變更可能無法立即顯示。
主要複本和唯讀複本之間的一般資料傳播延遲會有所差異,範圍介於數十毫秒到單一位數秒數之間。 不過,資料傳播延遲沒有固定的上限。 複本上若有高資源使用率之類的情況,可能會大幅增加延遲。 需要在工作階段之間保證資料一致性,或需要立即讀取認可資料的應用程式,則應該使用主要複本。
注意
資料傳播延遲包括將記錄檔記錄傳送和保存 (如果適用) 至次要複本所需的時間。 它還包括在資料頁面上重建 (套用) 這些日誌記錄所需的時間。 為了確保資料一致性,在套用交易提交記錄檔記錄之前,不會顯示變更。 當工作負載使用較大的交易時,會增加有效的資料傳播延遲。
若要監視資料傳播延遲,請參閱監視唯讀複本並進行疑難排解。
當您為資料庫啟用讀取縮放時,用戶端所提供的連接字串中的 ApplicationIntent
選項會指出連線應路由至寫入複本還是唯讀複本。 具體來說,如果 ApplicationIntent
值為 ReadWrite
(預設值),則連線將會導向至讀寫複本。 這與連接字串不包含 ApplicationIntent
時的行為相同。 如果 ApplicationIntent
值為 ReadOnly
,則連線會路由傳送至唯讀的複本。
例如,下列連接字串會將用戶端連線至唯讀副本 (請使用您的環境適用的值取代角括號中的項目,並去除角括號):
Server=tcp:<server>.database.windows.net;Database=<mydatabase>;ApplicationIntent=ReadOnly;User ID=<myLogin>;Password=<password>;Trusted_Connection=False; Encrypt=True;
若要使用 SQL Server Management Studio (SSMS) 連線到唯讀複本,請選取 [選項]
選取 [其他連線參數],接著輸入 ,然後選取 [連線]
您可以使用以下任一連接字串將客戶端連接到讀寫複本(請將尖括號中的項目替換為您環境中適用的值,並移除尖括號):
Server=tcp:<server>.database.windows.net;Database=<mydatabase>;ApplicationIntent=ReadWrite;User ID=<myLogin>;Password=<password>;Trusted_Connection=False; Encrypt=True;
Server=tcp:<server>.database.windows.net;Database=<mydatabase>;User ID=<myLogin>;Password=<password>;Trusted_Connection=False; Encrypt=True;
您可以在資料庫內容中執行下列查詢,確認是否已連線到唯讀複本。 如果您連線到唯讀副本,它會回傳 READ_ONLY。
SELECT DATABASEPROPERTYEX(DB_NAME(), 'Updateability');
注意
在進階和業務關鍵服務層級中,您只能在任何指定時間存取其中一個唯讀複本。 超大規模架構支援多個唯讀副本。
您有各種不同的方式可以監視唯讀複本,包括:DMV、擴充事件,以及 資料庫監看員(預覽)。
當連線到唯讀複本時,動態管理檢視 (DMV) 會反映複本的狀態,而且可以查詢以用於監視和疑難排解。 資料庫引擎提供多個檢視來公開各種不同的監視資料。
下列視圖通常用於副本監視和疑難排解:
注意
邏輯 sys.resource_stats
資料庫中的 sys.elastic_pool_resource_stats
和 master
DMV 會傳回主要複本的資源使用率資料。
您無法在連線到唯讀複本時建立擴充事件工作階段。 不過,在 Azure SQL 資料庫和 Azure SQL 受控執行個體中,在主要複本上建立及變更的資料庫範圍擴充事件工作階段的定義會複寫至唯讀複本 (包括異地複本),並且會在唯讀複本上擷取事件。
在 Azure SQL 資料庫中,基於主要複本的工作階段定義,在唯讀複本上啟動及停止的擴充事件工作階段,可以獨立於主要複本上的工作階段運作。
在 Azure SQL 受控執行個體中,若要在唯讀複本上啟動追蹤,您必須先在主要複本上啟動追蹤,然後才能在唯讀複本上啟動追蹤。 如果未先在主要複本上啟動追蹤,當您嘗試在唯讀複本上啟動追蹤時,會收到下列錯誤:
訊息 3906、層級 16、狀態 2、第 1 行無法更新資料庫 "master",因為資料庫為唯讀。
首先在主要複本上啟動追蹤,然後在唯讀複本上啟動追蹤後,您可以在主要複本上停止追蹤。
若要移除唯讀複本上的事件工作階段,請遵循下列步驟:
-
連線 SSMS 物件總管或唯讀複本的查詢視窗。
- 可在物件總管的工作階段內容功能表中選取 [停止工作階段],或在查詢視窗中執行
ALTER EVENT SESSION [session-name-here] ON DATABASE STATE = STOP;
,以停止唯讀複本上的工作階段。
- 將物件總管或查詢視窗連線至主要副本。
- 刪除主要複本上的工作階段,您可以從工作階段的內容功能表中選擇 [刪除] 或執行
DROP EVENT SESSION [session-name-here] ON DATABASE;
唯讀複本上的交易一律使用快照交易隔離等級,無論工作階段的交易隔離等級如何,也不論是否有指定查詢提示。 快照隔離使用資料列版本,以避免讀取方阻礙寫入方的情況。
在罕見的情況下,如果快照集隔離交易存取已在另一個並行交易中修改過的物件中繼資料,則可能會收到錯誤 3961:「資料庫 '%.*ls' 中的快照集隔離交易失敗,因為此交易啟動之後,另一個並行交易中的 DDL 陳述式修改了此陳述式所存取的物件。 由於中繼資料未進行版本控管,因此不被允許。 如果中繼資料的並行更新與快照隔離混合,可能會導致不一致性。
在唯讀複本上執行的查詢,需要存取查詢中所參考物件的中繼資料 (資料表、索引、統計資料等)。在罕見的情況下,如果在主要複本上修改物件中繼資料,而查詢在唯讀複本上保留相同物件的鎖定時,則查詢可以封鎖將變更從主要複本套用至唯讀複本的流程。 如果這類查詢執行很長一段時間,就會導致唯讀複本與主要複本明顯不同步。 針對可能是容錯移轉目標的複本 (進階和業務關鍵服務層級中的次要複本,超大規模 HA 複本和所有異地複本),這也會在發生容錯移轉時延遲資料庫復原,進而導致停機時間超過預期。
如果唯讀複本上長時間執行的查詢直接或間接造成這類封鎖,其可能會自動終止,以避免造成過度的資料延遲和潛在的資料庫可用性影響。 此工作階段會收到錯誤 1219:「您的工作階段因為高優先順序的 DDL 作業而中斷連線」,或是錯誤 3947:「交易已中止,因為次要計算無法趕上重做。 請重試交易。」
注意
如果對唯讀複本執行查詢時收到錯誤 3961、1219 或 3947,請重試查詢。 或者,在次要複本上執行長時間查詢時,避免對主要複本進行物件中繼資料的修改(例如結構描述變更、索引維護、統計資料更新等)。
提示
在進階和業務關鍵服務層級中,當連線到唯讀複本時,redo_queue_size
DMV 中的 redo_rate
和 資料行可用來監視資料同步程序,以作為唯讀複本上的資料傳播延遲指標。
若為 SQL 受控執行個體,讀取縮放會在業務關鍵服務層級上自動啟用,無法在一般用途服務層級中使用。 無法停用和重新啟用讀取縮放。
若為 SQL Database,在進階、業務關鍵和超大規模服務層級上,讀取縮放 (read scale-out) 會預設啟用。 讀取縮放無法在基本、標準或一般用途服務層級中啟用。 設定零次要複本的超大規模資料庫會自動停用讀取縮放。
若為 Azure SQL Database 中的單一和集區資料庫,您可以使用 Azure 入口網站和 Azure PowerShell,在進階或業務關鍵服務層級中停用和重新啟用讀取縮放。 這些選項不適用於 SQL 受控執行個體,因為無法停用讀取縮放。
注意
針對單一資料庫和彈性集區資料庫,停用讀取縮放的功能主要用於回溯相容性。 業務關鍵性的受控執行個體上無法停用讀取縮放。
針對 Azure SQL 資料庫,您可以在 [計算 + 儲存體] 資料庫窗格上管理讀取縮放設定,該設定可在 [設定] 下取得。 使用 Azure 入口網站啟用或停用讀取縮放,不適用於 Azure SQL 受控執行個體。
重要
PowerShell Azure Resource Manager 模組仍受支援,但未來所有開發都是針對 Az.Sql 模組進行。 Azure Resource Manager 模組在至少 2020 年 12 月之前都還會持續收到錯誤 (bug) 修正。 Az 模組和 Azure Resource Manager 模組中的命令引數本質上相同。 如需其相容性的詳細資訊,請參閱新的 Azure PowerShell Az 模組簡介。
要在 Azure PowerShell 中管理讀取縮放,必須使用 2016 年 12 月版的 Azure PowerShell 或更新版本。 如需最新 PowerShell 版本的相關資訊,請參閱 Azure PowerShell。
在 Azure SQL Database 中,您可以在 Azure PowerShell 中叫用 Set-AzSqlDatabase Cmdlet,並傳入所需的 Enabled
參數值 (Disabled
或 -ReadScale
),以停用或重新啟用讀取縮放。 無法停用 SQL 受控執行個體的讀取擴展功能。
若要在現有資料庫上停用讀取縮放 (請將角括號中的項目取代為您的環境適用的值,並去除角括號):
Set-AzSqlDatabase -ResourceGroupName <resourceGroupName> -ServerName <serverName> -DatabaseName <databaseName> -ReadScale Disabled
若要在新的資料庫上停用讀取縮放,請將角括號中的項目替換成在您的環境中適用的值,並去除角括號。
New-AzSqlDatabase -ResourceGroupName <resourceGroupName> -ServerName <serverName> -DatabaseName <databaseName> -ReadScale Disabled -Edition Premium
若要在現有資料庫上重新啟用讀取縮放 (請將角括號中的項目取代為您的環境適用的值,並去除角括號):
Set-AzSqlDatabase -ResourceGroupName <resourceGroupName> -ServerName <serverName> -DatabaseName <databaseName> -ReadScale Enabled
若要建立已停用讀取縮放的資料庫,或變更現有資料庫的設定,請使用下列方法,並將 readScale
屬性設定為 Enabled
或 Disabled
,如下列範例要求所示。
Method: PUT
URL: https://management.azure.com/subscriptions/{SubscriptionId}/resourceGroups/{GroupName}/providers/Microsoft.Sql/servers/{ServerName}/databases/{DatabaseName}?api-version= 2014-04-01-preview
Body: {
"properties": {
"readScale":"Disabled"
}
}
如需詳細資訊,請參閱資料庫 - 建立或更新。
主要複本上的 tempdb
資料庫不會複寫至唯讀複本。 每個複本都有自己的 tempdb
資料庫,此資料庫會在建立複本時建立。 這可確保 tempdb
可更新,並可在查詢執行期間進行修改。 如果您的唯讀工作負載相依於使用 tempdb
物件,您應該在連線至唯讀複本時,將這些物件建立為相同工作負載的一部分。
異地複寫的次要資料庫具有與主資料庫相同的高可用性架構。 如果您要連線到已啟用讀取縮放的異地複寫次要資料庫,則您具有 ApplicationIntent=ReadOnly
的連線將路由至其中一個高可用性複本,與在主要可寫入資料庫上的路由方式相同。 未設定 ApplicationIntent=ReadOnly
的工作階段會被路由至地理複寫的次要複本的主要副本,該副本是唯讀狀態。
通過這種方式,建立地理複本可以為主要讀寫資料庫提供多個額外的唯讀複本。 每個額外的異地複本都會提供一組新的唯讀複本。 您可以在任何 Azure 區域中建立異地複本,包括主要資料庫的區域。
注意
在異地複寫的次要資料庫複本之間,沒有自動的循環調度或其他任何負載平衡的路由配置,唯一例外是具有多個 HA(高可用性)複本的 Hyperscale 異地複本。 在該情況下,具有唯讀意圖的會話會分佈在異地複本的所有 HA 複本上。
唯讀複本上某些功能的行為清單如下:
- 如需 SQL Database 超大規模供應項目的詳細資訊,請參閱超大規模服務層級。