问题场景

业务在多次执行删除行为的时候,提示:[ERROR] InnoDB: Clustered recond for sec rec not found index sak_callback_api_request_create_time_IDX of table ainemo.sdk_callback_api_request)。详细报错见下图:

image.png

排查过程

通过 not found 等字样怀疑索引状态异常,进而检查数据库索引状态,命令如下:CHECK TABLE ainemo.sdk_callback_api_request;。查询结果返回:

Table Op Msg_type Msg_text
ainemo.sdk_callback_api_request check Warning InnoDB: Index sdk_callback_api_request_event_type_IDX is marked as corrupted
ainemo.sdk_callback_api_request check Warning InnoDB: Index sdk_callback_api_request_create_time_IDX is marked as corrupted
ainemo.sdk_callback_api_request check error Corrupt

Corrupt 表明该索引已经标记为损坏.同时,经实测 DDL 语句在索引损坏的情况下无法使用该索引进行加速执行,同时,在无其他索引可用的情形下会走全表执行,影响效率

修复方案

  1. 通过命令OPTIMIZE TABLE your_table_name;可以重建表并回收未使用的内存空间,同时会修复一些索引损坏等问题
  2. 可以手动删除索引后再添加该索引,达到修复的目的

扩展资料

CHECK TABLE 命令的作用与使用方法

作用

  1. 检查表的完整性:确保表中的所有行都是完整的,并且没有丢失的数据。
  2. 验证索引:确认表的索引是否正确地指向了相应的数据行,以及是否存在重复或损坏的索引项。
  3. 查找并报告错误:如果表存在问题,CHECK TABLE 会返回详细的错误信息,帮助管理员了解问题的具体位置和性质。
  4. 支持多种存储引擎:可以对不同类型的存储引擎(例如 MyISAM, InnoDB)进行检查。

使用场景

  • 日常维护:定期运行 CHECK TABLE 可以作为数据库维护的一部分,以预防潜在的问题。
  • 故障排查:当怀疑某个表有问题时,可以使用此命令来诊断问题。
  • 恢复操作后:在执行了某些可能导致表损坏的操作(如突然断电、硬件故障后的恢复)之后,应该立即检查受影响的表。
  • 迁移或升级前后:在数据库版本升级或者将数据从一个服务器迁移到另一个服务器之前和之后,都应该检查表的状态。
  • 备份验证:虽然 CHECK TABLE 不直接用于备份,但它可以在创建备份副本前确保源表是健康的。

命令语法

CHECK TABLE table_name [, table_name] ... [option] ...
  • table_name:要检查的表的名字。可以同时指定多个表名,用逗号分隔。
  • option:可选参数,用来指定更具体的检查行为。常用的选项包括:
    • FOR UPGRADE:检查表是否需要升级以兼容新的 MySQL 版本。
    • QUICK:仅快速检查索引而不过多关注数据行本身。
    • FAST:只检查那些上次被更改后未被检查过的表。
    • MEDIUM:执行比 QUICK 更彻底但比完全扫描更快的检查。
    • EXTENDED:进行全面的扫描,包括每行记录的一致性检查。