如何修复MySQL中损坏的表

来自菜鸟教程
跳转至:导航、​搜索

有时,MySQL 表可能会损坏,这意味着发生了错误并且其中保存的数据不可读。 尝试从损坏的表中读取通常会导致服务器崩溃。

损坏表的一些常见原因是:

  • MySQL 服务器在写入过程中停止。
  • 一个外部程序修改了一个同时被服务器修改的表。
  • 机器意外关闭。
  • 计算机硬件出现故障。
  • MySQL 代码中的某处存在软件错误。

如果您怀疑您的某个表已损坏,则应在排除故障或尝试修复该表之前备份您的数据目录。 这将有助于最大程度地降低数据丢失的风险。

首先,停止 MySQL 服务:

sudo systemctl stop mysql

然后将所有数据复制到新的备份目录中。 在 Ubuntu 系统上,默认数据目录为 /var/lib/mysql/

cp -r /var/lib/mysql /var/lib/mysql_bkp

进行备份后,您就可以开始调查表是否实际上已损坏。 如果该表使用 MyISAM 存储引擎,您可以通过在 MySQL 提示符下运行 CHECK TABLE 语句来检查它是否已损坏:

CHECK TABLE table_name;

此语句的输出中将出现一条消息,让您知道它是否已损坏。 如果 MyISAM 表确实损坏了,通常可以通过发出 REPAIR TABLE 语句来修复它:

REPAIR TABLE table_name;

假设修复成功,您将在输出中看到如下消息:

Output+--------------------------+--------+----------+----------+
| Table                    | Op     | Msg_type | Msg_text |
+--------------------------+--------+----------+----------+
| database_name.table_name | repair | status   | OK       |
+--------------------------+--------+----------+----------+

但是,如果表仍然损坏,MySQL 文档建议使用一些 替代方法来修复损坏的表

另一方面,如果损坏的表使用InnoDB存储引擎,那么修复它的过程会有所不同。 InnoDB 是 MySQL 5.5 版本中的默认存储引擎,它具有自动损坏检查和修复操作的功能。 InnoDB 通过在读取的每个页面上执行校验和来检查损坏的页面,如果发现校验和不一致,它将自动停止 MySQL 服务器。

很少需要修复 InnoDB 表,因为 InnoDB 具有崩溃恢复机制,可以在服务器重新启动时解决大多数问题。 但是,如果您确实遇到需要重建损坏的 InnoDB 表的情况,MySQL 文档建议使用 “Dump and Reload”方法。 这涉及重新获得对损坏表的访问权限,使用 mysqldump 实用程序创建表的 逻辑备份 ,它将保留表结构和其中的数据,然后重新加载表回数据库。

考虑到这一点,尝试重新启动 MySQL 服务,看看这样做是否允许您访问服务器:

sudo systemctl restart mysql

如果服务器仍然崩溃或无法访问,那么启用 InnoDB 的 force_recovery 选项可能会有所帮助。 您可以通过编辑 mysqld.cnf 文件来做到这一点:

sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

[mysqld] 部分中,添加以下行:

/etc/mysql/mysql.conf.d/mysqld.cnf

. . .
[mysqld]
. . .
innodb_force_recovery=1

保存并关闭文件,然后再次尝试重新启动 MySQL 服务。 如果您可以成功访问损坏的表,请使用 mysqldump 实用程序将表数据转储到新文件中。 您可以随意命名此文件,但这里我们将其命名为 out.sql

mysqldump database_name table_name > out.sql

然后从数据库中删除表。 为避免必须重新打开 MySQL 提示符,您可以使用以下语法:

mysql -u user -p --execute="DROP TABLE database_name.table_name"

在此之后,使用您刚刚创建的转储文件恢复表:

mysql -u user -p < out.sql

请注意,InnoDB 存储引擎通常比旧的 MyISAM 引擎具有更高的容错性。 使用 InnoDB 的表仍然可以 损坏,但由于其 自动恢复功能 ,表损坏和崩溃的风险明显降低。