PRB:新增以偵測未回報 I/O 問題的 SQL Server 診斷

文章翻譯 文章翻譯
文章編號: 826433 - 檢視此文章適用的產品。
全部展開 | 全部摺疊

在此頁中

徵狀

如果作業系統、驅動程式或硬體問題引發 Lost Write 情況或 Stale Read 情況,您可能會看到與資料完整性相關的錯誤訊息,例如錯誤 605、823、3448。您可能會收到類似下列範例的錯誤訊息:
2003-07-24 16:43:04.57 spid63 Getpage:bstat=0x9, sstat=0x800, cache
2003-07-24 16:43:04.57 spid63 pageno is/should be: (2003-07-24 16:43:04.57 spid63 頁數是/應是:)objid is/should be: (objid 是/應是:)
2003-07-24 16:43:04.57 spid63 (1:7040966)/(1:7040966) 2093354622/2039782424
2003-07-24 16:43:04.57 spid63 ...IAM indicates that page is allocated to this object (IAM 表示該分頁已配置到此物件)
2003-07-24 16:52:37.67 spid63 錯誤:605,重要性:21,狀態:1
2003-07-24 16:52:37.67 spid63 Attempt to fetch logical page (1:7040966) in database 'pubs' belongs to object 'authors', not to object 'titles'.. (2003-07-24 16:52:37.67 spid63 嘗試在屬於物件 authors 而非物件 titles 的資料庫 pubs 擷取邏輯分頁 (1:7040966)..)
2003-07-24 16:52:40.99 spid63 錯誤:3448,重要性:21,狀態:1
2003-07-24 16:52:40.99 spid63 Could not undo log record (63361:16876:181), for transaction ID (0:159696956), on page (1:7040977), database 'pubs' (database ID 12). (2003-07-24 16:52:40.99 spid63 無法復原資料庫 pubs (資料庫編號 12) 分頁 (1:7040977) 上交易編號 (0:159696956) 的記錄 (63361:16876:181))分頁資訊:LSN = (63192:958360:10), type = 2. Log information: (LSN = (63192:958360:10), type = 2. 記錄資訊:)OpCode = 2, context 1..
2003-07-09 14:31:35.92 spid66 錯誤:823,重要性:24,狀態:2
2003-07-09 14:31:35.92 spid66 I/O error (bad page ID) detected during read at offset 0x00000016774000 in file 'h:\sql\MSSQL\data\tempdb.mdf'.. (2003-07-09 14:31:35.92 spid66 在讀取檔案 h:\sql\MSSQL\data\tempdb.mdf 位移 0x00000016774000 時偵測到 I/O 錯誤 (錯誤的分頁編號)..)

解決方案

Service Pack 資訊

如果要解決這個問題,請取得 Microsoft SQL Server 2000 的最新版 Service Pack。如需詳細資訊,請按一下下面的文件編號,檢視「Microsoft 知識庫」中的文件:
290211 如何取得最新版 SQL Server 2000 Service Pack

組建資訊

Microsoft 已發行一項 SQL Server 組建,導入擴充追蹤功能。這些功能是設計來協助您疑難排解<徵狀>一節所述的錯誤訊息。如果您並不認為發生了與作業系統或硬體相關的問題,可不必套用此組建。

