SQLserver201*數(shù)據(jù)庫修復辦法總結
SQLserver201*數(shù)據(jù)庫修復辦法總結
Praymid戴華倪
總結步驟如下:1、檢測數(shù)據(jù)庫,
使用命令(Dbcccheckdb)
拿到數(shù)據(jù)庫后附加到本地SQLserver使其運行,打開企業(yè)管理器,查看它。同時打開查詢分析器,在里面輸入
Dbcccheckdb檢測數(shù)據(jù)庫命令然后回車即可以看到數(shù)據(jù)庫的分析資料看到問題,
評注:拿到問題先不要盲目的卸載SQLServer,本次因為新手,上手后就把數(shù)據(jù)庫卸載,這樣就耗費了一天的時間,過沒有任何作用,測試服務器的完整性可以拿一個好的數(shù)據(jù)庫做對比,自己可以建一個“test”,如果測試數(shù)據(jù)庫運行正常,則不需要對服務器做任何改動。千萬不要改動系統(tǒng),麻煩會更大。
提示:錯誤會以紅色顯示。2、簡單修復:命令:dbcccheckdb輸入以下兩句嘗試修復。
DBCCCHECKDB("AIS201*01201*2605",repair_allow_data_loss)DBCCCHECKDB("AIS201*01201*2605",repair_rebuild)
不管他究竟哪里錯了,先用這兩句試試一般的索引系統(tǒng)文件丟失,SQLserver都可以解決這個問題,基本就差不多了。但是對于主鍵索引損壞,這個命令基本修不好,所以對一個滿身是傷的數(shù)據(jù)庫,他可以修復70%。
注:修復時系統(tǒng)提示必須要在單用戶模式下才可以生效,用戶可以去企業(yè)管理器,對要修理的數(shù)據(jù)庫:右擊屬性選項限制訪問單用戶。也可以使用以下語句實現(xiàn):
ALTERDATABASEAIS201*04201*1143SETsingle_USERGO改為單用戶
ALTERDATABASEAIS201*04201*1143SETMULTI_USERGO改為多用戶。
繼續(xù)使用dbcccheckdb檢測,如果繼續(xù)報錯。再次運行:
DBCCCHECKDB("DataBasename")withNO_INFOMSGS,PHYSICAL_ONLY然后再運行:
DBCCCHECKDB("DataBasename",repair_allow_data_loss)WITHTABLOCK再次運行:DBCCCHECKDB("DBname")系統(tǒng)顯示修復成功,說明本次問題主要由索引等數(shù)據(jù)庫系統(tǒng)本身問題引起,這樣的修復可能會導致數(shù)據(jù)丟失,但是絕對不會是大批丟失,基本沒有影響。
2、檢測表:命令:dbccchecktable(‘tablename’)
接上述檢測提示:我們可以看到一個id號,這個基本就是這個錯誤的表在系統(tǒng)表“sysobjects”里面的注冊信息。
輸入如下語句即可以看見:
select*fromsysobjectswhereid=1205579333(錯誤提示號碼)接下來檢測這張表究竟是什么問題。輸入:dbccchecktable(‘tablename’)
接下來將會得到一些錯誤提示,基本上就是檢測表的時候那些,提示什么B樹錯誤,父節(jié)點,子節(jié)點錯誤,這些都別管,因為這個可能就是索引引起的錯誤:
嘗試用下列語句修復:
DBCCCHECKtable("Tablename",repair_rebuild)執(zhí)行完后查看提示:如果出現(xiàn)下面的提示
CREATEUNIQUEINDEX終止,因為發(fā)現(xiàn)了索引ID1的重復鍵。最重要的主鍵為"3"。這里基本上就可以確定就是索引出的問題,而且數(shù)據(jù)表沒有被修復的可能很可能就是內(nèi)容產(chǎn)生的問題。根據(jù)提示,我們得出的結論就是主鍵重復。
這是我們使用select查詢語句是看不到的甚至表里面打開也沒有反映。此時,關閉查詢分析器,打開企業(yè)管理器,找到那個數(shù)據(jù)表,然后右擊選擇設計表,選擇主鍵,右擊,取消主鍵,回到查詢分析器,找到該表,右擊選擇索引,這時候表以前所有的索引都能看見了,但是上面的唯一性選項很明顯沒有了,然后給表里面添加一個新的字段,字段名id需要生成編號:
語句如下:altertablet_itemaddidintegeridentity該字段用完后刪除,語句如下:altertablet_itemdropcolumnid
在查詢分析器這里右擊索引,選擇唯一性選項,然后點擊確定,系統(tǒng)會提示重復鍵,和最重要的主鍵ID,根據(jù)id數(shù)字,進行查詢
如提示最重要的鍵值是3則,
select*fromt_itemwherefitemid=3
有時候查詢的結果,是合法的,比如這個3可能只有一條,這個時候,就右擊索引,點擊編輯勾選唯一性,在列上面去掉一個,從上往下第一個開始,但是必須記住他的名字,最好寫下來,這時候,你會發(fā)現(xiàn)錯誤信息里面的ID換成了另外一個數(shù)字,繼續(xù)用select語句查詢該數(shù)字,字段仍然是該表的第一個字段,你會發(fā)現(xiàn)他有兩條,仔細對比這兩條,什么都是一樣的,每一個字段的值都一樣,這顯然不符合邏輯,用剛才添加的id記錄刪除一條,語句如下:
Deletetablenamewhereid=兩著任何一個,刪除完后,
右擊恢復剛才被點掉的那一條列名,勾選上唯一性,點擊確定,則正常,回到企業(yè)管理器,打開表設計,設置主鍵。完成。
回到查詢分析器,輸入dbccchecktable顯示正常,再次檢測數(shù)據(jù)庫,顯示正常。刪除剛才增加的列,修復完成。
結論:修復這類數(shù)據(jù)表,別急著導出數(shù)據(jù),新建庫文件,這個應該還不到那一步,最好就是能這樣修復,少動干戈,如果是主鍵重復,你導出數(shù)據(jù),在把這個錯誤的數(shù)據(jù)倒進來(這里假設能正常導入),表的錯誤會依然存在。
擴展閱讀:SQL Server 201*數(shù)據(jù)庫LDF損壞,只有mdf的恢復
SQLServer201*數(shù)據(jù)庫LDF損壞,只有mdf的恢復
SQLServer201*數(shù)據(jù)庫文件遭到破壞的現(xiàn)象經(jīng)常出現(xiàn),數(shù)據(jù)庫出錯是否可以修復呢?答案是可以的,本日志以一個sqlserver201*數(shù)據(jù)庫,數(shù)據(jù)庫日志文件ldf損壞了,mdf正常,數(shù)據(jù)庫附加失敗的修復方法總結一下,數(shù)據(jù)庫數(shù)據(jù)恢復在很多時候比較復雜,當數(shù)據(jù)庫存在大量錯誤的時候,使用DBCC修復也是不可以的,需要拆解數(shù)據(jù)庫來搶救重要的數(shù)據(jù),下面是較為常見的一種SQLServer201*數(shù)據(jù)庫修復方式:
1)先及時把原來的數(shù)據(jù)庫文件(如test.mdf)備份到其他地方2)停掉服務器3)刪除這個test.mdf
4)重新建立一個test同名數(shù)據(jù)庫
5)刪除這個新建立的test數(shù)據(jù)庫的test.ldf文件,并用開始備份好的test.mdf文件覆蓋這個新建立的test.mdf文件
6)啟動數(shù)據(jù)庫服務器。此時會看到數(shù)據(jù)庫test的狀態(tài)為“置疑”。這時候不能對此數(shù)據(jù)庫進行任何操作。.設置數(shù)據(jù)庫允許直接操作系統(tǒng)表。此操作可以在SQLServerEnterpriseManager里面選擇數(shù)據(jù)庫服務器,按右鍵,選擇“屬性”,在“服務器設置”頁面中將“允許對系統(tǒng)目錄直接修改”7)設置test為緊急修復模式
updatesysdatabasessetstatus=-32768wheredbid=DB_ID("test")
此時可以在SQLServerEnterpriseManager里面看到該數(shù)據(jù)庫處于“只讀\\置疑\\脫機\\緊急模式”可以看到數(shù)據(jù)庫里面的表,但是僅僅有系統(tǒng)表
8下面執(zhí)行真正的恢復操作,重建數(shù)據(jù)庫日志文件
dbccrebuild_log("test","C:\\ProgramFiles\\MicrosoftSQLServer\\MSSQL\\Data\\test_log.ldf")
執(zhí)行過程中,如果遇到下列提示信息:
服務器:消息5030,級別16,狀態(tài)1,行1未能排它地鎖定數(shù)據(jù)庫以執(zhí)行該操作。
DBCC執(zhí)行完畢。如果DBCC輸出了錯誤信息,請與系統(tǒng)管理員聯(lián)系。
說明您的其他程序正在使用該數(shù)據(jù)庫,如果剛才您在F步驟中使用SQLServerEnterpriseManager打開了test庫的系統(tǒng)表,那么退出SQLServerEnterpriseManager就可以了。
正確執(zhí)行完成的提示應該類似于:
警告:數(shù)據(jù)庫"test"的日志已重建。已失去事務的一致性。應運行DBCCCHECKDB以驗證物理一致性。將必須重置數(shù)據(jù)庫選項,并且可能需要刪除多余的日志文件。
DBCC執(zhí)行完畢。如果DBCC輸出了錯誤信息,請與系統(tǒng)管理員聯(lián)系。
此時打開在SQLServerEnterpriseManager里面會看到數(shù)據(jù)庫的狀態(tài)為“只供DBO使用”。此時可以訪問數(shù)據(jù)庫里面的用戶表了。
9.驗證數(shù)據(jù)庫一致性dbcccheckdb("test")10.設置數(shù)據(jù)庫為正常狀態(tài)
sp_dboption"test","dbouseonly","false"
如果沒有出錯,那么恭喜,現(xiàn)在就可以正常的使用恢復后的數(shù)據(jù)庫啦。11最后一步,我們要將步驟E中設置的“允許對系統(tǒng)目錄直接修改”一項恢復;
友情提示:本文中關于《SQLserver201*數(shù)據(jù)庫修復辦法總結》給出的范例僅供您參考拓展思維使用,SQLserver201*數(shù)據(jù)庫修復辦法總結:該篇文章建議您自主創(chuàng)作。
來源:網(wǎng)絡整理 免責聲明:本文僅限學習分享,如產(chǎn)生版權問題,請聯(lián)系我們及時刪除。