当前位置:首页 >  站长 >  数据库 >  正文

MySQL 表损坏修复:MyISAM 和 InnoDB 是两套完全不同的打法

 2026-09-08 10:38  来源: 互联网   我来投稿 撤稿纠错

  一键部署OpenClaw

网站某栏目突然打不开,日志里刷 Table is marked as crashed,或者 MySQL 莫名重启后某张表查一下就断连——表损坏来了。动手修之前必须先搞清楚一件事:出问题的是 MyISAM 表还是 InnoDB 表,两者修法完全不同,用错方法轻则无效,重则把还能救的数据弄没。SHOW TABLE STATUS 看一眼 Engine 列,第一步就定方向。

先讲清楚“表为什么会坏”:写入写到一半断电或被强杀、磁盘坏道、硬件故障、外部程序同时改表,都是常见诱因。损坏是结果,修表只是止损,查诱因才是根治——这个后面收尾再展开。

MyISAM 的修复相对简单,官方给了 REPAIR TABLE 语句,ARCHIVE 和 CSV 表同样适用。修复前做一件事:停库备份 /var/lib/mysql 数据目录,修复操作本身也有失败概率,先给自己留退路。REPAIR 的输出里 Msg_type 是 status、Msg_text 是 OK 就算修好了;不行就走 mysqlcheck 命令行,或者 myisamchk 离线修。

-- 动手前先备份(MyISAM):
-- systemctl stop mysqld && cp -r /var/lib/mysql /var/lib/mysql_bkp
-- systemctl start mysqld

-- 在线检查与修复
CHECK TABLE t1;
REPAIR TABLE t1;

-- 全库扫描修复(mysqlcheck,比逐表执行 REPAIR 省事)
-- mysqlcheck --repair --databases db_name
-- mysqlcheck --repair --all-databases

InnoDB 完全不同:它没有 REPAIR TABLE 可用。InnoDB 靠页校验和机制自动检测损坏,读到坏页会主动停库,常规问题靠重启后的崩溃恢复自愈。真遇上页损坏,官方给的路径是“导出再导入”:用 mysqldump 把表数据逻辑导出,删表重建再灌回去。如果损坏严重到 InnoDB 起不来,才轮到 innodb_force_recovery 登场。

# my.cnf 的 [mysqld] 段加(从 1 开始,逐步试,能导出数据即停)
# innodb_force_recovery = 1

# 起库后立刻导出(1-3 档相对安全)
mysqldump db_name t1 > t1_out.sql

# 官方红线:4 档及以上可能永久损坏数据文件
# 1 跳过坏页 / 2 禁后台线程 / 3 禁回滚
# 4 禁插入缓冲合并 / 5 禁undo扫描 / 6 禁redo前滚(最危险)

force_recovery 的使用纪律必须背下来:永远从 1 开始,能以低档位导出数据就绝不开高档;4 以上任何一档都可能造成不可逆的永久损坏,官方原文写得明明白白,只允许你在单独的物理副本上验证过才考虑在生产用。导出后 Drop 表、去掉 force_recovery 参数正常重启、再导入数据,这才算完整闭环。另外记住一个坑:force_recovery 模式下 InnoDB 是只读的,OPTIMIZE TABLE 之类的重建操作会直接报错,别在那里面较劲。

修完之后是防复发:查 dmesg 和 MySQL 错误日志里的硬件层报错,坏道和 RAID 卡故障是表损坏最常见的幕后真凶,只修表不修盘,过阵子还得再来一次。同时把备份策略落实——每天全备加 binlog,损坏场景下才有“回滚到任意时点”的底气。表损坏是结果不是原因,硬件健康检查和备份体系才是治本。

相关阅读:表损坏属于数据层的修复类故障。《服务器故障排查总纲:按现象反查的五层定位法》把本篇和备份、白屏排在相邻位——修不好的时候,恢复靠的就是前面建好的备份体系。

申请创业报道,分享创业好点子。点击此处,共同探讨创业新机遇!

相关文章

  • MySQL 1040 Too many connections:连接泄漏定位与上限设定

    网站隔三差五报一句数据库连接失败,刷新两下又好了。这种时好时坏的毛病最烦人,因为它不像宕机那样干脆,你没法守在屏幕前等它出现。等到真去查的时候,现场早没了。MySQL从5.7起max_connections默认就是151,8.0也沿用了这个值。超过之后新连接直接被拒,报ERROR1040。看到这个错

  • EXPLAIN结果看不懂?丢给AI要索引优化建议,人工确认再落地

    页面打开慢,查出来是某个SQL拖了后腿。你对MySQL有点基础,知道要看EXPLAIN,但type一列写着ALL,rows几万行,Extra里还有个Usingfilesort——认识每个词,就是不知道从哪下手改。这种时候,AI是个好参谋,但记住它只是参谋,拍板还得你自己来。第一步把证据收集齐:慢SQ

    标签:
    AI编程
    mysql
  • LIMIT 100000,20慢到超时?MySQL深分页的三种解法

    后台导出、爬虫采集、或者用户把列表翻到几千页——只要LIMIT的偏移量上了十万,查询就会肉眼可见地卡。很多人以为是数据太多撑不住,其实是MySQL的工作方式太老实:LIMIT100000,20的意思是把前100020行都取出来,扔掉前100000行,只返回20行。偏移量越大,白干的活越多。先复现确认

    标签:
    php教程
    mysql
  • 千万级大表加索引不敢动?Online DDL和pt-online-schema-change实测

    大表加索引是站长的经典恐惧:ALTERTABLE一执行,表被锁住,网站瞬间打不开,KILL掉还要回滚几小时。以前确实是这样,MySQL5.6之后OnlineDDL成熟了,加索引这类操作可以在线做,执行期间允许并发读写。但“可以在线”不等于“随便什么时候都行”,坑还是有的。OnlineDDL的原理:操

    标签:
    php教程
    mysql
  • 读多写少的站,主从复制加读写分离,一台变三台

    资讯类、内容站的流量特点很一致:读请求是写请求的几十上百倍。一台MySQL扛不住时,主从复制把读压力分给从库,主库专心写,是最省钱的扩容路径——不用换机器、不用改表结构,加从库就行。前提是主从复制先搭好(这个之前写过:主库开binlog、建同步账号,从库CHANGEMASTERTO)。复制跑通后,剩

    标签:
    php教程
    mysql

热门排行

信息推荐