介绍
有时,MySQL 表会损坏,这意味着发生了错误,表中存储的数据无法读取。尝试从损坏的表中读取数据通常会导致服务器崩溃。.
导致表格损坏的一些常见原因包括:
- MySQL 服务器在写入过程中停止运行。.
- 外部应用程序修改了一个表,而该表同时也被服务器修改。.
- 设备意外关机。.
- 电脑硬件故障。.
- MySQL 代码中存在软件漏洞。.
如果您怀疑某个表已损坏,在进行故障排除或尝试修复该表之前,应先备份数据列表。这有助于降低数据丢失的风险。.
首先,停止 MySQL 服务:
sudo systemctl stop mysql然后将所有数据复制到一个新的备份文件夹。在 Ubuntu 系统中,默认数据目录是 /var/lib/mysql/:
cp -r /var/lib/mysql /var/lib/mysql_bkp备份完成后,就可以检查表是否真的损坏了。如果表使用的是 MyISAM 存储引擎,可以通过重启 MySQL 并在 MySQL 提示符下运行 CHECK TABLE 语句来检查损坏情况:
sudo systemctl start mysqlCHECK 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 8.0 版本起就是默认的存储引擎,它具备自动损坏检查和修复功能。InnoDB 会对其读取的每个页面执行校验和,以此来检查是否存在损坏的页面。如果发现排序规则不一致,它会自动停止 MySQL 服务器。.
InnoDB 表很少需要修复,因为 InnoDB 具有崩溃恢复机制,可以在服务器重启后解决大多数问题。但是,如果您遇到需要重建损坏的 InnoDB 表的情况,MySQL 文档建议使用“转储并重新加载”方法。这包括恢复对损坏表的访问,使用 mysqldump 工具创建表的逻辑备份(保留表结构和其中的数据),然后将表重新加载到数据库中。.
基于此,请重启 MySQL 服务,看看是否能够访问服务器:
sudo systemctl restart mysql如果服务器宕机或无法访问,启用 InnoDB force_recovery 选项可能很有用。您可以通过编辑 mysqld.cnf 文件来实现这一点。在 Ubuntu 和 Debian 系统中,该文件通常位于 /etc/mysql 目录下。在 Red Hat 和 Rocky 系统中,该文件通常位于 /etc/my.cnf.d 目录下。.
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf在 [mysqld] 部分,添加以下行:
. . .
[mysqld]
. . .
innodb_force_recovery=1保存并关闭文件,然后重启 MySQL 服务。如果可以成功访问损坏的表,请使用 mysqldump 工具将表数据转储到一个新文件中。您可以随意命名此文件,但这里我们将其命名为 dump.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 的表仍然可能损坏,但由于其自愈功能,表损坏和故障的风险显著降低。.









