top
Loading...
靠BCP恢復SQLServer2000數據庫

SQL Server 2000在很多企業、電子商務網站的信息化平臺得到了普遍的應用。可在日常運行中,因種種原因會造成SQL Server 2000運行出現故障,輕則出現“置疑”,重則數據庫系統崩潰。本文以圖示的方式,闡述某個大學的一次數據庫數據恢復過程。同時也詳細闡述了BCP實用工具的詳細用法,希望這個處理過程和處理方法能對大家有所啟示。

本文恢復數據使用PC環境如下:

1)Windows 2000 Server(簡體中文)+SP4

2)Microsoft SQL Server 2000企業版(簡體中文)+SP3a

故障現象

1)游泳館收費系統連接不上SQL Server 2000數據庫。

2)啟動SQL Server服務失敗。

3)打開企業管理器,啟動服務也是失敗(看不到數據庫樹目錄)。

要命的是當技術員發現問題,已經卸載SQL Server 2000后重新安裝過了,想利用master數據庫是不可能了。更要命的是,居然沒有2005年的備份數據庫,只有2004年6月的數據庫備份文件。

恢復嘗試

第一招:附加數據庫

拷貝SQL Server 2000數據文件zytk.mdf到d:recovery下。在企業管理器中,右鍵數據庫,選擇所有任務→附加數據庫。單擊瀏覽("...")按鈕選擇要附加的數據庫mdf文件d:recoveryzytk.mdf,發現日志文件是錯誤的(如圖1)。

此時拷貝zytk.ldf到d:recovery目錄下,再進行上述步驟,日志文件仍是錯誤(就是那個可惡的紅叉叉)。單擊確定按鈕,提示日志文件錯誤(如圖2和圖3)。

發現提示的日志文件路徑是D:Microsoft sql servermssql data zytk_log.ldf。于是在D盤建立D:Microsoft sql servermssqldata目錄,并將zytk.mdf拷貝這個目錄下。繼續嘗試上述附加數據庫步驟,日志文件的路徑已經變化,仍舊沒能附加數據庫成功(錯誤1813)(如圖4與圖1相比)。



第二招:用T-SQL附加數據庫

在查詢分析器中執行SQL腳本

use master

EXEC sp_attach_db "ZYTK", "D:Microsoft sql servermssqldataZYTK.mdf","D:Microsoft sql servermssqldataZYTK_log.ldf"

查詢分析器提示:

服務器:消息5105,級別16,狀態4,行1

設備激活錯誤。物理文件名 'D:Microsoft sql servermssql dataZYTK_log.ldf' 可能有誤。

將D:recovery目錄下zytk.mdf改名zytk-old.mdf。在企業管理器中新建數據庫zytk,選擇數據庫文件路徑為D:recoveryZYTK_Data.MDF,日志文件路徑為D:recoveryZYTK_ log.LDF。在企業管理器中,右鍵停止,以便停止SQL Server服務。待SQL Server服務停止后將D:recoveryzytk.mdf改名zytk_data-new.mdf,同時將zytk-old.mdf改名為zytk_data.mdf,在企業管理器中啟動SQL Server服務。數據庫ZYTK將會置疑。

在查詢分析器中執行SQL腳本:

Use master

select * from SysDatabases

where name='ZYTK'

看到數據庫的status=1073741840,下面我們的目標是要將這個值修改到32768(緊急模式)再到16(假正常模式,這是我在這個故障處理中的叫法)。

缺省情況下,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的錯誤。

作者:http://www.zhujiangroad.com
來源:http://www.zhujiangroad.com
北斗有巢氏 有巢氏北斗