SQL 2000 - Could not continue scan with NOLOCK due to data movement解決之方法

tolywang發表於2010-05-01

http://www.cnblogs.com/dimg/archive/2005/11/21/281319.aspx  

上週末,利用沒有使用系統的空當,本人將公司的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 .
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,檢查成功,沒有錯誤.

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/35489/viewspace-661743/,如需轉載,請註明出處,否則將追究法律責任。

相關文章