天天看點

MS Sql Server 資料庫或表修複

提示資料庫處于恢複模式時重建日志檔案可以解決 DBCC REBUILD_LOG('db_name','c:\mssql7\data\dbxxx_3.LDF') 

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資料庫的檢測及修複方法 

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。 

轉載于:https://www.cnblogs.com/bluecs/p/4207630.html