为什么 MySQL 的 REPAIR TABLE 操作期间所有行都会被清除?

为什么 MySQL 的 REPAIR TABLE 操作期间所有行都会被清除?

我在 Windows 7 机器上安装了 zpanel,用于运行 php 和 MySQL。php 和 MySQL 直到今天(2016 年 8 月 18 日)都运行良好,但今天我发现我的一个 MySQL 表无法从 php 和 phpmyadmin 访问,后来我发现它崩溃了。当我查看 phpmyadmin 时,我发现该数据库下的 MySQL 表描述中显示“正在使用”。然后我尝试在 phpmyadmin 数据库下进行 sql 查询。表已成功修复,但我的所有数据(表行)都被删除或清空(我不确定,行数为零)。有数千行数据。但是,当我将新数据插入到已修复的表中时,它正在使用之前崩溃的表的下一个 id(自动增量)。REPAIR TABLE (tablename)

我的问题是:修复后有没有办法恢复崩溃表的行?

[在自动生成的备份中,我发现崩溃的表在一个月前就已经没有行了(数据备份保留了两个月的每一天),尽管该表今天崩溃了。但同一数据库的所有其他表(共有三张表)都有完整的行。]

答案1

根据MySQL 官方文档

警告

在执行表修复操作之前,请备份表;在某些情况下,该操作可能会导致数据丢失。可能的原因包括但不限于文件系统错误。请参阅第 8 章“备份和恢复”。

您说这个表一个月前就停止有数据了,所以除非这个表位于不同的文件系统中,否则我会排除这个原因(因为您的其他表也可能受到影响)。但这也说明文件系统错误并不是唯一的原因。

在我看来,这REPAIR TABLE并没有对您的表造成任何损害,但大约 1 个月前发生的一些事件造成了损害,这就是您停止在该表中保存数据的原因。如果没有更多信息,很难给出提示,但这些可能包括:

  • 代码更改涉及DELETE FROM删除所有行的不正确语句。
  • 维护脚本运行不正常并删除了正确的行。
  • SQL 注入攻击允许远程攻击者删除该表的内容。
  • ...

相关内容