PRB:为了检测未报告的 I/O 问题而新增 SQL 服务器诊断

文章翻译 文章翻译
文章编号: 826433 - 查看本文应用于的产品
展开全部 | 关闭全部

本文内容

症状

如果操作系统、驱动程序或者硬件问题导致出现写丢失或读取过时现象,您可能会看到与数据完整性相关的错误信息(例如错误 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:objid is/should be:
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
2003-07-24 16:52:37.67 spid63 Error:605, Severity:21, State: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:40.99 spid63 Error:3448, Severity:21, State: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).Page information:LSN = (63192:958360:10), type = 2. Log information:OpCode = 2, context 1..
2003-07-09 14:31:35.92 spid66 Error:823, Severity:24, State: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'..

解决方案

Service Pack 信息

若要解决此问题,请获取最新的 Microsoft SQL Server 2000 Service Pack。有关其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
290211 如何获取最新的 SQL Server 2000 Service Pack

版本信息

Microsoft 发布的一个 SQL Server 版本引入了扩展跟踪功能。这些功能旨在针对“症状”部分描述的错误信息帮助您进行疑难解答。如果您不认为出现的问题与操作系统或者与硬件有关,则可能不必使用此版本。

此版本的英语版具有下表中列出的文件属性(或更新的属性)。这些文件的日期和时间按协调通用时间 (UTC) 列出。当您查看文件信息时,该时间将转换为本地时间。要了解 UTC 与本地时间之间的时差,请使用“控制面板”中的“日期和时间”工具的“时区”选项卡。
日期           时间    版本                 大小             文件名
-------------------------------------------------------------------------
31-May-2003  18:45  2000.80.818.0      78,400 bytes  Console.exe      
25-Jun-2003  01:01  2000.80.818.0      33,340 bytes  Dbmslpcn.dll     
25-Apr-2003  02:12                    786,432 bytes  Distmdl.ldf
25-Apr-2003  02:12                  2,359,296 bytes  Distmdl.mdf
30-Jan-2003  01:55                        180 bytes  Drop_repl_hotfix.sql
23-Jun-2003  22:40  2000.80.837.0   1,557,052 bytes  Dtsui.dll        
23-Jun-2003  22:40  2000.80.837.0     639,552 bytes  Dtswiz.dll       
24-Apr-2003  02:51                    747,927 bytes  Instdist.sql
03-May-2003  01:56                      1,581 bytes  Inst_repl_hotfix.sql
08-Feb-2003  06:40  2000.80.765.0      90,692 bytes  Msgprox.dll      
01-Apr-2003  02:07                      1,873 bytes  Odsole.sql
05-Apr-2003  01:46  2000.80.800.0      62,024 bytes  Odsole70.dll     
07-May-2003  20:41  2000.80.819.0      25,144 bytes  Opends60.dll     
02-Apr-2003  21:48  2000.80.796.0      57,904 bytes  Osql.exe         
02-Apr-2003  23:15  2000.80.797.0     279,104 bytes  Pfutil80.dll     
22-May-2003  22:57                     19,195 bytes  Qfe469571.sql
11-Jul-2003  17:04                  1,084,147 bytes  Replmerg.sql
04-Apr-2003  21:53  2000.80.798.0     221,768 bytes  Replprov.dll     
08-Feb-2003  06:40  2000.80.765.0     307,784 bytes  Replrec.dll      
11-Jul-2003  16:56                  1,085,925 bytes  Replsys.sql
01-Jun-2003  01:01  2000.80.818.0     492,096 bytes  Semobj.dll       
31-May-2003  18:27  2000.80.818.0     172,032 bytes  Semobj.rll
29-May-2003  00:29                    115,944 bytes  Sp3_serv_uni.sql
01-Jun-2003  01:01  2000.80.818.0   4,215,360 bytes  Sqldmo.dll       
07-Apr-2003  17:44                     25,172 bytes  Sqldumper.exe    
19-Mar-2003  18:20  2000.80.789.0      28,672 bytes  Sqlevn70.rll
02-Jul-2003  00:18  2000.80.834.0     180,736 bytes  Sqlmap70.dll     
08-Feb-2003  06:40  2000.80.765.0      57,920 bytes  Sqlrepss.dll     
01-Aug-2003  00:50  2000.80.847.0   7,594,065 bytes  Sqlservr.exe     
25-Jul-2003  21:44  2000.80.845.0     590,396 bytes  Sqlsort.dll      
08-Feb-2003  06:40  2000.80.765.0      45,644 bytes  Sqlvdi.dll       
25-Jun-2003  01:01  2000.80.818.0      33,340 bytes  Ssmslpcn.dll     
01-Jun-2003  01:01  2000.80.818.0      82,492 bytes  Ssnetlib.dll     
01-Jun-2003  01:01  2000.80.818.0      25,148 bytes  Ssnmpn70.dll     
01-Jun-2003  01:01  2000.80.818.0     158,240 bytes  Svrnetcn.dll     
31-May-2003  18:59  2000.80.818.0      76,416 bytes  Svrnetcn.exe     
30-Apr-2003  23:52  2000.80.816.0      45,132 bytes  Ums.dll          
02-Jul-2003  00:19  2000.80.834.0      98,816 bytes  Xpweb70.dll
注意:由于存在文件依存关系,包含这些文件的最新修复程序或功能可能还包含其他一些文件。

