慢 SQL 查询,提示 slow_log 表损坏

117 阅读1分钟

1. 问题描述

今天在查询生产环境慢 SQL 的时候,提示慢 SQL 表损坏了:

1716199636159_3CD02445-10E8-492e-924D-320AF2F628DC.png

查询语句:

SELECT start_time,user_host,query_time,lock_time,rows_sent,rows_examined,db,last_insert_id,insert_id,server_id,CAST(sql_text as CHAR),thread_id FROM mysql.slow_log ORDER BY start_time DESC LIMIT 100;
SELECT start_time,user_host,query_time,lock_time,rows_sent,rows_examined,db,last_insert_id,insert_id,server_id,CAST(sql_text as CHAR),thread_id FROM mysql.slow_log  WHERE start_time >= '2024-05-16 00:00:00' ORDER BY query_time DESC LIMIT 100;

报错信息:

Table 'slow_log' is marked as crashed and should be repaired

2. 解决方法

当然公司这边主要是没有权限,让 DBA 给解决的。下面记录的是找到的解决方法。

2.1. 普通表修复

遇到一般的表损坏,数据量不大,可以通过以下方法轻松搞定。

check table tb_name;

使用 check 检查出现问题的表的状态,tb_name 是实际的表名。然后用 repire 修复表:

repair table tb_name;

修复完毕后再用 check 检查一下就 OK 了。

check table tb_name;

2.2. slow_log 表修复

先执行 check,再关闭慢查日志,会锁表。所以应该先关闭慢查日志,再做 check。这样不会产生锁。接下来要做 repair 操作,强烈建议在业务低峰期执行,避免当 mysql.slow_log 表很大时,使用 repair 命令修复造成性能波动。

第一步:关闭慢查询日志。

第二步:已经确认了 mysql.slow_log 损坏了,不需要进行 check 了。未确认的话下执行 check 操作。

第三步:执行 repair 操作,进行表修复。

第四步:再执行下 check 操作,确认修复结果。