資料庫鏡像工作階段期間自動修復頁面

從 SQL Server 2008 開始,資料庫鏡像夥伴伺服器會嘗試解決阻止讀取資料頁面的特定類型錯誤,以便自動復原鏡像資料庫上的損毀頁面。無法讀取頁面的夥伴會向其他夥伴要求全新副本。如果這個要求成功,無法讀取的頁面就會使用副本取代,這通常會解決錯誤。

[!附註]

由資料庫鏡像夥伴伺服器進行的自動修復頁面與 DBCC 修復不同。自動修復頁面會保留所有資料。相反地,利用 DBCC REPAIR_ALLOW_DATA_LOSS 選項來更正錯誤,可能需要刪除某些頁面,因而也需要刪除某些資料。

造成嘗試自動修復頁面的錯誤類型

資料庫鏡像的自動修復頁面僅會嘗試修復在操作資料檔案時,因為下表列出的其中一個錯誤而失敗的頁面。

錯誤號碼

說明

造成嘗試自動修復頁面的執行個體

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 狀態,而且主體伺服器仍在將記錄檔記錄傳送到鏡像伺服器時,才會嘗試自動修復頁面。自動修復頁面的基本動作順序如下所示:

  1. 在主體資料庫的資料頁面上發生讀取錯誤時,主體伺服器會在 suspect_pages 資料表中插入一個資料列,列出適當的錯誤狀態。然後主體伺服器會向鏡像伺服器要求頁面的副本。此要求會指定目前在已排清記錄檔結尾的頁面識別碼和 LSN。該頁面會標示為還原暫止。這樣就無法在嘗試進行自動修復頁面期間存取該頁面。在嘗試修復期間存取此頁面的嘗試將會失敗,其錯誤為 829 (還原暫止)。

  2. 收到頁面要求後,鏡像伺服器會等到該頁面已經將記錄重做到要求中指定的 LSN 為止。然後,鏡像伺服器就會嘗試存取鏡像資料庫中的頁面。如果可以存取頁面,鏡像伺服器就會將該頁面的副本傳送到主體伺服器。否則,鏡像伺服器會將錯誤傳回主體伺服器,而且自動修復頁面會失敗。

  3. 主體伺服器會處理包含全新頁面副本的回應。

  4. 自動修復頁面修復可疑頁面之後,該頁面在 suspect_pages 資料表中會標示為已還原 (event_type = 4)。

  5. 如果頁面 I/O 錯誤造成任何延遲的交易,修復該頁面後,主體伺服器會嘗試解決那些交易。

處理鏡像資料庫的 I/O 錯誤

在鏡像資料庫上發生的資料頁面 I/O 錯誤會以下列方式處理。

  1. 如果鏡像資料庫在重做記錄檔記錄時遇到一或多個頁面 I/O 錯誤,鏡像工作階段會進入 SUSPENDED 狀態。然後,鏡像伺服器會在 suspect_pages 資料表中插入一個資料列,列出適當的錯誤狀態。鏡像伺服器接著就會向主體伺服器要求頁面的副本。

  2. 主體伺服器會嘗試存取主體資料庫中的頁面。如果可以存取頁面,主體伺服器就會將該頁面的副本傳送到鏡像伺服器。

  3. 如果鏡像伺服器收到所要求之每個頁面的副本,鏡像伺服器會嘗試繼續鏡像工作階段。如果自動修復頁面修復可疑頁面,則該頁面在 suspect_pages 資料表中會標示為已還原 (event_type = 5)。

    如果鏡像伺服器沒有收到向主體伺服器要求的頁面,自動修復頁面會失敗,而且鏡像工作階段會維持在暫停的狀態。如果手動繼續鏡像工作階段,在同步處理階段期間,將會再次叫用損毀的頁面。

開發人員最佳作法

自動修復頁面是在背景中執行的非同步程序。因此,即使是鏡像資料庫,要求無法讀取之頁面的資料庫作業也會失敗,而且會針對造成失敗的情況,傳回錯誤碼。開發鏡像資料庫的應用程式時,您應該攔截失敗作業的例外狀況。如果 SQL Server 錯誤碼為 823、824 或 829,您應該稍後重試該作業。