DBCC CHECKDB

手工修復(fù)數(shù)據(jù)庫(kù)

1吊骤、快速修復(fù)
DBCC CHECKDB ('數(shù)據(jù)庫(kù)名', REPAIR_FAST)
2、重建索引并修復(fù)
DBCC CHECKDB ('數(shù)據(jù)庫(kù)名', REPAIR_REBUILD)
3静尼、如果必要允許丟失數(shù)據(jù)修復(fù)
DBCC CHECKDB ('數(shù)據(jù)庫(kù)名'', REPAIR_ALLOW_DATA_LOSS)

如果出現(xiàn)錯(cuò)誤:未處理修復(fù)語(yǔ)句白粉。數(shù)據(jù)庫(kù)需處于單用戶(hù)模式下。

可以先啟用單用戶(hù)模式鼠渺,方法如下執(zhí)行存儲(chǔ)過(guò)程:

Use master
go
sp_dboption 數(shù)據(jù)庫(kù)名, single, true

--更改成單用戶(hù)
alter database test set single_user with rollback immediate

--還原數(shù)據(jù)庫(kù)為多用戶(hù)模式
alter database test set multi_user with rollback immediate

############################################################
############################################################

手工修復(fù)數(shù)據(jù)庫(kù)試?yán)?/p>

操作步驟:


進(jìn)入SQL查詢(xún)分析器,執(zhí)行語(yǔ)句:

--檢查數(shù)據(jù)庫(kù)完整性
dbcc checkdb('ams1')

 執(zhí)行結(jié)果:

 CHECKDB 發(fā)現(xiàn)了 0 個(gè)分配錯(cuò)誤和 11 個(gè)一致性錯(cuò)誤(在數(shù)據(jù)庫(kù) 'test' 中)鸭巴。

repair_allow_data_loss 是最低的修復(fù)級(jí)別(對(duì)于由 DBCC CHECKDB (test ) 發(fā)現(xiàn)的錯(cuò)誤而言)。
DBCC 執(zhí)行完畢拦盹。如果 DBCC 輸出了錯(cuò)誤信息鹃祖,請(qǐng)與系統(tǒng)管理員聯(lián)系。

說(shuō)明數(shù)據(jù)庫(kù)確實(shí)有問(wèn)題,11個(gè)錯(cuò)誤,找到錯(cuò)誤地方:


對(duì)象 'Tb_Archives_File_1' 有 3777 行普舆,這些行位于 172 頁(yè)中恬口。
CHECKDB 發(fā)現(xiàn)了 0 個(gè)分配錯(cuò)誤和 2 個(gè)一致性錯(cuò)誤(在表 'Tb_Archives_File_1' 中,該表的對(duì)象 ID 為 907150277)奔害。

 表明 'Tb_Archives_File_1' 表確實(shí)有2個(gè)錯(cuò)誤,難怪一查詢(xún)就要死機(jī),于是運(yùn)行語(yǔ)句進(jìn)行表修復(fù):

 --以repair_allow_data_loss級(jí)別修復(fù)表
 dbcc   checktable('Tb_Archives_File_1',repair_allow_data_loss)  
 go  

 執(zhí)行結(jié)果:
 服務(wù)器: 消息 7919楷兽,級(jí)別 16,狀態(tài) 3华临,行 2
 未處理修復(fù)語(yǔ)句芯杀。數(shù)據(jù)庫(kù)需要處于單用戶(hù)模式下。
 DBCC 執(zhí)行完畢雅潭。如果 DBCC 輸出了錯(cuò)誤信息揭厚,請(qǐng)與系統(tǒng)管理員聯(lián)系。

 需要將數(shù)據(jù)庫(kù)改為"單用戶(hù)模式",于是再執(zhí)行:
 --更改成單用戶(hù)
 alter   database   test  set   single_user   with   rollback   immediate  

go
--已repair_allow_data_loss級(jí)別修復(fù)表
dbcc checktable('Tb_Archives_File_1',repair_allow_data_loss)
go

 --若還有問(wèn)題扶供,修復(fù)索引表

DBCC DBREINDEX('Tb_Archives_File_1')

--再修復(fù)表
DBCC CHECKTABLE('Tb_Archives_File_1')

