在備份和還原期間可能的媒體錯誤 (SQL Server)

適用於:SQL Server

SQL Server 可讓您選擇復原資料庫,而不理會偵測到的錯誤。 有一項重要的新錯誤偵測機制,就是可以選擇建立備份總和檢查碼,這是由備份作業所建立,並可使用還原作業來加以驗證。 您可以控制作業是否要檢查錯誤,以及在發生錯誤時,是要停止作業,還是要繼續進行。 如果備份包含備份總和檢查碼,RESTORE 和 RESTORE VERIFYONLY 陳述式就可以檢查錯誤。

注意

鏡像備份提供高達四個媒體集複本 (鏡像),可在因為媒體損壞而導致錯誤時,提供其他的複本來復原。 如需詳細資訊,請參閱鏡像備份媒體集 (SQL Server) (機器翻譯)。

備份總和檢查碼

SQL Server 支援三種類型的總和檢查碼:分頁上的總和檢查碼、記錄區塊中的總和檢查碼,以及備份總和檢查碼。 產生備份總和檢查碼時,BACKUP (備份) 會驗證從資料庫讀取的資料,是否與資料庫中的任何總和檢查碼或損毀頁指示一致。

BACKUP 陳述式可選擇性地計算備份資料流的備份總和檢查碼;如果分頁總和檢查碼或損毀頁資訊顯示在特定的分頁上,備份該分頁時,BACKUP 也會驗證該分頁的總和檢查碼、損毀頁狀態及分頁識別碼。 建立備份總和檢查碼時,備份作業不會新增任何總和檢查碼至分頁。 分頁會依照其存在於資料庫中的樣子來備份,而且備份不會修改分頁。

因為驗證及產生備份總和檢查碼會造成額外負擔,使用備份總和檢查碼可能會影響效能。 工作負載及備份的輸送量可能都會受到影響。 因此,您可以選擇是否要使用備份總和檢查碼。 決定要在備份期間產生總和檢查碼時,請小心監視對 CPU 造成的額外負擔,以及對系統上任何並行工作負載所造成的影響。

BACKUP 絕不會修改磁碟上的來源分頁或是分頁的內容。

已啟用備份總和檢查碼時,備份作業會執行下列步驟:

  1. 在將分頁寫入備份媒體之前,備份作業會先驗證分頁層級的資訊 (分頁總和檢查碼或損毀頁偵測,若其中一項存在的話)。 如果兩者都不存在,則備份無法驗證分頁。 而是直接包含未驗證的分頁,並且將其內容加入整體的備份總和檢查碼。

    如果備份作業在驗證期間發生分頁錯誤,則備份失敗。

    注意

    如需分頁總和檢查碼及損毀頁偵測的詳細資訊,請參閱 ALTER DATABASE 陳述式的 PAGE_VERIFY 選項。 如需詳細資訊,請參閱 ALTER DATABASE SET 選項 (Transact-SQL)

  2. 不論頁面總和檢查碼是否存在,BACKUP 都會產生備份資料流的個別備份總和檢查碼。 還原作業可以選擇性地利用備份總和檢查碼來驗證備份是否損毀。 備份總和檢查碼儲存在備份媒體中,而不是儲存在資料庫頁面中。 在還原時,您可以選擇性地使用備份總和檢查碼。

  3. 備份組會以旗標標示為包含備份總和檢查碼 (在 msdb..backupsethas_backup_checksums資料行中)。 如需詳細資訊,請參閱 backupset (Transact-SQL)

在還原作業期間,如果備份媒體上有備份總和檢查碼,依預設 RESTORE 和 RESTORE VERIFYONLY 陳述式都會驗證備份總和檢查碼及分頁總和檢查碼。 如果沒有備份總和檢查碼,這二種還原作業仍會繼續進行,但不會執行任何驗證;這是因為沒有備份總和檢查碼,還原作業就不能確實地驗證分頁總和檢查碼。

在備份或還原作業期間對分頁總和檢查碼錯誤的回應

根據預設,在發生分頁總和檢查碼錯誤之後,BACKUP 或 RESTORE 作業會失敗,而 RESTORE VERIFYONLY 作業會繼續。 但是,您可以控制給定的作業在發生錯誤時是失敗還是盡其所能地繼續。

如果 BACKUP 作業在發生錯誤後繼續,該作業會執行下列步驟:

  1. 將備份媒體上的備份組標註為包含錯誤,並且在 msdb 資料庫的 suspect_pages 資料表中追蹤該分頁。 如需詳細資訊,請參閱 suspect_pages (Transact-SQL)

  2. 將錯誤記錄在 SQL Server 錯誤記錄檔中。

  3. 將備份組標示為包含該類型的錯誤 (在 msdb.backupsetis_damaged資料行中)。 如需詳細資訊,請參閱 backupset (Transact-SQL)

  4. 發出訊息指出已順利產生備份,但包含分頁錯誤。

相關工作

若要啟用或停用備份總和檢查碼

若要在備份作業期間控制錯誤的回應方式

另請參閱

ALTER DATABASE (Transact-SQL)
BACKUP (Transact-SQL)
backupset (Transact-SQL)
鏡像備份媒體集 (SQL Server)
RESTORE (Transact-SQL)
RESTORE VERIFYONLY (Transact-SQL)