SQL Server 2000 錯誤信息Could not continue scan with NOLOCK due to data movement解決之方法

上周末,利用沒有使用系統的空當,本人將公司的eHR資料庫從一台Server移到另一台Server上,(由于DB文件過大,本人采用一分割合并工具將DB 文件先在源服務器上分割成小文件,再在目的服務器上進行合并).順利移過之后,經過簡單的測試,加上這個動作以前也做過,應該不會有問題,本人就回家了.

今早一來查看系統使用狀況,發現SQL Job中的Integrity Check 出現了錯誤,手工執行這個Job還是出現,因為這在以前的環境沒有發生過這樣的情況,但是系統在使用過程中也沒有用戶發現異常,所以我就對這個錯誤沒有做進一步的分析.10分鐘后,其中一個開發程序員就說,在調用一個存儲過程時出現一個莫名其妙的錯誤,說以前從來沒有見過,而且在測試環境運行OK,當時我就納悶,看了一下錯誤信息:
Could not continue scan with NOLOCK due to data movement

用Event Viewer查看事件,
Event Type: Error
Event Source: MSSQLSERVER
Event Category: (2)
Event ID: 17052
Date:  2005-11-21
Time:  下午 12:28:48
User:  CMMSG-GLBHR\Administrator
Computer: CMMSG-GLBHR
Description:
Error: 823, Severity: 24, State: 2
I/O error (torn page) detected during read at offset 0x000000491b6000 in file 'E:\DB\eHR2_Data.MDF'.

For more information, see Help and Support Center at http://go.microsoft.com/fwlink/events.asp.
Data:
0000: 37 03 00 00 18 00 00 00   7.......
0008: 0c 00 00 00 43 00 4d 00   ....C.M.
0010: 4d 00 53 00 47 00 2d 00   M.S.G.-.
0018: 47 00 4c 00 42 00 48 00   G.L.B.H.
0020: 52 00 00 00 05 00 00 00   R.......
0028: 65 00 48 00 52 00 32 00   e.H.R.2.
0030: 00 00                     ..     

怎么會出現I/O錯誤,難道是硬件問題,這台服務器可是1個月之前才剛從市面上買來的.在網上轉了一大圈之后,發現居然有一位網友發生了跟我同樣的異常,并在IT168上撰寫了一篇長達3頁的文章說如何解決這個問題.因為系統正在使用,且采用他的方案需要耗時較長,而且成功性也沒有100%的保証.
所以我就在找另外一個方法.

我采用的方法是,
1).在數據庫上執行DBCC  CHECKDB,按正常來講,執行完后在最后應顯示
CHECKDB found 0 allocation errors and 0 consistency errors in database 'eHR2'.
DBCC execution completed. If DBCC printed error messages, contact your system administrator.

如果有錯誤的話,找出錯誤的信息,當時我執行的時候就有7筆錯誤信息,不過這7筆錯誤信息都是指向同一個表(姑且命名為表A),而且表A里面的數據量非常大.

2),利用中午休息時間,將系統暫停,將表A里面的數據用DTS導入到另外一個表(表B),這個時候發現錯誤,提示
I/O error (torn page) detected during read at offset 0x000000491b6000 in file 'E:\DB\eHR2_Data.MDF'.這同Event Viewer里面記錄的錯誤信息是一模一樣的.既然出錯了,所以我采用另外一種方式來將表A里的數據移到另一表中,采用INSERT INTO 語句直接插入方式,關鍵的地方出來了,這個時候系統提示我不能寫入,Primary Key Duplicated Error,難道表B中已有數據,我打開表中,果然已經有數據,只不過是部分數據,這個時候我明白了,一定是這個表中有部分數據出現了問題,果不其然,我找到了出現問題的部分數據所在范圍.

3). 然后我所做的就是將出現問題的數據之外的數據全部導入到一個新表中,然后將出錯的表A刪除,再將新表ReName為表A.為了檢查是否成功,我再次執行DBCC CHECKDB,檢查成功,沒有錯誤.

posted @ 2005-11-21 14:22  大海胸懷  阅读(3414)  评论(0编辑  收藏  举报