直到返回的結(jié)果沒(méi)有錯(cuò)誤!

--查詢(xún)是否正常
select * from Tb_Archives_File_1

再查詢(xún)那張錯(cuò)誤表,不報(bào)錯(cuò),也不死機(jī)了,數(shù)據(jù)也完好無(wú)損.....哈哈....

--還原數(shù)據(jù)庫(kù)為多用戶(hù)模式
alter database test set multi_user with rollback immediate


MS Sql Server 提供了很多數(shù)據(jù)庫(kù)修復(fù)的命令筛圆,當(dāng)數(shù)據(jù)庫(kù)質(zhì)疑或是有的無(wú)法完成讀取時(shí)可以嘗試這些修復(fù)命令。

1. DBCC CHECKDB
  重啟服務(wù)器后椿浓,在沒(méi)有進(jìn)行任何操作的情況下太援,在SQL查詢(xún)分析器中執(zhí)行以下SQL進(jìn)行數(shù)據(jù)庫(kù)的修復(fù)闽晦,修復(fù)數(shù)據(jù)庫(kù)存在的一致性錯(cuò)誤與分配錯(cuò)誤。

use master
declare @databasename varchar(255)
set @databasename='需要修復(fù)的數(shù)據(jù)庫(kù)實(shí)體的名稱(chēng)'
exec sp_dboption @databasename, N'single', N'true' --將目標(biāo)數(shù)據(jù)庫(kù)置為單用戶(hù)狀態(tài)
dbcc checkdb(@databasename,REPAIR_ALLOW_DATA_LOSS)
dbcc checkdb(@databasename,REPAIR_REBUILD)
exec sp_dboption @databasename, N'single', N'false'--將目標(biāo)數(shù)據(jù)庫(kù)置為多用戶(hù)狀態(tài)

然后執(zhí)行 DBCC CHECKDB('需要修復(fù)的數(shù)據(jù)庫(kù)實(shí)體的名稱(chēng)') 檢查數(shù)據(jù)庫(kù)是否仍舊存在錯(cuò)誤提岔。注意:修復(fù)后可能會(huì)造成部分?jǐn)?shù)據(jù)的丟失仙蛉。

  1. DBCC CHECKTABLE
    如果DBCC CHECKDB 檢查仍舊存在錯(cuò)誤,可以使用DBCC CHECKTABLE來(lái)修復(fù)碱蒙。
    use 需要修復(fù)的數(shù)據(jù)庫(kù)實(shí)體的名稱(chēng)
    declare @dbname varchar(255)
    set @dbname='需要修復(fù)的數(shù)據(jù)庫(kù)實(shí)體的名稱(chēng)'
    exec sp_dboption @dbname,'single user','true'
    dbcc checktable('需要修復(fù)的數(shù)據(jù)表的名稱(chēng)',REPAIR_ALLOW_DATA_LOSS)
    dbcc checktable('需要修復(fù)的數(shù)據(jù)表的名稱(chēng)',REPAIR_REBUILD)
    ------把’ 需要修復(fù)的數(shù)據(jù)表的名稱(chēng)’更改為執(zhí)行DBCC CHECKDB時(shí)報(bào)錯(cuò)的數(shù)據(jù)表的名稱(chēng)
    exec sp_dboption @dbname,'single user','false'

  2. 其他的一些常用的修復(fù)命令
    DBCC DBREINDEX 重建指定數(shù)據(jù)庫(kù)中表的一個(gè)或多個(gè)索引
    用法:DBCC DBREINDEX (表名,’’) 修復(fù)此表所有的索引荠瘪。

===================================

