MS Sql Server 提供了很多資料庫修複的命令,當資料庫質疑或是有的無法完成讀取時可以嘗試這些修複命令。
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)
------把’ 需要修複的資料表的名稱’更改為執行DBCC CHECKDB時報錯的資料表的名稱
exec sp_dboption @dbname,'single user','false'
3. 其他的一些常用的修複命令
DBCC DBREINDEX 重建指定資料庫中表的一個或多個索引
用法:DBCC DBREINDEX (表名,’’) 修複此表所有的索引。
===================================
SQL SERVER資料庫的檢測及修複方法
隨著K/3產品的推廣,要求客戶服務人員對SQL SERVER資料庫的瞭解也進一步提高。在K/3的使用過程中,資料庫檔案被頻繁地使用,由於某些原因,資料庫有可能被損壞,本文將針對這種情況的資料庫檢測及修複方法做一簡單講解。希望各位在實際工作過程中有新的發現時,及時給我們提供資訊,以便做進一步的更新。
1.1 SQL SERVER資料庫的檢測
SQL SERVER提供了資料庫檢測的命令,可用DBCC CHECKDB對資料庫中各個對象的分配及結構的正確性進行檢測,並可通過一參數控制,將所有的錯誤資訊顯示出來。其文法如下:
DBCC CHECKDB
('database_name' [,NOINDEX | { REPAIR_ALLOW_DATA_LOSS
| REPAIR_FAST
| REPAIR_REBUILD
}]
) [WITH {ALL_ERRORMSGS | NO_INFOMSGS}]
參數說明:
'database_name'代表被檢測的資料庫實體名;
NOINDEX指非系統資料表的非聚族索引不檢測;
REPAIR_ALLOW_DATA_LOSS | REPAIR_FAST| REPAIR_REBUILD 指直接修複發現的錯誤,其中REPAIR_ALLOW_DATA_LOSS代表,若此錯誤不能修複時,系統將直接刪除相關資料。帶此三個參數的任一個時,資料庫必須處於單一使用者模式,可在Enterprise Manager中的資料庫屬性中設定;
ALL_ERRORMSGS代表將檢測到的錯誤資訊全部顯示出來,否則,對於每張表最多隻顯示200條錯誤資訊;
NO_INFOMSGS代表隱藏所有的資訊及佔用空間的報告。
經過檢測,對於錯誤的對象,將以OBJECT ID的形式報告具體出錯的資訊,可根據OBJECT ID到系統資料表sysobjects中尋找到相關的表,即NAME。
1.2 SQL SERVER問題資料庫的修複
經過資料庫檢測後,可針對出現的問題採取相應的措施進行處理。如通過檢測後,發現對象的物理存放存在問題,可用DBCC CHECKALLOC來進行修複:
DBCC CHECKALLOC ('database_name' | REPAIR_REBUILD }] ) [WITH {ALL_ERRORMSGS | NO_INFOMSGS}]
若是非系統對象的索引出錯,則可用DBCC DBREINDEX進行修複:
DBCC DBREINDEX ( [ 'database.owner.table_name' [, index_name [, fillfactor ] ] ] ) [WITH NO_INFOMSGS]
以上兩種情況,也可直接使用DBCC CHECKDB(‘db_name’,repair_rebuild)來修複。
另外一種情況是在進行檢測時,提示無法建立資料連線,此時表明,資料庫已損壞。對於這種情況,我們可採取如下措施來嘗試修複。
首先,在SQL Enterprise中建立一資料庫(如資料庫名為test),建好資料庫後,停止SQL Server Service Manager,並將客戶資料庫的MDF檔案更名為test _data.mdf(即建立資料庫的主檔案名),然後用更名後的檔案覆蓋建立資料庫同名檔案,接著,啟動SQL Server Service Manager。對Master資料庫將系統資料表設定為可更改狀態
Use Master
Go
sp_configure 'allow updates', 1
reconfigure with override
Go
將資料庫設為緊急狀態:
update sysdatabases set status = 32768 where database '
停止並重新啟動SQL Server Service Manager,並重建Log檔案:
DBCC TRACEON (3604)
DBCC REBUILD_LOG(' test ','test _log_ldf')
將資料庫設定為單一使用者模式,然後進行檢測:
sp_dboption ' test ', 'single user', 'true'
DBCC CHECKDB(' test ')
Go
此資料庫執行CHECKDB的過程中發現一些表的索引被破壞,於是針對具體的表進行重建索引的操作:
DBCC DBREINDEX(表名)
如執行以上操作仍然不能解決,若索引破壞的表是暫存資料表或不是關鍵表,則可從建立賬套中引入,若是主表,則可能通過近期的備份來(部份)恢複。若沒有一個備份,則無法修複。
1.3 SQL Server資料庫為什麼易損壞呢?
以下是微軟提供的一些可能引起資料庫損壞的原因及一些預防措施:
操作問題,包括冷起動機器、熱拔硬碟、刪除一些資料庫檔案;
硬體問題,包括磁碟控制卡的問題;
作業系統問題,包括與系統相關的一些致命錯誤。
1.4 預防措施:
1、定期/不定期執行CHKDSK(不帶參數),以檢測硬碟物理結構並修複一些CHKDSK報告的問題;
2、常備份資料。
1.5 應用程式資料庫修複舉例
declare @databasename varchar(255)
set @databasename='AIS20021224170730'------一定要手工輸入
---------執行一般性修複還存在問題時,進行允許資料丟失的修複
---------許資料丟失的修複要求在單使用者下進行,此時請退出中介層,用戶端,sql的其他模組
---所有功能退出,在查詢分析器master裡設定資料庫為單使用者
exec sp_dboption @databasename, N'single', N'true'
-----在查詢分析器master裡,進行修複資料庫
dbcc checkdb(@databasename,REPAIR_ALLOW_DATA_LOSS)
dbcc checkdb(@databasename,REPAIR_REBUILD)
------還原資料庫狀態
exec sp_dboption @databasename, N'single', N'false'
第2章資料庫日誌損壞的修複
請遵照如下步驟來試圖重建資料庫交易記錄.
注意: 由於交易記錄丟失, 資料庫可能有沒有提交的資料.
注:都要替換成真實的資料庫名字
2.1 步驟1:
建立一個新的資料庫,命名為原來資料庫的名字.
2.2步驟2:
停止SQL Server
2.3步驟3:
把老資料庫的MDF檔案替換新資料庫的相應的MDF檔案, 並把LDF檔案刪除
2.4步驟4:
重新啟動SQL Server 服務,然後運行如下命令:
Use Master
Go
sp_configure 'allow updates', 1
reconfigure with override
Go
begin tran
update sysdatabases set status = 32768 where db_name'
-- Verify one row is updated before committing
commit tran
2.5步驟5:
停止SQL然後重新啟動SQL Server 服務,然後運行如下命令:
DBCC TRACEON (3604)
DBCC REBUILD_LOG('db_name','c:\mssql7\data\dbxxx_3.LDF')
Go
2.6步驟6:
停止SQL然後重新啟動SQL Server 服務,然後運行:
use master
update sysdatabases set status = 8 where
Go
sp_configure 'allow updates', 0
reconfigure with override
Go
2.7步驟7:
運行dbcc checkdb(db_name)檢查資料庫的完整性.
第3章 資料庫質疑的一般處理
1、執行如下SQL(開啟修改系統資料表的開關):
EXEC sp_configure 'allow updates', 1
RECONFIGURE WITH OVERRIDE
2、修改資料庫Master中的表:sysdatabases
將 status欄位數值更改為4
3、再執行如下SQL:
EXEC sp_configure 'allow updates', 0
RECONFIGURE WITH OVERRIDE。