昨天我在 AWS 的 EC2 上运行的 MySQL 5.5 从属数据库之一遇到了一个新问题。数据库是从另一个从站的快照创建的。数据是正确的,但对于至少一个表,二级索引返回的结果不完整。通过父 id 查询子表返回 498 行,而它应该返回 504。通过主键查询丢失的 6 行有效,并且返回了正确的父 id,所以问题出在二级索引上。
这个问题对我来说非常重要,因为即使从服务器上的所有数据都与主服务器匹配,我仍然会从从服务器上运行的某些查询中得到不正确的结果。
我的蛮力解决方案是像这样重建整个表:
alter table my_table engine = innodb;
这解决了这个特定表的问题,但我留下了以下问题:
1) How can I determine if other tables have similar index corruption?
2) What's the most efficient way to fix the corrupt indexes?
我在网上找到了一些很好的资源来查找和修复 InnoDB 数据损坏,但没有找到与 InnoDB 索引损坏相关的任何内容。
我查看了 MySQL 错误日志并没有发现确凿证据。我确实发现了一些令人不安的 InnoDB 错误。我假设这是一个单独的问题,但它可能是相关的:
130109 9:46:41 InnoDB: unable to find a record to delete-mark
InnoDB: tuple DATA TUPLE: 2 fields;
0: len 4; hex 04af1f21; asc !;;
1: len 4; hex 0a1c03bd; asc ;;
InnoDB: record PHYSICAL RECORD: n_fields 2; compact format; info bits 0
0: len 4; hex 04af1f21; asc !;;
1: len 4; hex 0a052a77; asc *w;;