本指南旨在作为故障排除资源和诊断MySQL设置的起点。

有时,MySQL表损坏,这意味着发生了错误,并且其中的数据无法读取。

损坏表的一些常见原因是:MySQL服务器在写数据的时候停止。外部程序同时修改由服务器修改的表。机器意外关闭,计算机硬件失败,在MySQL代码中有软件BUG。

如果你怀疑某个表已损坏,则应在故障排除之前对数据目录进行备份或修复表,这将有助于减少数据丢失的风险。

首先,停止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文档建议使用转储和重新加载的方法,这包括重新获取对已损坏表的访问,使用mysqldump实用程序创建表的逻辑备份,然后将表重新加载回数据库。

请注意,重新启动MySQL服务以查看这样做是否允许你访问服务器:sudo systemctl restart mysql

如果服务器仍然崩溃或无法访问,那么启用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实用工具将表数据转储到新文件,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的表仍然可能被破坏,由于它自动恢复功能的存在,表损坏和崩溃的风险就明显降低了。