此組建的英文版具有下列表格中所列的檔案屬性 (或更新)。這些檔案的日期和時間是以 Coordinated Universal Time (UTC) 表示。當您檢視檔案資訊時,它會轉換為當地時間。如果要查看 UTC 與當地時間的差異,請使用 [控制台] 中 [日期和時間] 工具的 [時區] 索引標籤。
摺疊此表格展開此表格
日期時間版本大小檔名
31-May-200318:452000.80.818.078,400bytesConsole.exe
25-Jun-200301:012000.80.818.033,340bytesDbmslpcn.dll
25-Apr-200302:12786,432bytesDistmdl.ldf
25-Apr-200302:122,359,296bytesDistmdl.mdf
30-Jan-200301:55180bytesDrop_repl_hotfix.sql
23-Jun-200322:402000.80.837.01,557,052bytesDtsui.dll
23-Jun-200322:402000.80.837.0639,552bytesDtswiz.dll
24-Apr-200302:51747,927bytesInstdist.sql
03-May-200301:561,581bytesInst_repl_hotfix.sql
08-Feb-200306:402000.80.765.090,692bytesMsgprox.dll
01-Apr-200302:071,873bytesOdsole.sql
05-Apr-200301:462000.80.800.062,024bytesOdsole70.dll
07-May-200320:412000.80.819.025,144bytesOpends60.dll
02-Apr-200321:482000.80.796.057,904bytesOsql.exe
02-Apr-200323:152000.80.797.0279,104bytesPfutil80.dll
22-May-200322:5719,195bytesQfe469571.sql
11-Jul-200317:041,084,147bytesReplmerg.sql
04-Apr-200321:532000.80.798.0221,768bytesReplprov.dll
08-Feb-200306:402000.80.765.0307,784bytesReplrec.dll
11-Jul-200316:561,085,925bytesReplsys.sql
01-Jun-200301:012000.80.818.0492,096bytesSemobj.dll
31-May-200318:272000.80.818.0172,032bytesSemobj.rll
29-May-200300:29115,944bytesSp3_serv_uni.sql
01-Jun-200301:012000.80.818.04,215,360bytesSqldmo.dll
07-Apr-200317:4425,172bytesSqldumper.exe
19-Mar-200318:202000.80.789.028,672bytesSqlevn70.rll
02-Jul-200300:182000.80.834.0180,736bytesSqlmap70.dll
08-Feb-200306:402000.80.765.057,920bytesSqlrepss.dll
01-Aug-200300:502000.80.847.07,594,065bytesSqlservr.exe
25-Jul-200321:442000.80.845.0590,396bytesSqlsort.dll
08-Feb-200306:402000.80.765.045,644bytesSqlvdi.dll
25-Jun-200301:012000.80.818.033,340bytesSsmslpcn.dll
01-Jun-200301:012000.80.818.082,492bytesSsnetlib.dll
01-Jun-200301:012000.80.818.025,148bytesSsnmpn70.dll
01-Jun-200301:012000.80.818.0158,240bytesSvrnetcn.dll
31-May-200318:592000.80.818.076,416bytesSvrnetcn.exe
30-Apr-200323:522000.80.816.045,132bytesUms.dll
02-Jul-200300:192000.80.834.098,816bytesXpweb70.dll

注意 由於檔案相依性,因此包含這些檔案的最新版 Hotfix 或功能也可能包含其他檔案。

Microsoft 已確認在少數較大的 I/O 流量下,某些硬體平台可能會傳回 Stale Read。如果擴充的診斷顯示可能發生 Stale Read/Lost Write 情況,請連絡您的硬體供應商以立即追蹤,並使用 SQLIOStress 公用程式進行測試。

狀況說明

Microsoft 已確認本篇文章<適用於>一節所列之 Microsoft 產品確實有上述問題。

這個問題已經在 Microsoft SQL Server 2000 Service Pack 4 中優先獲得修正。

其他相關資訊

如果您收到任何<徵狀>一節中所提及的錯誤訊息,且無法使用如實體磁碟機錯誤般的事件來說明,請檢查 SQL Server、作業系統、驅動程式及硬體中任何已知的問題。已新增其他 SQL Server 診斷至此組建,以協助偵測與 I/O 相關的外部問題。其他診斷並試圖提供有關下列兩種情況的資訊:
  • Lost Write:成功呼叫 WriteFile API,但即使 SQL Server 收到寫入成功的訊息,作業系統、驅動程式或快取控制器卻並未正確將資料排清到實體媒體。
  • Stale Read:成功呼叫 ReadFile API,但作業系統、驅動程式或快取控制器卻不正確地傳回舊版的資料。
例如,Microsoft 已確認下列實例:WriteFile API 呼叫傳回,表示成功,但緊接著成功地對相同資料區塊所進行的讀取卻傳回較舊的資料,包含應該是儲存於硬體讀取快取的資料。有時候,因為讀取快取有問題,就會發生此問題。在其他的案例中,寫入資料通常不會實際寫入至實體磁碟機。

如果要啟用其他診斷以檢查這類型的問題,SQL Server 已新增追蹤旗標 818。您可以在執行 SQL Server 的電腦中,指定追蹤旗標 818 為啟動參數 -T818,或可以執行下列陳述式:
DBCC TRACEON(818, -1)

追蹤旗標 818 會啟用記憶體內部的環狀緩衝區,用以追蹤由執行 SQL Server 的電腦所執行的 2,048 個最後成功寫入的操作,不包含排序與工作檔案 I/O。當發生如錯誤 605、823 或 3448 的錯誤時,則會比較傳入緩衝區記錄的序號 (LSN) 值與最近的寫入清單。如果在讀取操作時所擷取的 LSN 比寫入操作時所指定的 LSN 還舊,則會在 SQL Server 錯誤記錄檔中記錄新的錯誤訊息。大部分發生的 SQL Server 寫入操作都是檢查點或延遲寫入。延遲寫入是使用非同步 I/O 的背景工作。環狀緩衝區的實作是少量的,因此對系統效能的影響可輕易忽略。

