原始位置:http://soft.zdnet.com.cn/software_zone/2007/0918/512412.sHtml
BCP恢復SQL Server 2000數據庫二(1)
缺省情況下,SQL Server不允許修改status值。直接作update,系統提示服務器: 消息 259,級別 16,狀態 2,行 1未啟用對系統目錄的特殊更新。系統管理員必須重新配置 SQL Server 以允許這種操作。
所以先執行SQL腳本,讓SQL Server允許我們修改status值:
sp_configure ''allow updates'', 1
RECONFIGURE WITH OVERRIDE
修改status到32768(緊急模式),執行SQL腳本:
update SysDatabases
set status=32768
where name=''zytk''
在查詢分析器中執行SQL腳本,檢查數據庫完整性。
dbcc checkdb (''ZYTK'') with ALL_ERRORMSGS
執行結果有很多錯誤(具體執行結果見03CheckDB-ZYTK結果.txt),跟筆者估計一致,數據庫的索引出了大問題。下面摘錄其中一個錯誤:
對象 ''cw_Check_Detail'' 有 0 行,這些行位於 0 頁中。
服務器: 消息 8936,級別 16,狀態 1,行 1
表錯誤: 對象 ID 181575685,索引 ID 1。B 樹鏈的鏈接不匹配。(1:4987)->next = (1:2601),但 (1:2601)->Prev = (1:4947)。
在查詢分析器中執行SQL腳本,將數據庫ZYTK的status修改為16:
update SysDatabases
set status=16
where name=''zytk''
刷新數據庫,ZYTK(緊急模式)轉變為ZYTK。注意此時不能重新啟動SQL Server服務!否則數據庫ZYTK的狀態還會變成置疑。這時,數據庫處理算是成功一半!這個假正常模式(我的叫法)還是不能做數據庫備份的。否則會提示如圖5的錯誤。
BCP恢復SQL Server 2000數據庫二(2)
不過這時可以看到那些可恨又可愛的表及表中的數據了。
在d:recovery下建立目錄BCP,再在d:recoveryBCP下建立error目錄。利用SQL Server數據庫的SysObjects表可以生成批量的BCP命令:
從數據庫中各表導出所有表的數據:
Use %1
Select ''BCP %1..'' + name +
'' out d:recoveryBCP'' +name + ''.txt -c -S%2 -U%3 -P%4 >D:recoveryBCPerror out_''+name+''.txt'' from sysobjects where type = ''U'' order by name