SQL SERVER數(shù)據(jù)庫(kù)的檢測(cè)及修復(fù)方法
隨著K/3產(chǎn)品的推廣,要求客戶(hù)服務(wù)人員對(duì)SQL SERVER數(shù)據(jù)庫(kù)的了解也進(jìn)一步提高赛惩。在K/3的使用過(guò)程中哀墓,數(shù)據(jù)庫(kù)文件被頻繁地使用,由于某些原因喷兼,數(shù)據(jù)庫(kù)有可能被損壞篮绰,本文將針對(duì)這種情況的數(shù)據(jù)庫(kù)檢測(cè)及修復(fù)方法做一簡(jiǎn)單講解。希望各位在實(shí)際工作過(guò)程中有新的發(fā)現(xiàn)時(shí)褒搔,及時(shí)給我們提供信息阶牍,以便做進(jìn)一步的更新。
1.1 SQL SERVER數(shù)據(jù)庫(kù)的檢測(cè)
SQL SERVER提供了數(shù)據(jù)庫(kù)檢測(cè)的命令星瘾,可用DBCC CHECKDB對(duì)數(shù)據(jù)庫(kù)中各個(gè)對(duì)象的分配及結(jié)構(gòu)的正確性進(jìn)行檢測(cè),并可通過(guò)一參數(shù)控制惧辈,將所有的錯(cuò)誤信息顯示出來(lái)琳状。其語(yǔ)法如下:
DBCC CHECKDB
('database_name' [,NOINDEX | { REPAIR_ALLOW_DATA_LOSS
| REPAIR_FAST
| REPAIR_REBUILD
}]
) [WITH {ALL_ERRORMSGS | NO_INFOMSGS}]
參數(shù)說(shuō)明:
'database_name'代表被檢測(cè)的數(shù)據(jù)庫(kù)實(shí)體名;
NOINDEX指非系統(tǒng)表的非聚族索引不檢測(cè)盒齿;
REPAIR_ALLOW_DATA_LOSS | REPAIR_FAST| REPAIR_REBUILD 指直接修復(fù)發(fā)現(xiàn)的錯(cuò)誤念逞,其中REPAIR_ALLOW_DATA_LOSS代表,若此錯(cuò)誤不能修復(fù)時(shí)边翁,系統(tǒng)將直接刪除相關(guān)數(shù)據(jù)翎承。帶此三個(gè)參數(shù)的任一個(gè)時(shí),數(shù)據(jù)庫(kù)必須處于單用戶(hù)模式符匾,可在Enterprise Manager中的數(shù)據(jù)庫(kù)屬性中設(shè)置叨咖;
ALL_ERRORMSGS代表將檢測(cè)到的錯(cuò)誤信息全部顯示出來(lái),否則啊胶,對(duì)于每張表最多只顯示200條錯(cuò)誤信息甸各;
NO_INFOMSGS代表隱藏所有的信息及占用空間的報(bào)告。
經(jīng)過(guò)檢測(cè)焰坪,對(duì)于錯(cuò)誤的對(duì)象趣倾,將以O(shè)BJECT ID的形式報(bào)告具體出錯(cuò)的信息,可根據(jù)OBJECT ID到系統(tǒng)表sysobjects中查找到相關(guān)的表某饰,即NAME儒恋。

