使用唯讀複本來卸載唯讀查詢工作負載

適用于:Azure SQL資料庫 Azure SQL 受控執行個體

作為高可用性架構的一部分,進階和業務關鍵服務層級中的每個單一資料庫、彈性集區資料庫和受控執行個體,都會自動佈建主要讀寫複本和數個次要唯讀複本。 次要複本會佈建與主要複本相同的計算大小。 讀取縮放功能可讓您使用其中一個唯讀複本的計算容量來卸載唯讀工作負載,而不是在讀寫複本上執行這些工作負載。 如此一來,某些唯讀工作負載就可以與讀寫工作負載隔離,而且不會影響其效能。 這項功能適用於其中唯讀工作負載以邏輯分隔 (例如分析) 的應用程式。 在進階和業務關鍵服務層級中,應用程式可以使用此額外容量獲得效能優勢,而且無需額外成本。

超大規模服務層級也可以在新增至少一個次要複本時,使用讀取縮放功能。 超大規模資料庫次要 具名複本 提供獨立調整、存取隔離、工作負載隔離、支援各種讀取向外延展案例,以及其他優點。 當唯讀工作負載需要的資源超過一個次要 HA 複本的可用資源時,可使用多個次要 HA 複本對唯讀工作負載進行負載平衡。

基本、標準和一般用途服務層級的高可用性架構不包含任何複本。 在這些服務層級中無法使用讀取縮放功能。 不過,異地複本可以在這些服務層級中提供類似的功能。

下圖說明進階資料庫、業務關鍵資料庫及受控執行個體的功能。

唯讀複本

新的進階、業務關鍵和超大規模資料庫都會預設為啟用讀取縮放功能。

注意

在受控執行個體的業務關鍵服務層級中,以及至少有一個次要複本的超大規模資料庫上,都一律會啟用讀取縮放。

如果您的 SQL 連接字串是設定為 ApplicationIntent=ReadOnly,則應用程式將會重新導向至該資料庫或受控執行個體的唯讀複本。 如需如何使用 ApplicationIntent 屬性的詳細資訊,請參閱指定應用程式意圖

如果不論 SQL 連接字串中的 ApplicationIntent 設定為何,您都希望確保應用程式會連線至主要複本,則必須在建立資料庫時或變更其設定時明確停用讀取縮放。 例如,如果您將資料庫從標準或一般用途層升級為進階或商務關鍵性,而且想要確定您的所有連線都會繼續以主要複本為目標,則請停用讀取縮放。如需有關如何將其停用的詳細資訊,請參閱啟用和停用讀取縮放

注意

唯讀複本上不支援查詢存放區和 SQL Profiler 功能。

資料一致性

在主要複本上進行的資料變更會以同步或非同步方式保存在唯讀複本上 (視複本類型而定)。 不過,相對於主要複本,從唯讀複本進行讀取一律是非同步的,且無論複本類型為何。 在連線到唯讀複本的工作階段中,讀取作業在交易上永遠是一致的。 由於資料傳播延遲是變數,因此不同的複本可能會以稍微不同的時間點 (相對於主要複本) 傳回資料。 如果唯讀複本變得無法使用,而且工作階段重新連線,則可能會連線到與原始複本時間點不同的複本。 同樣地,如果應用程式使用主要複本上的讀寫工作階段來變更資料,並且使用唯讀複本上的唯讀工作階段立即讀取資料,則可能不會立即顯示最新的變更。

主要複本和唯讀複本之間的一般資料傳播延遲會有所差異,範圍介於數十毫秒到單一位數秒數之間。 不過,資料傳播延遲沒有固定的上限。 複本上若有高資源使用率之類的情況,可能會大幅增加延遲。 需要在工作階段之間保證資料一致性,或需要立即讀取認可資料的應用程式,則應該使用主要複本。

注意

若要監視資料傳播延遲,請參閱監視唯讀複本並進行疑難排解

連線至唯讀複本

當您為資料庫啟用讀取縮放時,用戶端所提供的連接字串中的 ApplicationIntent 選項會指出連線應路由至寫入複本還是唯讀複本。 具體來說,如果 ApplicationIntent 值為 ReadWrite (預設值),則連線將會導向至讀寫複本。 這與連接字串不包含 ApplicationIntent 時的行為相同。 如果 ApplicationIntent 值為 ReadOnly,則連線會路由傳送至唯讀的複本。

例如,下列連接字串會將用戶端連線至唯讀複本 (請將角括號中的項目取代為您的環境適用的值,並去除角括號):

