總結(jié)步驟如下:
1、檢測數(shù)據(jù)庫, 使用命令(Dbcc checkdb) 拿到數(shù)據(jù)庫后附加到本地 SQLserver 使其運(yùn)行,打開企業(yè)管理器,查看它。 同時(shí)打開查詢分析器,在里面輸入Dbcc checkdb 檢測數(shù)據(jù)庫命令然后回車 即可以看到數(shù)據(jù)庫的分析資料看到問題, 評注:拿到問題先不要盲目的卸載 SQLServer,本次因?yàn)樾率郑鲜趾缶桶?數(shù)據(jù)庫卸載,這樣就耗費(fèi)了一天的時(shí)間,過沒有任何作用,測試服務(wù)器的完整性 可以拿一個(gè)好的數(shù)據(jù)庫做對比,自己可以建一個(gè)“test”,如果測試數(shù)據(jù)庫運(yùn)行 正常,則不需要對服務(wù)器做任何改動。千萬不要改動系統(tǒng),麻煩會更大。 提示:錯(cuò)誤會以紅色顯示。
2、簡單修復(fù):命令:dbcc checkdb 輸入以下兩句嘗試修復(fù)。
DBCC CHECKDB('數(shù)據(jù)庫名',repair_allow_data_loss)
DBCC CHECKDB('數(shù)據(jù)庫名',repair_rebuild)
不管他究竟哪里錯(cuò)了, 先用這兩句試試一般的索引系統(tǒng)文件丟失, SQLserver 都可以解決這個(gè)問題,基本就差不多了。但是對于主鍵索引損壞,這個(gè)命令基本 修不好,所以對一個(gè)滿身是傷的數(shù)據(jù)庫,他可以修復(fù) 70%。
注:修復(fù)時(shí)系統(tǒng)提示必須要在單用戶模式下才可以生效,用戶可以去企業(yè)管 理器,對要修理的數(shù)據(jù)庫:右擊屬性-選項(xiàng)-限制訪問-單用戶。也可以使用以下語句實(shí)現(xiàn):
ALTER DATABASE 數(shù)據(jù)庫名 SET single_USER
GO
---改為單用戶
ALTER DATABASE 數(shù)據(jù)庫名 SET MULTI_USER
GO
---改為多用戶
繼續(xù)使用 dbcc checkdb 檢測,如果繼續(xù)報(bào)錯(cuò)。 再次運(yùn)行:
DBCC CHECKDB('DataBasename') with NO_INFOMSGS,PHYSICAL_ONLY
然后再運(yùn)行:
DBCC CHECKDB(' DataBasename ',repair_allow_data_loss) WITH TABLOCK
再次運(yùn)行:DBCC CHECKDB('DB name')
系統(tǒng)顯示修復(fù)成功,說明本次問題主 要由索引等數(shù)據(jù)庫系統(tǒng)本身問題引起,這樣的修復(fù)可能會導(dǎo)致數(shù)據(jù)丟失,但是絕 對不會是大批丟失,基本沒有影響。
3、檢測表:命令:dbcc checktable(‘tablename’) 接上述檢測提示:我們可以看到一個(gè) id 號,這個(gè)基本就是這個(gè)錯(cuò)誤的表在 系統(tǒng)表“sysobjects”里面的注冊信息。
輸入如下語句即可以看見:
select * from sysobjects where id=1205579333(錯(cuò)誤提示號碼)
接下來檢測這張表究竟是什么問題。 輸入:
dbcc checktable(‘tablename’)
接下來將會得到一些錯(cuò)誤提示,基本上就是檢測表的時(shí)候那些,提示什么 B 樹錯(cuò)誤, 父節(jié)點(diǎn), 子節(jié)點(diǎn)錯(cuò)誤, 這些都別管, 因?yàn)檫@個(gè)可能就是索引引起的錯(cuò)誤:
嘗試用下列語句修復(fù): DBCC CHECKtable('Tablename',repair_rebuild)
執(zhí)行完后查看提示:如果出現(xiàn)下面的提示 CREATE UNIQUE INDEX 終止,因?yàn)榘l(fā)現(xiàn)了索引 ID 1 的重復(fù)鍵。最重要的主 鍵為 '3'。這里基本上就可以確定就是索引出的問題,而且數(shù)據(jù)表沒有被修復(fù)的 可能很可能就是內(nèi)容產(chǎn)生的問題。根據(jù)提示,我們得出的結(jié)論就是主鍵重復(fù)。 這是我們使用 select 查詢語句是看不到的甚至表里面打開也沒有反映。此時(shí), 關(guān)閉查詢分析器, 打開企業(yè)管理器, 找到那個(gè)數(shù)據(jù)表, 然后右擊選擇設(shè)計(jì)表, 選擇主鍵,右擊,取消主鍵,回到查詢分析器,找到該表,右擊選擇索引,這時(shí) 候表以前所有的索引都能看見了,但是上面的唯一性選項(xiàng)很明顯沒有了,然后給 表里面添加一個(gè)新的字段,字段名 id 需要生成編號:
語句如下:
alter table t_item add id integer identity
該字段用完后刪除,
語句如下:
alter table t_item drop column id
在查詢分析器這里右擊索引,選擇唯一性選項(xiàng),然后點(diǎn)擊確定,系統(tǒng)會提示 重復(fù)鍵,和最重要的主鍵 ID,根據(jù) id 數(shù)字,進(jìn)行查詢 如提示最重要的鍵值是 3 則, select * from t_item where fitemid=3 有時(shí)候查詢的結(jié)果,是合法的,比如這個(gè) 3 可能只有一條,這個(gè)時(shí)候,就右 擊索引,點(diǎn)擊編輯勾選唯一性,在列上面去掉一個(gè),從上往下第一個(gè)開始,但是 必須記住他的名字,最好寫下來,這時(shí)候,你會發(fā)現(xiàn)錯(cuò)誤信息里面的 ID 換成了 另外一個(gè)數(shù)字, 繼續(xù)用 select 語句查詢該數(shù)字, 字段仍然是該表的第一個(gè)字段, 你會發(fā)現(xiàn)他有兩條, 仔細(xì)對比這兩條, 什么都是一樣的, 每一個(gè)字段的值都一樣, 這顯然不符合邏輯,用剛才添加的 id 記錄刪除一條,
語句如下: Delete tablename where id=
兩著任何一個(gè),刪除完后, 右擊恢復(fù)剛才被點(diǎn)掉的那一條列名,勾選上唯一性,點(diǎn)擊確定,則正常,回 到企業(yè)管理器,打開表設(shè)計(jì),設(shè)置主鍵。完成。 回到查詢分析器,
輸入 dbcc checktable
顯示正常,再次檢測數(shù)據(jù)庫,顯 示正常。刪除剛才增加的列,修復(fù)完成。 結(jié)論:修復(fù)這類數(shù)據(jù)表,別急著導(dǎo)出數(shù)據(jù),新建庫文件,這個(gè)應(yīng)該還不到那 一步,最好就是能這樣修復(fù),少動干戈,如果是主鍵重復(fù),你導(dǎo)出數(shù)據(jù),在把這 個(gè)錯(cuò)誤的數(shù)據(jù)倒進(jìn)來(這里假設(shè)能正常導(dǎo)入) ,表的錯(cuò)誤會依然存在。