1.2 SQL SERVER問(wèn)題數(shù)據(jù)庫(kù)的修復(fù)
經(jīng)過(guò)數(shù)據(jù)庫(kù)檢測(cè)后善绎,可針對(duì)出現(xiàn)的問(wèn)題采取相應(yīng)的措施進(jìn)行處理。如通過(guò)檢測(cè)后诫尽,發(fā)現(xiàn)對(duì)象的物理存放存在問(wèn)題禀酱,可用DBCC CHECKALLOC來(lái)進(jìn)行修復(fù):
DBCC CHECKALLOC ('database_name' | REPAIR_REBUILD }] ) [WITH {ALL_ERRORMSGS | NO_INFOMSGS}]
若是非系統(tǒng)對(duì)象的索引出錯(cuò),則可用DBCC DBREINDEX進(jìn)行修復(fù):
DBCC DBREINDEX ( [ 'database.owner.table_name' [, index_name [, fillfactor ] ] ] ) [WITH NO_INFOMSGS]
以上兩種情況箱锐,也可直接使用DBCC CHECKDB(‘db_name’,repair_rebuild)來(lái)修復(fù)比勉。
另外一種情況是在進(jìn)行檢測(cè)時(shí),提示無(wú)法建立數(shù)據(jù)連接驹止,此時(shí)表明浩聋,數(shù)據(jù)庫(kù)已損壞。對(duì)于這種情況臊恋,我們可采取如下措施來(lái)嘗試修復(fù)衣洁。
首先,在SQL Enterprise中新建一數(shù)據(jù)庫(kù)(如數(shù)據(jù)庫(kù)名為test),建好數(shù)據(jù)庫(kù)后抖仅,停止SQL Server Service Manager坊夫,并將客戶(hù)數(shù)據(jù)庫(kù)的MDF文件更名為test _data.mdf(即新建數(shù)據(jù)庫(kù)的主文件名),然后用更名后的文件覆蓋新建數(shù)據(jù)庫(kù)同名文件撤卢,接著环凿,啟動(dòng)SQL Server Service Manager。對(duì)Master數(shù)據(jù)庫(kù)將系統(tǒng)表設(shè)置為可更改狀態(tài)
Use Master
Go
sp_configure 'allow updates', 1
reconfigure with override
Go
將數(shù)據(jù)庫(kù)設(shè)為緊急狀態(tài):
update sysdatabases set status = 32768 where database '
停止并重新啟動(dòng)SQL Server Service Manager放吩,并重建Log文件:
DBCC TRACEON (3604)
DBCC REBUILD_LOG(' test ','test _log_ldf')
將數(shù)據(jù)庫(kù)設(shè)置為單用戶(hù)模式智听,然后進(jìn)行檢測(cè):
sp_dboption ' test ', 'single user', 'true'
DBCC CHECKDB(' test ')
Go
此數(shù)據(jù)庫(kù)執(zhí)行CHECKDB的過(guò)程中發(fā)現(xiàn)一些表的索引被破壞,于是針對(duì)具體的表進(jìn)行重建索引的操作:
DBCC DBREINDEX(表名)
如執(zhí)行以上操作仍然不能解決渡紫,若索引破壞的表是臨時(shí)表或不是關(guān)鍵表到推,則可從新建賬套中引入,若是主表惕澎,則可能通過(guò)近期的備份來(lái)(部份)恢復(fù)莉测。若沒(méi)有一個(gè)備份,則無(wú)法修復(fù)唧喉。

1.3 SQL Server數(shù)據(jù)庫(kù)為什么易損壞呢捣卤?
以下是微軟提供的一些可能引起數(shù)據(jù)庫(kù)損壞的原因及一些預(yù)防措施:
操作問(wèn)題,包括冷起動(dòng)機(jī)器欣喧、熱拔硬盤(pán)腌零、刪除一些數(shù)據(jù)庫(kù)文件;
硬件問(wèn)題唆阿,包括磁盤(pán)控制器的問(wèn)題益涧;
操作系統(tǒng)問(wèn)題,包括與系統(tǒng)相關(guān)的一些致命錯(cuò)誤驯鳖。

1.4 預(yù)防措施:
1闲询、定期/不定期執(zhí)行CHKDSK(不帶參數(shù))久免,以檢測(cè)硬盤(pán)物理結(jié)構(gòu)并修復(fù)一些CHKDSK報(bào)告的問(wèn)題;
2扭弧、常備份數(shù)據(jù)阎姥。

1.5 應(yīng)用數(shù)據(jù)庫(kù)修復(fù)舉例
declare @databasename varchar(255)
set @databasename='AIS20021224170730'------一定要手工輸入
---------執(zhí)行一般性修復(fù)還存在問(wèn)題時(shí),進(jìn)行允許數(shù)據(jù)丟失的修復(fù)
---------許數(shù)據(jù)丟失的修復(fù)要求在單用戶(hù)下進(jìn)行,此時(shí)請(qǐng)退出中間層,客戶(hù)端,sql的其他模塊
---所有功能退出,在查詢(xún)分析器master里設(shè)置數(shù)據(jù)庫(kù)為單用戶(hù)

exec sp_dboption @databasename, N'single', N'true'

-----在查詢(xún)分析器master里,進(jìn)行修復(fù)數(shù)據(jù)庫(kù)
dbcc checkdb(@databasename,REPAIR_ALLOW_DATA_LOSS)
dbcc checkdb(@databasename,REPAIR_REBUILD)
------還原數(shù)據(jù)庫(kù)狀態(tài)
exec sp_dboption @databasename, N'single', N'false'

第2章數(shù)據(jù)庫(kù)日志損壞的修復(fù)
請(qǐng)遵照如下步驟來(lái)試圖重建數(shù)據(jù)庫(kù)事務(wù)日志.

