前言:数据库越大,使用时间越长,貌似稳定性也在逐步下降。数据页逻辑错误,可能是DBA遇到比较棘手的问题之一,本文将基于实战模式给出一些检查及处理的方法。当然,任何方法都是受制于环境的限制,本文中介绍的方法也只适用于某些特定环境,仅供参考;
===================华丽丽的分割线========================
前几天碰到一个错误,具体信息如下:
SQL Server 检测到基于一致性的逻辑 I/O 错误 pageid 不正确(应为 6:49413777,但实际为 0:0)。在文件 'M:\SQLDATA\Pk_4.ndf' 中、偏移量为 0x00005e3fd22000 的位置对数据库 ID 5 中的页 (6:49413777) 执行 读取 期间,发生了该错误。SQL Server 错误日志或系统事件日志
或许这是DBA遇到比较棘手的问题之一了。万幸的是,发生错误的数据库是一个事务复制环境中的订阅库,而且有负载均衡扛着,基本上对业务没有影响;
1、发现该错误后,第一反应是存储(楼主的土豪公司用的是IO卡)出现逻辑错误,尝试手动重启服务器,让IO卡进行自检;进入系统后,发现问题没有解决;
这一步,在IO卡自检完成进入系统后,需要进一步使用厂商提供的监控程序检查IO卡是否有物理坏块,并收集相关日志。经过其他同事检查,IO卡没有异常报错;
2、通过我们的监控工具定位到publication是位于Publisher_A的pk_order_BEQ_new,该publication中涉及3个表
Order_A \ Order_B \ Order_C
3、在出现问题的机器上(以下称为subscriber_A)通过select count(1) from table_name(nolock)的方式快速检测具体是哪个表有问题;
此处的检测方法有局限性,初步分析如下:
如果是小表,可能在页损坏之前有类似操作,导致全部页还在缓存区中,因而select count(1)是可以获取结果的,无法判断出该表是否存页损坏;
如果IAM页中还有6:49413777的信息,且该页还在缓存区中,也是无法判断出该表是否存页损坏;
如果IAM页中没有6:49413777的信息,则select count(1)的时候会跳过已损坏的页,仍然可以获取结果,也是无法判断出该表是否存页损坏;
只有当IAM页中有6:49413777的信息,而该页又被交换出缓存区,需要进行物理读的时候,才会导致select count(1)无法获取结果,具体情况如下:

此处检测 Order_A正常,Order_B报错;但这只能证明Order_B表确实存在损坏的页,而Order_A却不能断定一定是正常的;
当时的检测办法只是按照select count(1)的方式,判断出Order_B表存在坏页;但实际上,可以从Publisher_A的distribution.dbo.msrepl_errors中获取当前由复制引起的无法写入损坏页的XACT_Seqno,进而通过sp_browsereplcmds ‘XACT_Seqno’,’ XACT_Seqno’,及command_id定位到具体引起该错误的对象名、操作类型和主键值;
但此方法也有弊端,由于页中可能存在多条记录,如果是页头损坏,将导致该页中的所有记录都无法读取,而msrepl_errors重试间隔大约1分钟,所以通过此方法确定损坏的数据页较慢;
4、通过distribution.dbo.msrepl_errors定位到orderexpend_pop表也存在损坏页,并定位到是由delete操作发现异常,因此修改subscriber_A上相应的复制存储过程;
之前采用的仅屏蔽掉IF部分的做法在此处并不适用,因为delete时的返回信息并不再是“影响0行记录”,而是由于页损坏导致记录无法找到并删除;
delete [dbo].[Order_A]where [Id] = @pkc1--if @@rowcount = 0-- if @@microsoftversion>0x07320000-- exec sp_MSreplraiserror 20598
此处为了方便后面定位可能出现的损坏页,修改存储过程如下:
先创建记录表monitor.dbo.tmp_byxl_Order_A_20140428
--CREATE TABLE monitor.dbo.tmp_byxl_Order_A_20140428 (id BIGINT,checkdate DATETIME DEFAULT GETDATE())--再修改存储过程INSERT INTO monitor.dbo.tmp_byxl_Order_A_20140428(id) VALUES(@pkc1)RETURN;-- delete [dbo].[Order_A]--where [Id] = @pkc1--if @@rowcount = 0-- if @@microsoftversion>0x07320000-- exec sp_MSreplraiserror 20598
此处修改的目的:尽快跳过相应的删除操作,使Publisher_A的复制命令不致于积压的过多;
对于update和insert操作也应进行相应的修改,否则将导致后续命令延迟;
5、考虑到DBCC checktable在执行修复时需要将数据库改为单用户模式,影响用户访问,因此不作为首选修复方案;
由于subscriber_A是负载中的读库,因此首先将该服务器脱离负载环境,同时检查是否有通过IP直连数据库的应用,协调切串;
如果直连的应用较多,短期内无法将连接串切走,可以先从上级分发重新复制一份不更名的表到subscriber_A,待数据同步后添加索引及相应的权限,再从Publisher_A上停止这个表的写入,摘除复制后交换subscriber_A的表名,重新搭建不初始化订阅的复制关系;这样可以在继续读取旧表大部分数据的同时完成新表的初始化工作,唯一受影响的除了磁盘空间外,还有初始过程中的IO开销;
需要注意的是,如果publication中包含多个表,且上级发布服务器Publisher_A为SQLSERVER 2008 R2,则需要这个publication下所有的表都要重新初始化到新表;
由于08 R2版本在删除article时会导致复制事务丢失的BUG,因此,只能按publication整体删除订阅,因此需要以publication为单位进行数据初始化;
关于如何实现复制订阅端更名的表,可以看一下我之前的blog《Replication的犄角旮旯(一)--变更订阅端表名的应用场景》
6、继续对损坏页进行定位,一种方法是通过DBCC CHECKTABLE,另一种方法是通过DBCC IND检索页的连续性;
create table dbcc_ind(PageFID numeric(20),PagePID numeric(20),IAMFID numeric(20),IAMPID numeric(20),ObjectID numeric(20),IndexID numeric(20),PartitionNumber numeric(20),PartitionID numeric(20),iam_chain_type nvarchar(100),PageType numeric(20),IndexLevel numeric(20),NextPageFID numeric(20),NextPagePID numeric(20),PrevPageFID numeric(20),PrevPagePID numeric(20))INSERT dbcc_indEXEC ('DBCC IND(Pk,Order_A,1)')

从上图可以看出
第一行:PagePID=49413776,NextPagePID=49413777
第二行:PagePID=49413778,PrevPagePID=49413777
从49413776~49413778是本应该是连续的3个页,但由于49413777页损坏,无法读取其信息,因此缺少PagePID=49413777的记录;
7、使用DBCC PAGE对6:49413777检查,页头部信息已无法正确读取;注意下图中红色框内的信息

8、创建数据库快照并备份数据库(为了后续测试),使用DBCC CHECKTABLE(添加noindex 、with physical_only参数提高检查效率)检查Order_A表;用时4分钟(2KW行记录,数据+索引约60G),检测结果如下:

以下测试是基于我们的一种假设,如果页损坏发生在写库上(没有其他的数据副本),想要不丢失数据的修复变得十分困难;
另外,就是我们刚升级的SQL 2012的写库由于有windows 2012的跨子网群集的支持,配合某C的存储设备(基于存储底层的block级镜像),可实现跨机房的灾备;
但对于上述问题,数据是否就安全呢?
9、将数据备份恢复到某C设备,通过其磁盘块的镜像机制同步到备用端,再启用备用节点,发现并不能使逻辑错误消除;
分析原因:基于存储底层的block级镜像只是从底层对块进行复制,而无法验证数据逻辑级别的错误,因此损坏的页并不能因此得到修复;
因此,建议对使用C设备的库还需要使用alwayson或镜像做一级保护,alwayson和镜像中的页修复功能可以最大限度修复此类错误;
10、对subscriber_A做DBCC CHECKTABE,注意修改为single_user模式,先选用repair_rebuilt模式,执行15分钟后,提示无法进行修复;
1 消息 8939,级别 16,状态 5,第 2 行2 表错误: 对象 ID 0,索引 ID -1,分区 ID 0,分配单元 ID 0 (类型为 Unknown),页 (6:16320656)。测试(m_headerVersion == HEADER_7_0)失败。值为 0 和 1。3 DBCC 语句的修复级别导致避开了此修复。4 消息 8939,级别 16,状态 6,第 2 行5 表错误: 对象 ID 0,索引 ID -1,分区 ID 0,分配单元 ID 0 (类型为 Unknown),页 (6:16320656)。测试((m_type >= DATA_PAGE && m_type <= UNDOFILE_HEADER_PAGE) || (m_type == UNKNOWN_PAGE && level == BASIC_HEADER))失败。值为 0 和 0。6 修复此错误要求首先修正其他错误。7 消息 8939,级别 16,状态 7,第 2 行8 表错误: 对象 ID 0,索引 ID -1,分区 ID 0,分配单元 ID 0 (类型为 Unknown),页 (6:16320656)。测试(m_freeData >= PageHeaderOverhead () && m_freeData <= (UINT)PAGESIZE - m_slotCnt * sizeof (Slot))失败。值为 0 和 8192。9 修复此错误要求首先修正其他错误。10 消息 8909,级别 16,状态 1,第 2 行11 表错误: 对象 ID 0,索引 ID -1,分区 ID 0,分配单元 ID 0 (类型为 Unknown),页 ID (6:49413777) 在其页头中包含错误的页 ID。页头中的 PageId 为 (0:0)。12 DBCC 语句的修复级别导致避开了此修复。13 消息 8909,级别 16,状态 1,第 2 行14 表错误: 对象 ID 0,索引 ID -1,分区 ID 0,分配单元 ID 0 (类型为 Unknown),页 ID (6:49430702) 在其页头中包含错误的页 ID。页头中的 PageId 为 (0:0)。15 DBCC 语句的修复级别导致避开了此修复。16 消息 8909,级别 16,状态 1,第 2 行17 表错误: 对象 ID 0,索引 ID -1,分区 ID 0,分配单元 ID 0 (类型为 Unknown),页 ID (6:49478961) 在其页头中包含错误的页 ID。页头中的 PageId 为 (0:0)。18 DBCC 语句的修复级别导致避开了此修复。19 消息 8909,级别 16,状态 1,第 2 行20 表错误: 对象 ID 0,索引 ID -1,分区 ID 0,分配单元 ID 0 (类型为 Unknown),页 ID (6:49895141) 在其页头中包含错误的页 ID。页头中的 PageId 为 (0:0)。21 DBCC 语句的修复级别导致避开了此修复。22 CHECKTABLE 发现有 0 个分配错误和 7 个一致性错误与任何单个的对象都没有关联。23 Order_A的 DBCC 结果。24 消息 8928,级别 16,状态 1,第 2 行25 对象 ID 300580159,索引 ID 1,分区 ID 72057594125221888,分配单元 ID 72057594134265856 (类型为 In-row data): 无法处理页 (6:49413777)。有关详细信息,请参阅其他错误消息。26 DBCC 语句的修复级别导致避开了此修复。27 消息 8976,级别 16,状态 1,第 2 行28 表错误: 对象 ID 300580159,索引 ID 1,分区 ID 72057594125221888,分配单元 ID 72057594134265856 (类型为 In-row data)。在扫描过程中未发现页 (6:49413777),但该页的父级 (7:49486993) 和上一页 (6:49413776) 都引用了它。请检查以前的错误消息。29 修复此错误要求首先修正其他错误。30 消息 8978,级别 16,状态 1,第 2 行31 表错误: 对象 ID 300580159,索引 ID 1,分区 ID 72057594125221888,分配单元 ID 72057594134265856 (类型为 In-row data)。页 (6:49413778) 缺少上一页 (6:49413777) 对它的引用。可能是链链接有问题。32 修复此错误要求首先修正其他错误。33 消息 8928,级别 16,状态 1,第 2 行34 对象 ID 300580159,索引 ID 1,分区 ID 72057594125221888,分配单元 ID 72057594134265856 (类型为 In-row data): 无法处理页 (6:49478961)。有关详细信息,请参阅其他错误消息。35 修复此错误要求首先修正其他错误。36 消息 8976,级别 16,状态 1,第 2 行37 表错误: 对象 ID 300580159,索引 ID 1,分区 ID 72057594125221888,分配单元 ID 72057594134265856 (类型为 In-row data)。在扫描过程中未发现页 (6:49478961),但该页的父级 (7:49537707) 和上一页 (6:49478960) 都引用了它。请检查以前的错误消息。38 修复此错误要求首先修正其他错误。39 消息 8978,级别 16,状态 1,第 2 行40 表错误: 对象 ID 300580159,索引 ID 1,分区 ID 72057594125221888,分配单元 ID 72057594134265856 (类型为 In-row data)。页 (6:49478962) 缺少上一页 (6:49478961) 对它的引用。可能是链链接有问题。41 修复此错误要求首先修正其他错误。42 消息 8928,级别 16,状态 1,第 2 行43 对象 ID 300580159,索引 ID 1,分区 ID 72057594125221888,分配单元 ID 72057594134265856 (类型为 In-row data): 无法处理页 (6:49841633)。有关详细信息,请参阅其他错误消息。44 修复此错误要求首先修正其他错误。45 消息 8939,级别 16,状态 98,第 2 行46 表错误: 对象 ID 300580159,索引 ID 1,分区 ID 72057594125221888,分配单元 ID 72057594134265856 (类型为 In-row data),页 (6:49841633)。测试(IS_OFF (BUF_IOERR, pBUF->bstat))失败。值为 2057 和 -4。47 修复此错误要求首先修正其他错误。48 消息 8976,级别 16,状态 1,第 2 行49 表错误: 对象 ID 300580159,索引 ID 1,分区 ID 72057594125221888,分配单元 ID 72057594134265856 (类型为 In-row data)。在扫描过程中未发现页 (6:49841633),但该页的父级 (7:49917538) 和上一页 (6:49841632) 都引用了它。请检查以前的错误消息。50 修复此错误要求首先修正其他错误。51 消息 8978,级别 16,状态 1,第 2 行52 表错误: 对象 ID 300580159,索引 ID 1,分区 ID 72057594125221888,分配单元 ID 72057594134265856 (类型为 In-row data)。页 (6:49841634) 缺少上一页 (6:49841633) 对它的引用。可能是链链接有问题。53 修复此错误要求首先修正其他错误。54 消息 8928,级别 16,状态 1,第 2 行55 对象 ID 300580159,索引 ID 1,分区 ID 72057594125221888,分配单元 ID 72057594134265856 (类型为 In-row data): 无法处理页 (6:49895141)。有关详细信息,请参阅其他错误消息。56 修复此错误要求首先修正其他错误。57 消息 8976,级别 16,状态 1,第 2 行58 表错误: 对象 ID 300580159,索引 ID 1,分区 ID 72057594125221888,分配单元 ID 72057594134265856 (类型为 In-row data)。在扫描过程中未发现页 (6:49895141),但该页的父级 (6:49912485) 和上一页 (6:49895140) 都引用了它。请检查以前的错误消息。59 修复此错误要求首先修正其他错误。60 消息 8978,级别 16,状态 1,第 2 行61 表错误: 对象 ID 300580159,索引 ID 1,分区 ID 72057594125221888,分配单元 ID 72057594134265856 (类型为 In-row data)。页 (6:49895142) 缺少上一页 (6:49895141) 对它的引用。可能是链链接有问题。62 修复此错误要求首先修正其他错误。63 消息 8928,级别 16,状态 1,第 2 行64 对象 ID 300580159,索引 ID 2,分区 ID 72057594132299776,分配单元 ID 72057594142720000 (类型为 In-row data): 无法处理页 (6:16320656)。有关详细信息,请参阅其他错误消息。65 DBCC 语句的修复级别导致避开了此修复。66 消息 8976,级别 16,状态 1,第 2 行67 表错误: 对象 ID 300580159,索引 ID 2,分区 ID 72057594132299776,分配单元 ID 72057594142720000 (类型为 In-row data)。在扫描过程中未发现页 (6:16320656),但该页的父级 (7:16360354) 和上一页 (7:50019300) 都引用了它。请检查以前的错误消息。68 修复此错误要求首先修正其他错误。69 消息 8978,级别 16,状态 1,第 2 行70 表错误: 对象 ID 300580159,索引 ID 2,分区 ID 72057594132299776,分配单元 ID 72057594142720000 (类型为 In-row data)。页 (6:49412182) 缺少上一页 (6:49430702) 对它的引用。可能是链链接有问题。71 修复此错误要求首先修正其他错误。72 消息 8928,级别 16,状态 1,第 2 行73 对象 ID 300580159,索引 ID 2,分区 ID 72057594132299776,分配单元 ID 72057594142720000 (类型为 In-row data): 无法处理页 (6:49430702)。有关详细信息,请参阅其他错误消息。74 修复此错误要求首先修正其他错误。75 消息 8976,级别 16,状态 1,第 2 行76 表错误: 对象 ID 300580159,索引 ID 2,分区 ID 72057594132299776,分配单元 ID 72057594142720000 (类型为 In-row data)。在扫描过程中未发现页 (6:49430702),但该页的父级 (6:49434625) 和上一页 (6:49433061) 都引用了它。请检查以前的错误消息。77 修复此错误要求首先修正其他错误。78 消息 8978,级别 16,状态 1,第 2 行79 表错误: 对象 ID 300580159,索引 ID 2,分区 ID 72057594132299776,分配单元 ID 72057594142720000 (类型为 In-row data)。页 (7:50019299) 缺少上一页 (6:16320656) 对它的引用。可能是链链接有问题。80 修复此错误要求首先修正其他错误。81 对象 'Order_A' 的 4214698 页中有 200428357 行。82 CHECKTABLE 在表 'Order_A' (对象 ID 300580159)中发现 0 个分配错误和 19 个一致性错误。83 对于由 DBCC CHECKTABLE (Pk.dbo.Order_A, repair_rebuild)发现的错误,repair_allow_data_loss 是最低的修复级别。84 DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。
11、继续通过repair_allow_data_loss模式进行修复,执行约1小时后修复完毕,丢失记录10条;
1 消息 8939,级别 16,状态 5,第 1 行2 表错误: 对象 ID 0,索引 ID -1,分区 ID 0,分配单元 ID 0 (类型为 Unknown),页 (6:16320656)。测试(m_headerVersion == HEADER_7_0)失败。值为 0 和 1。3 该错误已修复。4 消息 8939,级别 16,状态 6,第 1 行5 表错误: 对象 ID 0,索引 ID -1,分区 ID 0,分配单元 ID 0 (类型为 Unknown),页 (6:16320656)。测试((m_type >= DATA_PAGE && m_type <= UNDOFILE_HEADER_PAGE) || (m_type == UNKNOWN_PAGE && level == BASIC_HEADER))失败。值为 0 和 0。6 该错误已修复。7 消息 8939,级别 16,状态 7,第 1 行8 表错误: 对象 ID 0,索引 ID -1,分区 ID 0,分配单元 ID 0 (类型为 Unknown),页 (6:16320656)。测试(m_freeData >= PageHeaderOverhead () && m_freeData <= (UINT)PAGESIZE - m_slotCnt * sizeof (Slot))失败。值为 0 和 8192。9 该错误已修复。10 消息 8909,级别 16,状态 1,第 1 行11 表错误: 对象 ID 0,索引 ID -1,分区 ID 0,分配单元 ID 0 (类型为 Unknown),页 ID (6:49413777) 在其页头中包含错误的页 ID。页头中的 PageId 为 (0:0)。12 该错误已修复。13 消息 8909,级别 16,状态 1,第 1 行14 表错误: 对象 ID 0,索引 ID -1,分区 ID 0,分配单元 ID 0 (类型为 Unknown),页 ID (6:49430702) 在其页头中包含错误的页 ID。页头中的 PageId 为 (0:0)。15 该错误已修复。16 消息 8909,级别 16,状态 1,第 1 行17 表错误: 对象 ID 0,索引 ID -1,分区 ID 0,分配单元 ID 0 (类型为 Unknown),页 ID (6:49478961) 在其页头中包含错误的页 ID。页头中的 PageId 为 (0:0)。18 该错误已修复。19 消息 8909,级别 16,状态 1,第 1 行20 表错误: 对象 ID 0,索引 ID -1,分区 ID 0,分配单元 ID 0 (类型为 Unknown),页 ID (6:49895141) 在其页头中包含错误的页 ID。页头中的 PageId 为 (0:0)。21 该错误已修复。22 CHECKTABLE 发现有 0 个分配错误和 7 个一致性错误与任何单个的对象都没有关联。23 CHECKTABLE 修复了 0 个分配错误和 7 个一致性错误,这些错误不与任何单个对象相关联。24 Order_A的 DBCC 结果。25 修复: 已为数据库 'Pk' 中的对象 'dbo.Order_A' 成功地重新生成了 Clustered 索引。26 修复: 页 (6:49413777) 已从对象 ID 300580159,索引 ID 1,分区 ID 72057594125221888,分配单元 ID 72057594134265856 (类型为 In-row data)释放。27 修复: 页 (6:49478961) 已从对象 ID 300580159,索引 ID 1,分区 ID 72057594125221888,分配单元 ID 72057594134265856 (类型为 In-row data)释放。28 修复: 页 (6:49841633) 已从对象 ID 300580159,索引 ID 1,分区 ID 72057594125221888,分配单元 ID 72057594134265856 (类型为 In-row data)释放。29 修复: 页 (6:49895141) 已从对象 ID 300580159,索引 ID 1,分区 ID 72057594125221888,分配单元 ID 72057594134265856 (类型为 In-row data)释放。30 修复: 已为数据库 'Pk' 中的对象 'dbo.Order_A, idx_Order_A_ck_new_orderid' 成功地重新生成了 Nonclustered 索引。31 修复: 页 (6:16320656) 已从对象 ID 300580159,索引 ID 2,分区 ID 72057594132299776,分配单元 ID 72057594142720000 (类型为 In-row data)释放。32 修复: 页 (6:49430702) 已从对象 ID 300580159,索引 ID 2,分区 ID 72057594132299776,分配单元 ID 72057594142720000 (类型为 In-row data)释放。33 修复: 已为数据库 'Pk' 中的对象 'dbo.Order_A, idx_Order_A_venderid_orderid' 成功地重新生成了 Nonclustered 索引。34 消息 8945,级别 16,状态 1,第 1 行35 表错误: 将重新生成对象 ID 300580159,索引 ID 1。36 该错误已修复。37 消息 8928,级别 16,状态 1,第 1 行38 对象 ID 300580159,索引 ID 1,分区 ID 72057594125221888,分配单元 ID 72057594134265856 (类型为 In-row data): 无法处理页 (6:49413777)。有关详细信息,请参阅其他错误消息。39 该错误已修复。40 消息 8976,级别 16,状态 1,第 1 行41 表错误: 对象 ID 300580159,索引 ID 1,分区 ID 72057594125221888,分配单元 ID 72057594134265856 (类型为 In-row data)。在扫描过程中未发现页 (6:49413777),但该页的父级 (7:49486993) 和上一页 (6:49413776) 都引用了它。请检查以前的错误消息。42 该错误已修复。43 消息 8978,级别 16,状态 1,第 1 行44 表错误: 对象 ID 300580159,索引 ID 1,分区 ID 72057594125221888,分配单元 ID 72057594134265856 (类型为 In-row data)。页 (6:49413778) 缺少上一页 (6:49413777) 对它的引用。可能是链链接有问题。45 该错误已修复。46 消息 8928,级别 16,状态 1,第 1 行47 对象 ID 300580159,索引 ID 1,分区 ID 72057594125221888,分配单元 ID 72057594134265856 (类型为 In-row data): 无法处理页 (6:49478961)。有关详细信息,请参阅其他错误消息。48 该错误已修复。49 消息 8976,级别 16,状态 1,第 1 行50 表错误: 对象 ID 300580159,索引 ID 1,分区 ID 72057594125221888,分配单元 ID 72057594134265856 (类型为 In-row data)。在扫描过程中未发现页 (6:49478961),但该页的父级 (7:49537707) 和上一页 (6:49478960) 都引用了它。请检查以前的错误消息。51 该错误已修复。52 消息 8978,级别 16,状态 1,第 1 行53 表错误: 对象 ID 300580159,索引 ID 1,分区 ID 72057594125221888,分配单元 ID 72057594134265856 (类型为 In-row data)。页 (6:49478962) 缺少上一页 (6:49478961) 对它的引用。可能是链链接有问题。54 该错误已修复。55 消息 8928,级别 16,状态 1,第 1 行56 对象 ID 300580159,索引 ID 1,分区 ID 72057594125221888,分配单元 ID 72057594134265856 (类型为 In-row data): 无法处理页 (6:49841633)。有关详细信息,请参阅其他错误消息。57 该错误已修复。58 消息 8939,级别 16,状态 98,第 1 行59 表错误: 对象 ID 300580159,索引 ID 1,分区 ID 72057594125221888,分配单元 ID 72057594134265856 (类型为 In-row data),页 (6:49841633)。测试(IS_OFF (BUF_IOERR, pBUF->bstat))失败。值为 2057 和 -4。60 该错误已修复。61 消息 8976,级别 16,状态 1,第 1 行62 表错误: 对象 ID 300580159,索引 ID 1,分区 ID 72057594125221888,分配单元 ID 72057594134265856 (类型为 In-row data)。在扫描过程中未发现页 (6:49841633),但该页的父级 (7:49917538) 和上一页 (6:49841632) 都引用了它。请检查以前的错误消息。63 该错误已修复。64 消息 8978,级别 16,状态 1,第 1 行65 表错误: 对象 ID 300580159,索引 ID 1,分区 ID 72057594125221888,分配单元 ID 72057594134265856 (类型为 In-row data)。页 (6:49841634) 缺少上一页 (6:49841633) 对它的引用。可能是链链接有问题。66 该错误已修复。67 消息 8928,级别 16,状态 1,第 1 行68 对象 ID 300580159,索引 ID 1,分区 ID 72057594125221888,分配单元 ID 72057594134265856 (类型为 In-row data): 无法处理页 (6:49895141)。有关详细信息,请参阅其他错误消息。69 该错误已修复。70 消息 8976,级别 16,状态 1,第 1 行71 表错误: 对象 ID 300580159,索引 ID 1,分区 ID 72057594125221888,分配单元 ID 72057594134265856 (类型为 In-row data)。在扫描过程中未发现页 (6:49895141),但该页的父级 (6:49912485) 和上一页 (6:49895140) 都引用了它。请检查以前的错误消息。72 该错误已修复。73 消息 8978,级别 16,状态 1,第 1 行74 表错误: 对象 ID 300580159,索引 ID 1,分区 ID 72057594125221888,分配单元 ID 72057594134265856 (类型为 In-row data)。页 (6:49895142) 缺少上一页 (6:49895141) 对它的引用。可能是链链接有问题。75 该错误已修复。76 消息 8945,级别 16,状态 1,第 1 行77 表错误: 将重新生成对象 ID 300580159,索引 ID 2。78 该错误已修复。79 消息 8928,级别 16,状态 1,第 1 行80 对象 ID 300580159,索引 ID 2,分区 ID 72057594132299776,分配单元 ID 72057594142720000 (类型为 In-row data): 无法处理页 (6:16320656)。有关详细信息,请参阅其他错误消息。81 该错误已修复。82 消息 8976,级别 16,状态 1,第 1 行83 表错误: 对象 ID 300580159,索引 ID 2,分区 ID 72057594132299776,分配单元 ID 72057594142720000 (类型为 In-row data)。在扫描过程中未发现页 (6:16320656),但该页的父级 (7:16360354) 和上一页 (7:50019300) 都引用了它。请检查以前的错误消息。84 该错误已修复。85 消息 8978,级别 16,状态 1,第 1 行86 表错误: 对象 ID 300580159,索引 ID 2,分区 ID 72057594132299776,分配单元 ID 72057594142720000 (类型为 In-row data)。页 (6:49412182) 缺少上一页 (6:49430702) 对它的引用。可能是链链接有问题。87 该错误已修复。88 消息 8928,级别 16,状态 1,第 1 行89 对象 ID 300580159,索引 ID 2,分区 ID 72057594132299776,分配单元 ID 72057594142720000 (类型为 In-row data): 无法处理页 (6:49430702)。有关详细信息,请参阅其他错误消息。90 该错误已修复。91 消息 8976,级别 16,状态 1,第 1 行92 表错误: 对象 ID 300580159,索引 ID 2,分区 ID 72057594132299776,分配单元 ID 72057594142720000 (类型为 In-row data)。在扫描过程中未发现页 (6:49430702),但该页的父级 (6:49434625) 和上一页 (6:49433061) 都引用了它。请检查以前的错误消息。93 该错误已修复。94 消息 8978,级别 16,状态 1,第 1 行95 表错误: 对象 ID 300580159,索引 ID 2,分区 ID 72057594132299776,分配单元 ID 72057594142720000 (类型为 In-row data)。页 (7:50019299) 缺少上一页 (6:16320656) 对它的引用。可能是链链接有问题。96 该错误已修复。97 消息 8945,级别 16,状态 1,第 1 行98 表错误: 将重新生成对象 ID 300580159,索引 ID 7。99 该错误已修复。100 对象 'Order_A' 的 4214698 页中有 200428357 行。101 CHECKTABLE 在表 'Order_A' (对象 ID 300580159)中发现 0 个分配错误和 19 个一致性错误。102 CHECKTABLE 在表 'Order_A' (对象 ID 300580159)中修复了 0 个分配错误和 19 个一致性错误。103 DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。
结论:
1、建议对写库搭建同步的镜像或alwayson环境(优先选用同步模式),以最大限度的保证数据不丢失;
2、如读库遇到此类问题,先重启服务器,让存储设备自检,确认无法修复的,再进行脱离负载、通知研发切串的操作;
3、尽量避免直接DBCC CHECKTABLE的修复操作,因为这样的操作需要在单用户模式下执行;首选通过复制对异常的表进行更名的初始化,实现数据页的修复;
4、即便定位到哪些记录存在于损坏页中,也无法通过重新导入数据或重建聚集索引实现修复功能;
文章转载自:
https://www.cnblogs.com/diabloxl/p/3701511.html
文章经作者授权转载,版权归原文作者所有
图片来源于网络,侵权必删!