Server=tcp:<server>.database.windows.net;Database=<mydatabase>;ApplicationIntent=ReadOnly;User ID=<myLogin>;Password=<myPassword>;Trusted_Connection=False; Encrypt=True;

若要使用 SQL Server Management Studio (SSMS) 連線到唯讀複本,請選取[選項]

SSMS 選項

選取 [其他連線參數 ],然後輸入 ApplicationIntent=ReadOnly ,然後選取 [ 連線]

SSMS 其他參數

下列連接字串會將用戶端連線至讀寫複本 (請將角括號中的項目取代為您的環境適用的值,並去除角括號):

Server=tcp:<server>.database.windows.net;Database=<mydatabase>;ApplicationIntent=ReadWrite;User ID=<myLogin>;Password=<myPassword>;Trusted_Connection=False; Encrypt=True;

Server=tcp:<server>.database.windows.net;Database=<mydatabase>;User ID=<myLogin>;Password=<myPassword>;Trusted_Connection=False; Encrypt=True;

確認已連線到唯讀複本

您可以在資料庫內容中執行下列查詢,確認是否已連線到唯讀複本。 如果您連線到唯讀複本,其會傳回 READ_ONLY。

SELECT DATABASEPROPERTYEX(DB_NAME(), 'Updateability');

注意

在進階和業務關鍵服務層級中,您只能在任何指定時間存取其中一個唯讀複本。 超大規模支援多個唯讀複本。

監視唯讀複本並進行疑難排解

當連線到唯讀複本時,動態管理檢視 (DMV) 會反映複本的狀態,而且可以查詢以用於監視和疑難排解。 資料庫引擎提供多個檢視來公開各種不同的監視資料。

下列檢視通常用於複本監視和疑難排解:

名稱 目的
sys.dm_db_resource_stats 提供過去一小時的資源使用率計量,包括 CPU、資料 IO 和記錄寫入使用率 (相對於服務目標限制)。
sys.dm_os_wait_stats 提供資料庫引擎執行個體的彙總等候統計資料。
sys.dm_database_replica_states 提供複本健全狀態和同步統計資料。 重做佇列大小和重做速率可作為唯讀複本上的資料傳播延遲指標。
sys.dm_os_performance_counters 提供資料庫引擎效能計數器。
sys.dm_exec_query_stats 提供每個查詢的執行統計資料,例如執行次數、使用的 CPU 時間等等。
sys.dm_exec_query_plan() 提供快取的查詢計劃。
sys.dm_exec_sql_text() 為快取的查詢計劃提供查詢文字。
sys.dm_exec_query_profiles 提供查詢執行時的即時查詢進度。
sys.dm_exec_query_plan_stats() 提供最後一個已知的實際執行計畫,包括查詢的執行階段統計資料。
sys.dm_io_virtual_file_stats() 提供所有資料庫檔案的儲存體 IOPS、輸送量和延遲統計資料。

注意

邏輯 master 資料庫中的 sys.resource_statssys.elastic_pool_resource_stats DMV 會傳回主要複本的資源使用率資料。

使用擴充事件監視唯讀複本

您無法在連線到唯讀複本時建立擴充事件工作階段。 不過,在 Azure SQL Database 中,在主要複本上建立及變更的資料庫範圍擴充事件工作階段的定義會複寫至唯讀複本 (包括異地複本),並且會在唯讀複本上擷取事件。

在以主要複本中工作階段定義為基礎的唯讀複本上,擴充事件工作階段可以獨立於主要複本來啟動及停止。 在主要複本上卸載擴充事件工作階段時,其也會從所有唯讀複本上卸載。

唯讀複本上的交易隔離等級

唯讀複本上的交易一律會使用快照 集交易隔離等級,不論會話的交易隔離等級為何,以及不論任何查詢提示為何。 快照集隔離會使用資料列版本設定,以避免封鎖讀取方封鎖寫入方的情況。

在罕見的情況下,如果快照集隔離交易存取已在另一個並行交易中修改過的物件中繼資料,則可能會收到錯誤 3961:「資料庫 '%.*ls' 中的快照集隔離交易失敗,因為此交易啟動之後,另一個並行交易中的 DDL 陳述式修改了此陳述式所存取的物件。 因為中繼資料並未建立版本,因此不允許此情況發生。 如果中繼資料的並行更新與快照集隔離混合,可能會導致不一致的問題。

唯讀複本上長時間執行的查詢