下列訊息顯示 SQL Server 並未從 WriteFile API 呼叫或 ReadFile API 呼叫中收到錯誤。然而,當檢查 LSN 時,值卻不正確:
SQL Server has detected an unreported OS/hardware level read or write problem on Page (1:75007) of database 12 (SQL Server 已偵測到在資料庫 12 的分頁 (1:75007) 中,未回報的作業系統/硬體層級的讀取或寫入問題)
LSN returned (63361:16876:181), LSN expected (63361:16876:500) (已傳回 LSN (63361:16876:181),預期 LSN (63361:16876:500))
Contact the hardware vendor and consider disabling caching mechanisms to correct the problem (請連絡硬體供應商及考慮停用快取機制,以修正問題)
此時,若非讀取快取包含了較舊版的分頁,就是資料並未正確寫入至實體磁碟機。不管是任一種狀況 (Lost Write 或 Stale Read),SQL Server 都會回報作業系統、驅動程式或硬體層級發生了外部問題。

如果嘗試復原發生錯誤 605 或錯誤 823 的交易時發生了錯誤 3448,則執行 SQL Server 的電腦會自動關閉資料庫,然後嘗試開啟與復原資料庫。發生錯誤 605 或 Error 823 的第一個分頁會被視為錯誤的分頁,且執行 SQL Server 的電腦會記錄分頁編號。在復原期間 (在復原階段前) 讀取到錯誤的分頁編號時,有關頁首的主要詳細資訊會記錄於 SQL Server 錯誤記錄檔。這項動作相當重要,因為它可以協助分辨 Lost Write 和 Stale Read 案例。

您可能會在 Stale Read 實例中看到下列兩種常見的行為:
  • 如果資料庫檔案先關閉然後開啟,則會在復原期間傳回正確且最新的寫入資料。
  • 當發行檢查點,並執行資料庫中的 DBCC DROPCLEANBUFFERS 陳述式 (以從記憶體中移除所有資料庫分頁),然後執行 DBCC CHECKDB 陳述式,就會傳回最新的寫入資料。
在先前段落中所提及的行為會表示讀取快取的問題,通常停用它們就可以解決問題。在先前段落中所概述的行為,通常會強制讓快取無效,且如果讀取成功就表示實體媒體已正確更新。即使是在強制排清快取機制後,當讀回的分頁仍是較舊版的資料時,就會發生 Lost Write 行為。

有時候,問題不單只發生於硬體快取中。也可能是篩選器驅動程式的問題。在這樣的情況下,請檢查您的軟體,包含備份公用程式和防毒軟體,然後查看篩選器驅動程式是否有問題。

Microsoft 也已注意到不符合錯誤 605 或錯誤 823 的準則,但是由相同的 Stale Read 或 Lost Write 活動所引起的情況。在某些例子中,分頁似乎已更新兩次,LSN 值卻相同。如果物件編號分頁編號是正確的 (分頁已配置到物件),然後在分頁上做變更,且排清到磁碟機中,就可能會發生此行為。下一個擷取的分頁會傳回較舊的影像,然後建立第二個變更。SQL Server 交易記錄會顯示分頁已使用相同的 LSN 值更新兩次。當嘗試復原交易記錄次序,或發生資料一致性問題,例如外部索引鍵失敗或遺失資料項目時,此動作會造成問題。下列錯誤訊息說明此情況的範例:
錯誤:3456,重要性:21,狀態:1 Could not redo log record (276666:1664:19), for transaction ID (0:825853240), on page (1:1787100), database 'authors' (7). (1 無法復原在資料庫 authors (7) 分頁 (1:1787100) 上交易編號 (0:825853240) 的記錄 (276666:1664:19))分頁:LSN = (276658:4501:9), type = 1. 記錄:OpCode = 4, context 2, PrevPageLSN:(275565:3959:31)..

下列清單詳細概述數個實例:
  • LSN Sequence		Action
    1			Checkpoint
    2			Begin Transaction
    3			Table created or truncated
    4			Inserts (Pages allocated)
    5			Newly allocated page written to disk by Lazy Writer
    6			Select from table – Scans IAM chain, newly allocated page read back from disk (LRU | HASHED = 0x9 in getpage message), encounters Error 605 - Invalid Object ID
    7			Rollback of transaction initiated
    
  • LSN Sequence		Action
    1			Checkpoint
    2			Begin Transaction
    3			Page Modification
    4			Page written to disk by Lazy Writer
    5			Page read in for another modification (stale image returned)
    6			Page Modified for a second time but because of stale image does not see first modification 
    7			Rollback – Fails – Transaction Log shows two different log records with the same PREV LSN for the page
    