Microsoft 已经确认,在极少数情况下,在 I/O 负载繁重时,某些硬件平台可能会返回过时的读取。如果补充的诊断信息指出可能发生了读取过时或写丢失现象,请联系您的硬件供应商,以便他们能够立即提供跟踪服务和使用 SQLIOStress 实用工具进行测试。

状态

Microsoft 已经确认这是在“适用于”一节中列出的 Microsoft 产品中存在的问题。

此问题最早在 Microsoft SQL Server 2000 Service Pack 4 中得到了解决。

更多信息

如果您收到“症状”部分提到的任何错误信息,且这些错误信息无法用物理驱动器故障之类的原因来解释,请检查是否存在任何已知的与 SQL Server、操作系统、驱动程序和硬件相关的问题。此版本增加了一些额外的 SQL Server 诊断功能以帮助检测与 I/O 相关的外部问题。增加的这些诊断功能尝试提供有关以下两种情况的信息:
  • 写丢失:成功调用了 WriteFile API,但是操作系统、某个驱动程序或者缓存控制器无法将数据正确刷新到物理媒体,即使 SQL Server 收到了写入成功通知。
  • 读取过时:成功调用了 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 比在写操作期间指定的更旧,就会在 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
LSN returned (63361:16876:181), LSN expected (63361:16876:500)
Contact the hardware vendor and consider disabling caching mechanisms to correct the problem
此时,或者此读取缓存包含页面的一个旧版本,或者数据未正确写入物理磁盘。无论是哪种情况(写丢失或者读取过时),SQL Server 都将报告操作系统、驱动程序或硬件层发生了一个外部故障。

当您尝试回滚一个发生了错误 605 或 823 的事务时,如果发生错误 3448,则运行 SQL Server 的计算机将自动关闭数据库并尝试打开和恢复该数据库。第一个发生错误 605 或错误 823 的页面将被认为是坏页,页 ID 由运行 SQL Server 的计算机保存。在读取此坏页 ID 的恢复过程中(在进行重做阶段之前),有关此页标题的重要详细信息被记录在 SQL Server 错误日志中。该操作很重要,因为它有助于分辨写丢失和读取过时这两种情况。

如果发生读取过时,您可能会看到以下两种常见情况:
  • 如果数据库文件关闭后又被打开,则在恢复期间可以得到正确的和最近写入的数据。
  • 如果您发出检查点并运行 DBCC DROPCLEANBUFFERS 语句(以便删除内存中的所有数据库页),然后对数据库运行 DBCC CHECKDB 语句,则将返回最近写入的数据。
