搜尋本站文章

2010-05-31

DBCC CHECKDB 與 DBCC CHECKTABLE 搭配使用 REPAIR_REBUILD 修復參數

DBCC CHECKDB 的檢查與修復對象是指定的資料庫。
DBCC CHECKTABLE 的檢查與修復對象是指定的資料表或索引檢視表。


DBCC CHECKDB 與 DBCC CHECKTABLE 都支援修復的作業,以下為參數的說明:

(1) REPAIR_ALLOW_DATA_LOSS
嘗試修復所有報告的錯誤。這些修復可能會造成某些資料的遺失。

(2) REPAIR_FAST
維護這個語法的目的,只是為了與舊版相容。不會執行任何修復動作。

(3) REPAIR_REBUILD
執行不可能造成資料遺失的修復,這可包括快速修復 (例如,修復非叢集索引中遺失的資料列) 以及更耗時的修復 (例如,重建索引)。
REPAIR_REBUILD 不會修復與 FILESTREAM 資料有關的錯誤。


而且,指定的資料庫必須為「單一使用者模式」。



重要事項:
  • 最好不要使用這些 REPAIR 選項。
  • 若要修復錯誤,我們建議您從備份中還原。
  • 修復作業並不考慮資料表或資料表之間的任何條件約束。
  • 如果指定的資料表涉及一或多項條件約束,建議您在修復作業之後,執行 DBCC CHECKCONSTRAINTS。
  • 如果您必須使用 REPAIR,請執行不含修復選項的 DBCC CHECKDB 來尋找要使用的修復層級。
  • 如果您使用 REPAIR_ALLOW_DATA_LOSS 層級,建議您在搭配這個選項執行 DBCC CHECKDB 之前,先備份資料庫。




以下為 DBCC CHECKDB 搭配使用 REPAIR_REBUILD 修復參數的範例程式碼:
USE master
GO
-- 先設定此資料庫的狀態為:SINGLE_USER 
ALTER DATABASE [資料庫名稱] 
SET SINGLE_USER
WITH ROLLBACK IMMEDIATE;   
GO

-- 執行 DBCC CHECKDB 搭配使用 REPAIR_REBUILD 參數
DBCC CHECKDB (Northwind, REPAIR_REBUILD);
GO

/*
若是非處於「單一使用者模式」時,將遇到以下的錯誤:
訊息 7919,層級 16,狀態 3,行 1
修復陳述式並未處理。資料庫必須處於單一使用者模式。
*/

-- 設定此資料庫的狀態為:MULTI_USER,回復正常上線
ALTER DATABASE [資料庫名稱] 
SET MULTI_USER; 
GO


以下為 DBCC CHECKTABLE 搭配使用 REPAIR_REBUILD 修復參數的範例程式碼:
USE master
GO
-- 先設定此資料庫的狀態為:SINGLE_USER
-- 使用終止選項 WITH ROLLBACK IMMEDIATE。所有未完成的交易都會回復,而且資料庫的任何其他連接都會立即中斷
ALTER DATABASE [資料庫名稱] 
SET SINGLE_USER
WITH ROLLBACK IMMEDIATE; 
GO

-- 執行 DBCC CHECKTABLE 搭配使用 REPAIR_REBUILD 參數
USE [資料庫名稱]
GO
DBCC CHECKTABLE ([資料表], REPAIR_REBUILD);
GO
/*
若是非處於「單一使用者模式」時,將遇到以下的錯誤:
訊息 7919,層級 16,狀態 3,行 1
修復陳述式並未處理。資料庫必須處於單一使用者模式。
*/

-- 設定此資料庫的狀態為:MULTI_USER,回復正常上線
ALTER DATABASE [資料庫名稱] 
SET MULTI_USER; 
GO


參考資料:
DBCC CHECKDB (Transact-SQL)
http://msdn.microsoft.com/zh-tw/library/ms176064(v=SQL.105).aspx

DBCC CHECKTABLE (Transact-SQL)
http://msdn.microsoft.com/zh-tw/library/ms174338.aspx