SQL Server 的 sort 運算子會執行 I/O 活動,主要來回於 tempdb 資料庫。這些 I/O 作業與緩衝區 I/O 作業類似,然而,已將它們設計為使用讀取重試邏輯,以嘗試解決類似的問題。在本文中說明的其他診斷並未適用於這些 I/O 作業。

Microsoft 已注意到下列排序讀取失敗的根本原因,通常都是 Stale Read 或 Lost Write:
2003-04-01 20:13:31.38 spid122 SQL Server 判斷提示:檔案:<p:\sql\ntdbms\storeng\drs\include\record.inl>, line=1447 Failed Assertion = 'm_SizeRec > 0 && m_SizeRec <= MAXDATAROW'.

2003-03-29 09:51:41.12 spid57 Sort read failure (bad page ID). pageid = (0x1:0x13e9), dbid = 2, file = e:\program files\Microsoft SQL Server\mssql\data\tempdb.mdf. Retrying. (2003-03-29 09:51:41.12 spid57 排序讀取失敗 (錯誤的分頁編號)。分頁編號 = (0x1:0x13e9),dbid = 2,檔案 = e:\program files\Microsoft SQL Server\mssql\data\tempdb.mdf。正在重新嘗試)

2003-03-29 09:51:41.13 spid57 錯誤:823,重要性:24,狀態:7
2003-03-29 09:51:41.13 spid57 I/O error (bad page ID) detected during read at offset 0x00000016774000 in file 'h:\sql\MSSQL\data\tempdb.mdf'.. (2003-03-29 09:51:41.13 spid57 在讀取檔案 e:\program files\Microsoft SQL Server\mssql\data\tempdb.mdf 位移 0x000000027d2000 時偵測到 I/O 錯誤 (錯誤的分頁編號)..)

* 00931097 Module(sqlservr+00531097) (utassert_fail+000002E3)
* 005B1DA8 Module(sqlservr+001B1DA8) (RecBase::Resize+00000091)
* 00407EE7 Module(sqlservr+00007EE7) (RecBase::LocateColumn+00000012)
* 00852520 Module(sqlservr+00452520) (mergerow+000000A4)
* 008522B3 Module(sqlservr+004522B3) (merge_getnext+00000285)
* 0085207D Module(sqlservr+0045207D) (mergenext+0000000D)
* 004FC5FB Module(sqlservr+000FC5FB) (getsorted+00000021)

遇到這類錯誤的客戶,通常都是將 tempdb 移至非快取的本機磁碟機,或是停用讀取快取機制來解決問題。

因為 Stale Read 或 Lost Write 會導致未預期的資料存放,並可能發生各種行為。產生的問題可能是資料遺失,但某些更常見的資料遺失結果則是索引損毀,例如錯誤 644 或錯誤 625:
Error 644 Severity Level 21 Message Text Could not find the index entry for RID '%.*hs' in index page %S_PGID, index ID %d, database '%.*ls'. (錯誤 644 重要性層級 21 訊息文字 找不到索引頁 %S_PGID、索引頁 ID %d、資料庫 %.*ls 中 RID %.*hs 的索引項目)
Error 625 Severity Level 21 Message Text Cannot retrieve row from page %S_PGID by RID because the slotid (%d) is not valid. (錯誤 625 重要性層級 21 訊息文字 無法使用 RID 從分頁 %S_PGID 擷取資料列,因為 Slotid (%d) 無效)
某些客戶在執行資料列計數的活動後,回報遺失資料列。此問題的發生原因為 Lost Write。也許分頁應該連結至叢集索引頁鏈結。如果寫入實際上已遺失,資料也會遺失。

重要 如果您遭遇任一種行為,或如果您認為發生伴隨停用快取機制而來的類似問題,Microsoft 強烈建議您取得 SQL Server 最新的更新與最新的 SQL Server I/O Stress Simulator。Microsoft 也非常鼓勵您針對作業系統及與其相關設定執行嚴格的檢查。

如需詳細資訊,請按一下下面的文件編號,檢視「Microsoft 知識庫」中的文件:
231619 How to use the SQLIOStress utility to stress a disk subsystem such as SQL Server

屬性

文章編號: 826433 - 上次校閱: 2006年3月29日 - 版次: 6.2
這篇文章中的資訊適用於:
  • Microsoft SQL Server 2000 Service Pack 3
關鍵字:?
kbqfe kbhotfixserver kbbug kbhardware kbfilter kbdriver kbdatabase kbsysadmin kbinfo KB826433
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。

提供意見

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com