上面的段落中提到的情况显示存在一个读取缓存问题,通常禁用读取缓存即可避免发生这些情况。上面的段落中概述的这些操作通常会强制缓存失效,而成功进行的读取显示物理媒体得到了正确更新。即使在强制刷新缓存机制后,如果读回的页面还是旧版本数据,则仍会发生写丢失问题。

有时,问题可能并非特定于某个硬件缓存,而可能是筛选驱动程序的问题。在这类情况下,请检查您的软件(包括备份实用工具和防病毒软件),然后查看该筛选驱动程序是否有问题。

Microsoft 还注意到了一些情况,这些情况虽然不符合错误 605 或错误 823 的标准,但同样是由读取过时行为或写丢失行为造成的。在某些情况下,一个页面会显示为更新了两次,但两次更新后的页面具有相同的 LSN 值。如果对象 ID页 ID 是正确的(页面已经分配给对象),在更改页面并将更改刷新到磁盘时,就可能发生此问题。下一次页检索将返回一个较旧的映像,然后进行第二次更改。SQL Server 事务日志显示此页被更新两次,但 LSN 值相同。当您尝试恢复一个事务日志序列时或存在数据一致性问题时(例如外键故障或缺少数据条目),此操作就会出现问题。下面的错误信息描述了这种情况的一个例子:
Error:3456, Severity:21, State:1 Could not redo log record (276666:1664:19), for transaction ID (0:825853240), on page (1:1787100), database 'authors' (7).Page:LSN = (276658:4501:9), type = 1. Log: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 的“排序”运算符主要是向 tempdb 数据库和从该数据库执行 I/O 活动。这些 I/O 操作与缓冲区 I/O 操作相似,但是,这些 I/O 操作已被设计为使用读取重试逻辑来尝试解决类似的问题。本文中介绍的附加诊断功能不适用于这些 I/O 操作。

Microsoft 已注意到下面的排序读取故障的根本原因通常是读取过时或写丢失:
2003-04-01 20:13:31.38 spid122 SQL Server Assertion:File:<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.13 spid57 Error:823, Severity:24, State:7
2003-03-29 09:51:41.13 spid57 I/O error (bad page ID) detected during read at offset 0x000000027d2000 in file 'e:\program files\Microsoft SQL Server\mssql\data\tempdb.mdf'..

* 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 移到一个非缓存本地驱动器,或者禁用读取缓存机制。

因为读取过时或写丢失造成不正常的数据存储,可能发生许多问题。问题可能显示为丢失数据,但是丢失数据造成的一些更常见的影响是索引崩溃,例如错误 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'.
Error 625 Severity Level 21 Message Text Cannot retrieve row from page %S_PGID by RID because the slotid (%d) is not valid.
某些客户曾报告在执行过行计数活动之后发现行丢失。出现此问题是因为发生了写丢失。也许该页应当链接到簇索引页链。如果写入操作发生了物理丢失,则数据也会丢失。

重要说明:如果您遇到了上述任何问题,或者您怀疑禁用缓存机制引起了类似问题,Microsoft 极力建议您获取 SQL Server 的最新升级版和最新的 SQL Server I/O Stress Simulator。Microsoft 还极力建议您严格检查您的操作系统和相关的配置。

有关其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
231619 如何使用 SQLIOStress 实用工具测试 SQL Server 之类的磁盘子系统的工作承受压力

属性

文章编号: 826433 - 最后修改: 2006年4月4日 - 修订: 6.1
这篇文章中的信息适用于:
  • Microsoft SQL Server 2000 Service Pack 3
关键字:?
kbinfo kbbug kbfilter kbqfe kbhardware kbsysadmin kbdatabase kbdriver kbhotfixserver 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