在唯讀複本上執行的查詢,需要存取查詢中所參考物件的中繼資料 (資料表、索引、統計資料等)。在罕見的情況下,如果在主要複本上修改物件中繼資料,而查詢在唯讀複本上保留相同物件的鎖定時,則查詢可以封鎖將變更從主要複本套用至唯讀複本的流程。 如果這類查詢執行很長一段時間,就會導致唯讀複本與主要複本明顯不同步。 針對可能是容錯移轉目標的複本 (進階和業務關鍵服務層級中的次要複本,超大規模 HA 複本和所有異地複本),這也會在發生容錯移轉時延遲資料庫復原,進而導致停機時間超過預期。

如果唯讀複本上長時間執行的查詢直接或間接造成這類封鎖,其可能會自動終止,以避免造成過度的資料延遲和潛在的資料庫可用性影響。 此工作階段將會收到錯誤 1219:「您的工作階段因為高優先順序的 DDL 作業而中斷連線」,或是錯誤 3947:「交易已中止,因為次要計算無法趕上重做。 請重試交易。」

注意

如果對唯讀複本執行查詢時收到錯誤 3961、1219 或 3947,請重試查詢。 或者,避免在主要複本上修改物件中繼資料 (結構描述變更、索引維護、統計資料更新等),同時在次要複本上執行長時間執行的查詢。

提示

在進階和業務關鍵服務層級中,當連線到唯讀複本時,sys.dm_database_replica_states DMV 中的 redo_queue_sizeredo_rate 資料行可用來監視資料同步程序,以作為唯讀複本上的資料傳播延遲指標。

啟用和停用讀取縮放

依預設,進階、業務關鍵和超大規模服務層級上會預設為啟用讀取縮放。 讀取縮放無法在基本、標準或一般用途服務層級中啟用。 設定零次要複本的超大規模資料庫會自動停用讀取縮放。

您可以使用下列方法,針對進階或業務關鍵服務層級中的單一資料庫和彈性集區資料庫,停用及重新啟用讀取縮放。

注意

針對單一資料庫和彈性集區資料庫,停用讀取縮放的功能主要用於回溯相容性。 業務關鍵性的受控執行個體上無法停用讀取縮放。

Azure 入口網站

您可以在 [設定資料庫] 分頁上管理讀取縮放設定。

PowerShell

重要

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 PowerShell 中叫用 Set-AzSqlDatabase Cmdlet,並傳入所需的 -ReadScale 參數值 (EnabledDisabled),可停用或重新啟用讀取縮放。

若要在現有資料庫上停用讀取縮放 (請將角括號中的項目取代為您的環境適用的值,並去除角括號):

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

REST API

若要建立已停用讀取縮放的資料庫,或變更現有資料庫的設定,請使用下列方法,並將 readScale 屬性設定為 EnabledDisabled,如下列範例要求所示。

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 可更新,並可在查詢執行期間進行修改。 如果您的唯讀工作負載相依於使用 tempdb 物件,您應該在連線至唯讀複本時,將這些物件建立為相同工作負載的一部分。

對異地複寫的資料庫使用讀取縮放

異地複寫的次要資料庫具有與主資料庫相同的高可用性架構。 如果您要連線到已啟用讀取縮放的異地複寫次要資料庫,則您具有 ApplicationIntent=ReadOnly 的工作階段將會路由至其中一個高可用性複本,就像是在主要可寫入資料庫上路由一樣。 未設定 ApplicationIntent=ReadOnly 的工作階段會路由傳送至異地複寫次要的主要複本,這也是唯讀狀態。

如此一來,建立異地複本可以為讀寫主要資料庫提供多個額外的唯讀複本。 每個額外的異地複本都會提供另一組唯讀複本。 您可以在任何 Azure 區域中建立異地複本,包括主要資料庫的區域。

注意

異地複寫的次要資料庫複本之間沒有自動循環配置資源或任何其他負載平衡路由,但具有多個 HA 複本的超大規模異地複本除外。 在該情況下,具有唯讀意圖的工作階段會散佈在異地複本的所有 HA 複本上。

唯讀複本上的功能支援

唯讀複本上某些功能的行為清單如下:

  • 系統會自動啟用唯讀複本上的稽核。 如需儲存體資料夾階層、命名慣例及記錄格式的進一步詳細資料,請參閱 SQL Database 稽核記錄格式
  • 查詢效能深入解析會依賴查詢存放區中的資料,其目前不會追蹤唯讀複本上的活動。 查詢效能深入解析將不會顯示唯讀複本上執行的查詢。
  • 自動微調會依賴於查詢存放區,自動微調文件中有詳細說明。 自動微調僅適用於在主要複本上執行的工作負載。

後續步驟