数据页逻辑错误的检查及处理方法
前言:数据库越大,使用时间越长,貌似稳定性也在逐步下降。数据页逻辑错误,可能是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)的方式快速检测具体是哪个表有问题;
此处的检测方法有局限性,初步分析如下:
a) 如果是小表,可能在页损坏之前有类似操作,导致全部页还在缓存区中,因而select count(1)是可以获取结果的,无法判断出该表是否存页损坏;
b) 如果IAM页中还有6:49413777的信息,且该页还在缓存区中,也是无法判断出该表是否存页损坏;
c) 如果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检索页的连续性;
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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_ind EXEC ('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分钟后,提示无法进行修复;
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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条;
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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、即便定位到哪些记录存在于损坏页中,也无法通过重新导入数据或重建聚集索引实现修复功能;