共用方式為


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

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

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

在超大規模服務層級中,當新增至少一個次要複本時,也可以使用讀取縮放功能。 超大規模資料庫的次要具名複本可提供獨立的規模調整、存取隔離、工作負載隔離、支援各種讀取縮放案例和其他優點。 多個次要 高可用性(HA)複本可以用於負載平衡唯讀工作負載,這些工作負載需要比一個次要 HA 複本提供更多資源。

基本、標準和一般用途服務層級的高可用性架構不包含任何複本。 在這些服務層級中無法使用讀取縮放功能。 但使用 Azure SQL Database 時,異地複本可以在這些服務層級中提供類似的功能。 使用 Azure SQL 受控執行個體和容錯移轉群組時,容錯移轉群組唯讀接聽程式可以分別提供類似功能。

下圖說明進階和業務關鍵資料庫和 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),請選取 [選項]:

顯示 [SSMS 選項] 按鈕的螢幕擷取畫面。

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

顯示 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.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、輸送量和延遲統計資料。

注意

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

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

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

在 Azure SQL 資料庫中,基於主要複本的工作階段定義,在唯讀複本上啟動及停止的擴充事件工作階段,可以獨立於主要複本上的工作階段運作。

在 Azure SQL 受控執行個體中,若要在唯讀複本上啟動追蹤,您必須先在主要複本上啟動追蹤,然後才能在唯讀複本上啟動追蹤。 如果未先在主要複本上啟動追蹤,當您嘗試在唯讀複本上啟動追蹤時,會收到下列錯誤:

訊息 3906、層級 16、狀態 2、第 1 行無法更新資料庫 "master",因為資料庫為唯讀。

先在主要復本上啟動追蹤,然後在只讀複本上,您可以停止主要複本上的追蹤。

若要移除唯讀複本上的事件工作階段,請遵循下列步驟:

  1. 連線 SSMS 物件總管或唯讀複本的查詢視窗。
  2. 可在物件總管的工作階段內容功能表中選取 [停止工作階段],或在查詢視窗中執行 ALTER EVENT SESSION [session-name-here] ON DATABASE STATE = STOP;,以停止唯讀複本上的工作階段。
  3. 將物件總管或查詢視窗連線至主要副本。
  4. 刪除主要複本上的工作階段,您可以從工作階段的內容功能表中選擇 [刪除] 或執行 DROP EVENT SESSION [session-name-here] ON DATABASE;

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

唯讀複本上的交易一律使用快照交易隔離等級,無論工作階段的交易隔離等級如何,也不論是否有指定查詢提示。 快照隔離使用資料列版本,以避免讀取方阻礙寫入方的情況。

在罕見的情況下,如果快照隔離交易存取另一個並行交易中已修改的物件元數據,它可能會收到錯誤 3961快照隔離交易在資料庫 'database-name' 中失敗,因為自此交易開始以來,語句所存取的物件已由另一個並行交易中的 DDL 語句修改。這是不允許的,因為元數據未設定版本。如果與快照隔離混合使用,元數據的並行更新可能會導致不一致。

在唯讀副本上長時間運行的查詢

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

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

由於唯讀複本上的交易一律使用快照 交易隔離等級,因此當唯讀複本上有長時間執行的查詢時,如果它讀取最近刪除的列或較舊的列版本,可能會阻止主要複本上的幻影或永久版本存儲區 (PVS) 清理。 未完成的物件或 PVS 清除的延遲可能會影響主要副本上的工作負載。 如需針對 PVS 清除延遲進行疑難解答的詳細資訊,請參閱 監視加速資料庫復原並進行疑難解答

相反地,如果只讀複本上的長時間執行查詢會讀取最近刪除的資料列或較舊的資料列版本,而主要可用性複本上可能無法再取得這些資料列或版本(例如,因為作業的調整),則查詢會因錯誤 3948 而被終止,此交易因可用性複本的配置或狀態更改,或因主要和次要可用性複本上需要快照隔離模式查詢的幽靈記錄正在刪除而終止。請重試此交易。

注意

如果您在針對只讀複本執行查詢時收到錯誤 3961、1219、3947 或 3948,請重試查詢。 或者,避免在主要複本上修改物件元數據(架構變更、索引維護、統計數據更新等)的作業,或在次要複本上執行長時間執行的查詢時調整主要複本。

提示

在進階和業務關鍵服務層級中,當連接到唯讀複本時,redo_queue_sizeredo_rate DMV 中的 和 數據行可用來監視數據同步處理程式,以做為只讀複本上數據傳播延遲的指標。

啟用和停用 SQL 資料庫的讀寫分離功能

若為 SQL 受控執行個體,讀取縮放會在業務關鍵服務層級上自動啟用,無法在一般用途服務層級中使用。 無法停用和重新啟用讀取縮放。

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

若為 Azure SQL Database 中的單一和集區資料庫,您可以使用 Azure 入口網站和 Azure PowerShell,在進階或業務關鍵服務層級中停用和重新啟用讀取縮放。 這些選項不適用於 SQL 受控執行個體,因為無法停用讀取縮放。

注意

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

Azure 入口網站

針對 Azure SQL 資料庫,您可以在 [計算 + 儲存體] 資料庫窗格上管理讀取縮放設定,該設定可在 [設定] 下取得。 使用 Azure 入口網站啟用或停用讀取縮放,不適用於 Azure SQL 受控執行個體。

PowerShell

重要

PowerShell Azure Resource Manager 模組仍受支援,但未來所有開發都是針對 Az.Sql 模組進行。 Azure Resource Manager (AzureRM) PowerShell 模組不再收到錯誤修正。 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

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(高可用性)複本的 Hyperscale 異地複本。 在該情況下,具有唯讀意圖的會話會分佈在異地複本的所有 HA 複本上。

唯讀副本功能支援

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