搜索全站
数据库 7 分钟阅读

Table is marked as crashed and should be repaired 怎么修复

网站提示 Table is marked as crashed and should be repaired?本文讲清MySQL表崩溃的成因,提供phpMyAdmin、SQL命令、命令行三种修复方式,附check和repair语句,WordPress站长可直接照做。

U
UFO_PF 2020-01-10 · 阅读 7 分钟
Ta 数据库
阅读提示
本文约 2,630 字,预计阅读 7 分钟。文中命令与配置均经过实测,可直接参考执行。

引言

很多站长第一次看到 “Table is marked as crashed and should be repaired” 这行英文报错时都会心里一紧,因为它通常伴随网站直接打不开或者某个功能失灵。这句报错的意思是”这张表被标记为已崩溃,需要修复”,MySQL 在检测到表文件内部状态不一致时,就会给它打上这个标记,之后的查询会被拒绝执行。它出现的场景很典型:服务器突然断电、被强制重启,磁盘写满,MySQL 进程被系统杀掉,或者主机商搬迁移机时数据没同步完。报错里通常会带上表名,比如 Table './db/wp_options' is marked as crashed and should be repaired。看到它不用慌,这是 MySQL 在保护数据,不是数据彻底没了,按本文步骤修复即可恢复。

故障原因分析

  1. 表在写入时被强制中断。这是最常见的原因。MyISAM 引擎的表没有事务保护,写数据一半时进程被杀,表头里的状态位就被标记成 crashed。InnoDB 表由于有重做日志和崩溃恢复,出现这个提示的概率低很多,但并非为零。
  1. 磁盘空间不足或磁盘故障。当磁盘写满,MySQL 无法完成刷盘操作,表文件就会不一致,被标记为崩溃。硬盘出现坏道也会导致同类问题。
  1. MySQL / MariaDB 进程异常退出。内存不足触发 OOM Killer、被运维误 kill、配置文件错误导致启动失败,都可能中断正在进行的写入。
  1. 不安全的关机或宿主机故障。云主机的物理机重启、断电,虚拟磁盘缓存丢失,都容易让表崩溃。
  1. 表文件被外部程序错误修改。比如有人直接拿超大的 .sql 文件在 phpMyAdmin 里导入,中途连接断开,表被留在中间状态。

分步解决方案

操作前的准备

第一步永远是备份。把整个数据库导出成 .sql 文件存到本地,或者对数据目录做快照。尤其是要修复的表里有重要内容时,备份是唯一的后悔药。同时尽量停止 WordPress 的写入,最简单的方法是把网站临时切换成维护模式,或者暂时关掉评论、缓存插件,避免修复过程中还有新数据写进来。

方法一:phpMyAdmin 图形化修复

  1. 登录 phpMyAdmin,左侧选中出问题的数据库。
  2. 找到报错里提到的那张表,注意它的真实前缀可能是 wp_ 也可能是你自定义的,比如 abc_posts。
  3. 勾选这张表,底部”选中项”里选择”修复表(Repair table)”,执行。
  4. 看返回结果,出现 “OK” 就成功了。若提示 “Table does not support repair” 之类,说明是 InnoDB 表,可参考方法三处理。

方法二:SQL 命令修复(推荐)

在 phpMyAdmin 顶部点”SQL”,把 wp_options 换成你实际报错的表名,逐条执行:

CHECK TABLE wp_options;
REPAIR TABLE wp_options;
CHECK TABLE wp_options;

先 CHECK 确认状态,再 REPAIR 修复,最后再 CHECK 复查是否恢复 OK。如果一次没修好,可以再执行一次。对于 MyISAM 表,还可以启用扩展修复:

REPAIR TABLE wp_options EXTENDED;

如果提示 Table 'xxx' doesn't exist,说明表前缀写错了,去数据库列表里核对真实表名。

方法三:SSH 命令行修复(InnoDB 表或大批量)

如果能登录服务器,用 mysql 客户端会更稳。先确认数据表对应的存储引擎:

SHOW TABLE STATUS LIKE 'wp_options';

看 Engine 一列。MyISAM 用 REPAIR 即可;InnoDB 表若被标记 crashed,可以先尝试让 MySQL 自行恢复,或在停机状态下用 innodb_force_recovery 启动。一般做法是进入 mysql 命令行:

mysql -u 数据库用户 -p 数据库名

然后:

REPAIR TABLE wp_options;

如果单表修不好,可以用 myisamchk 工具,但必须先把 MySQL 服务停掉,否则会二次损坏:

myisamchk -r /var/lib/mysql/数据库名/wp_options

具体路径按你的 MySQL 数据目录来。修完再启动 MySQL。

方法四:用 WP-CLI 一键检查修复

WordPress 用户最省事的办法。进入网站根目录执行:

wp db check
wp db repair

第一条列出所有表状态,第二条自动修复。修完再跑一次 wp db check 确认。

修复后验证

无论用哪种方法,修好之后都要做三件事:一是重新访问网站前台和后台,确认功能正常;二是执行 CHECK TABLE 或 wp db check 复查;三是查一下磁盘空间和 MySQL 错误日志,确认不是空间导致的反复崩溃。

常见踩坑点

  1. 表名或前缀没换。报错里明明写着 wp_options,你却在修 wp_posts,白忙一场。以报错提示的表名为准。
  2. 对 InnoDB 表用 REPAIR 无效却以为没救。InnoDB 通常不需要也不支持这种修复,应该靠崩溃恢复或从备份还原。
  3. 不停 MySQL 就跑 myisamchk。在线操作会严重损坏表,务必先停服务。
  4. 只修了报错那一张,忽略同批损坏的表。断电往往同时打坏多张表,建议对整库做一次 wp db check。
  5. 修复前忘记备份。修复失败时没有回退余地,风险很高。
  6. 反复崩溃却不排查根因。如果同一张表天天崩,多半是磁盘快满或硬件有问题,要尽快联系主机商。

总结

“Table is marked as crashed and should be repaired” 本质上是 MySQL 在提醒你某张表需要一次修复,它并不是无法挽回的绝症。对 WordPress 站长来说,优先用 phpMyAdmin 的修复表功能或 wp db repair 命令处理,MyISAM 表用 SQL 的 REPAIR 语句,InnoDB 表则要谨慎对待、必要时从备份恢复。记住”先备份、再停写、后修复、终复查”的顺序,这类 MySQL表崩溃修复动作其实并不难,绝大多数情况下十分钟就能让网站重新跑起来。

U
UFO_PF作者

专注 WordPress 生态的实战作者,内容以「可复制、可验证」为第一原则。

留下你的想法

邮箱地址不会被公开。带 * 的为必填项。