資料庫鏡像和AlwaysOn可用性群組支援自動修復頁面。 某些類型的錯誤會損毀頁面,導致其無法讀取,資料庫鏡像夥伴(主體或鏡像)或可用性複本(主要或次要)會嘗試自動復原頁面。 無法讀取頁面的夥伴或副本會向其夥伴或另一個副本請求一個新的頁面副本。 如果此要求成功,則無法讀取的頁面會由可讀取的複本取代,這通常會解決錯誤。
一般而言,資料庫鏡像和AlwaysOn可用性群組會以對等的方式處理I/O錯誤。 這裏明確指出了幾個差異。
備註
自動頁面修復與 DBCC 修復不同。 自動頁面修復會保護所有的資料。 相反地,使用 DBCC REPAIR_ALLOW_DATA_LOSS 選項來更正錯誤,可能需要刪除某些頁面,進而刪除資料。
造成自動 Page-Repair 嘗試的錯誤類型
資料庫鏡像自動頁面修復只會嘗試修復資料檔中因以下表格列出的某個錯誤而操作失敗的頁面。
| 錯誤號碼 | 說明 | 造成自動頁面修復嘗試的實例 |
|---|---|---|
| 823 | 只有在作業系統對數據執行循環備援檢查(CRC)失敗時,才會採取行動。 | ERROR_CRC。 此錯誤的作業系統值為 23。 |
| 824 | 邏輯錯誤。 | 邏輯數據錯誤,例如損毀寫入或錯誤的頁面總和檢查碼。 |
| 829 | 頁面已標示為等待還原。 | 全部。 |
若要檢視最近的 823 CRC 錯誤和 824 個錯誤,請參閱 msdb 資料庫中的 suspect_pages 資料表。
無法自動修復的頁面類型
自動修復頁面無法修復下列控件頁面類型:
檔案頭頁 (頁面標識碼 0)。
第 9 頁(資料庫開機頁面)。
配置頁面:全域配置對應 (Global Allocation Map,GAM) 頁面、共用全域配置對應 (Shared Global Allocation Map,SGAM) 頁面,以及頁面可用空間 (Page Free Space,PFS) 頁面。
處理主體/主資料庫上的 I/O 錯誤
在主體/主資料庫上,只有在資料庫處於 SYNCHRONIZED 狀態,且主體/主要資料庫仍在將資料庫的記錄檔記錄傳送至鏡像/輔助資料庫時,才會嘗試自動修復頁面。 自動修復頁面嘗試中的基本動作順序如下:
當主/主要資料庫的資料頁面發生讀取錯誤時,主/主要會在 suspect_pages 資料表中插入具有適當錯誤狀態的資料列。 針對資料庫鏡像,主伺服器接著會向鏡像請求頁面副本。 針對 Always On 可用性群組,主要複本會將請求廣播到所有次要複本,並從最先回應的次要複本取得頁面。 請求會指定頁面 ID 和當前在已排清日誌末尾的 LSN。 頁面標示為 還原擱置。 這會使它在自動修復頁面嘗試期間無法存取。 嘗試在修復嘗試期間存取此頁面將會失敗,錯誤 829 (還原擱置中)。
收到頁面要求後,鏡像/輔助伺服器會等待,直到重新執行日志到達要求中指定的 LSN。 然後,鏡像/次要會嘗試存取其資料庫複本中的頁面。 如果可以存取頁面,鏡像/次要會將頁面的複本傳送至主體/主要複本。 否則,鏡像/次要副本會將錯誤訊息傳回主體/主要副本,而自動頁面修復嘗試將會失敗。
主體/主要會處理包含頁面新復本的回應。
自動修復頁面嘗試修正可疑頁面之後,頁面會在 suspect_pages 數據表中標示為已還原(event_type = 5)。
如果頁面 I/O 錯誤造成任何 延遲交易,在修復頁面之後,主要伺服器會嘗試解決這些交易。
處理鏡像/輔助資料庫上的 I/O 錯誤
鏡像/輔助資料庫上發生之數據頁面上的 I/O 錯誤,通常與資料庫鏡像和 AlwaysOn 可用性群組處理的方式相同。
使用資料庫鏡像時,如果鏡像在重做記錄檔記錄時遇到一或多個頁面 I/O 錯誤,鏡像會話就會進入 SUSPENDED 狀態。 使用 AlwaysOn 可用性群組時,如果次要複本在重做記錄檔記錄時遇到一或多個頁面 I/O 錯誤,輔助資料庫就會進入 SUSPENDED 狀態。 此時,鏡像/次要複本會在 suspect_pages 表中插入一行資料,並具有適當的錯誤狀態。 然後次要/鏡像會向主要/主體請求一個頁面的副本。
主體/主要嘗試存取其資料庫復本中的頁面。 如果可以存取頁面,主要會將頁面複本傳送至鏡像/次要。
如果鏡像或次要伺服器已接收到其要求的每個頁面的複本,則會嘗試恢復鏡像會話。 如果自動修復頁面嘗試修正可疑頁面,頁面會在 suspect_pages 數據表中標示為已還原(event_type = 4)。
如果鏡像/次要伺服器未收到它從主體/主要伺服器要求的頁面,則自動修復頁面嘗試會失敗。 使用資料庫鏡像時,鏡像會話仍會暫停。 使用AlwaysOn可用性群組時,輔助資料庫仍會暫停。 如果手動恢復鏡像會話或輔助資料庫,則在同步階段中,損毀的頁面將再次被訪問。
開發人員最佳做法
自動頁面修復是一個在背景執行的異步程序。 因此,要求無法讀取頁面的資料庫作業會失敗,並針對導致失敗的任何條件傳回錯誤碼。 開發鏡像資料庫或可用性資料庫的應用程式時,您應該攔截失敗作業的例外狀況。 如果 SQL Server 錯誤碼是 823、824 或 829,您應該稍後重試作業。
如何檢視自動 Page-Repair 嘗試
下列動態管理檢視會針對給定可用性資料庫或鏡像資料庫的最新自動修復頁面嘗試傳回數據列,每個資料庫最多 100 個數據列。
AlwaysOn 可用性群組:
sys.dm_hadr_auto_page_repair (Transact-SQL)
伺服器實例中,每當針對任何可用性群組裝載的可用性複本上的任意可用性資料庫進行自動修復頁面嘗試時,均傳回一個資料列。
資料庫鏡像:
sys.dm_db_mirroring_auto_page_repair (Transact-SQL)
在伺服器實例中,針對任何鏡像資料庫的每次自動頁面修復嘗試,傳回一列資料。
另請參閱
管理 suspect_pages 資料表 (SQL Server)
AlwaysOn 可用性群組概觀 (SQL Server)
資料庫鏡像 (SQL Server)