1. 问题描述
今天在查询生产环境慢 SQL 的时候,提示慢 SQL 表损坏了:
查询语句:
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 操作,确认修复结果。