注意: 由于事務(wù)日志丟失, 數(shù)據(jù)庫(kù)可能有沒(méi)有提交的數(shù)據(jù).

注:都要替換成真實(shí)的數(shù)據(jù)庫(kù)名字

2.1 步驟1:

創(chuàng)建一個(gè)新的數(shù)據(jù)庫(kù),命名為原來(lái)數(shù)據(jù)庫(kù)的名字.

2.2步驟2:

停止SQL Server

2.3步驟3:

把老數(shù)據(jù)庫(kù)的MDF文件替換新數(shù)據(jù)庫(kù)的相應(yīng)的MDF文件, 并把LDF文件刪除

2.4步驟4:

重新啟動(dòng)SQL Server 服務(wù),然后運(yùn)行如下命令:

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然后重新啟動(dòng)SQL Server 服務(wù),然后運(yùn)行如下命令:

DBCC TRACEON (3604)

DBCC REBUILD_LOG('db_name','c:\mssql7\data\dbxxx_3.LDF')

Go

2.6步驟6:

停止SQL然后重新啟動(dòng)SQL Server 服務(wù),然后運(yùn)行:

use master

update sysdatabases set status = 8 where
Go

sp_configure 'allow updates', 0

reconfigure with override

Go

2.7步驟7:
運(yùn)行dbcc checkdb(db_name)檢查數(shù)據(jù)庫(kù)的完整性.

第3章 數(shù)據(jù)庫(kù)質(zhì)疑的一般處理
1、執(zhí)行如下SQL(打開(kāi)修改系統(tǒng)表的開(kāi)關(guān)):
EXEC sp_configure 'allow updates', 1
RECONFIGURE WITH OVERRIDE
2鸽捻、修改數(shù)據(jù)庫(kù)Master中的表:sysdatabases
將 status字段數(shù)值更改為4
3呼巴、再執(zhí)行如下SQL:
EXEC sp_configure 'allow updates', 0
RECONFIGURE WITH OVERRIDE。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末御蒲,一起剝皮案震驚了整個(gè)濱河市衣赶,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌厚满,老刑警劉巖府瞄,帶你破解...
    沈念sama閱讀 211,348評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異碘箍,居然都是意外死亡遵馆,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,122評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén)丰榴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)货邓,“玉大人,你說(shuō)我怎么就攤上這事四濒÷呖郑” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,936評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵峻黍,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我拨匆,道長(zhǎng)姆涩,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,427評(píng)論 1 283
  • 正文 為了忘掉前任惭每,我火速辦了婚禮骨饿,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘台腥。我一直安慰自己宏赘,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,467評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布黎侈。 她就那樣靜靜地躺著察署,像睡著了一般。 火紅的嫁衣襯著肌膚如雪峻汉。 梳的紋絲不亂的頭發(fā)上贴汪,一...
    開(kāi)封第一講書(shū)人閱讀 49,785評(píng)論 1 290
  • 那天脐往,我揣著相機(jī)與錄音,去河邊找鬼扳埂。 笑死业簿,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的阳懂。 我是一名探鬼主播梅尤,決...
    沈念sama閱讀 38,931評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼岩调!你這毒婦竟也來(lái)了巷燥?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,696評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤誊辉,失蹤者是張志新(化名)和其女友劉穎矾湃,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體堕澄,經(jīng)...
    沈念sama閱讀 44,141評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡邀跃,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,483評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蛙紫。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拍屑。...
    茶點(diǎn)故事閱讀 38,625評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖坑傅,靈堂內(nèi)的尸體忽然破棺而出僵驰,到底是詐尸還是另有隱情,我是刑警寧澤唁毒,帶...
    沈念sama閱讀 34,291評(píng)論 4 329
  • 正文 年R本政府宣布蒜茴,位于F島的核電站,受9級(jí)特大地震影響浆西,放射性物質(zhì)發(fā)生泄漏粉私。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,892評(píng)論 3 312
  • 文/蒙蒙 一近零、第九天 我趴在偏房一處隱蔽的房頂上張望诺核。 院中可真熱鬧,春花似錦久信、人聲如沸窖杀。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)入客。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間痊项,已是汗流浹背锅风。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留鞍泉,地道東北人皱埠。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像咖驮,于是被迫代替她去往敵國(guó)和親边器。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,492評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容