2017年11月29日 星期三

[SQL] DBCC CHECKDB修復資料庫、CHECKTABLE修復資料表

最近公司資料庫排程一直跳出錯誤,備份資料庫無法作完整驗證、重新組織索引及重建索引都失敗,上網查詢了一下可以使用DBCC CHECKDB檢查資料庫,CHECKDB依硬碟大小及IO能力決定檢查時間,資料庫大時可能要不少時間,平日可以改用CHECKTABLE來分批檢查,沒想到一檢查下去果真出現錯誤,使用REPAIR修復的話可針對資料庫或資料表進行修復,但有資料損失的風險

1. DBCC CHECKDB
重啟伺服器後,在沒有進行任何操作的情況下,在SQL查詢分析器中執行以下SQL進行資料庫的修復,修復資料庫存在的一致性錯誤與分配錯誤。

use master
declare @databasename Varchar(255)
set @databasename='需要修復的資料庫實體的名稱'
--將目標資料庫置為單使用者狀態
exec sp_dboption @databasename, N'single', N'true'
dbcc checkdb(@databasename,REPAIR_ALLOW_DATA_LOSS)
dbcc checkdb(@databasename,REPAIR_REBUILD)
--將目標資料庫置為多使用者狀態
exec sp_dboption @databasename, N'single', N'false'

然後執行 DBCC CHECKDB('需要修復的資料庫實體的名稱') 檢查資料庫是否仍舊存在錯誤。


2. DBCC CHECKTABLE
如果DBCC CHECKDB 檢查仍舊存在錯誤,可以使用DBCC CHECKTABLE來修復。

use 需要修復的資料庫實體的名稱
declare @dbname Varchar(255)
set @dbname='需要修復的資料庫實體的名稱'
--將目標資料庫置為單使用者狀態
exec sp_dboption @dbname,'single user','true'
dbcc checktable('需要修復的資料表的名稱',REPAIR_ALLOW_DATA_LOSS)
dbcc checktable('需要修復的資料表的名稱',REPAIR_REBUILD
--將目標資料庫置為多使用者狀態
exec sp_dboption @dbname,'single user','false'

3. 其他的一些常用的修復命令

DBCC DBREINDEX 重建指定資料庫中表的一個或多個索引

用法:DBCC DBREINDEX (表名,’’) 修復此表所有的索引

不過修復資料庫有損失資料的風險
1.如果是修復資料庫可以先卸離資料庫備份一份後再進行操作
2.如果是修復資料表的話可以先把資料表匯出可存取的資料至新的資料表,再用DBCC CHECKTABLE檢查是否還有錯誤,若沒有錯的話可以將舊資料表刪除後,把新資料表改回原資料表名稱

沒有留言:

張貼留言