如何修复MySQL中损坏的数据表
引言
偶尔,MySQL表可能会损坏,意味着发生了错误,并且其中存储的数据无法读取。 尝试从损坏的表中读取通常会导致服务器崩溃。
一些造成数据库表损坏的常见原因有:
- The MySQL server stops in middle of a write.
- An external program modifies a table that’s simultaneously being modified by the server.
- The machine is shut down unexpectedly.
- The computer hardware fails.
- There’s a software bug somewhere in the MySQL code.
如果你怀疑其中一个表格已经损坏,你应该在进行故障排除或尝试修复表格之前备份你的数据目录。这将有助于降低数据丢失的风险。
首先,停止MySQL服务。
- sudo systemctl stop mysql
Note
然后将所有数据复制到一个新的备份目录中。在Ubuntu系统中,默认的数据目录是/var/lib/mysql/。
- cp -r /var/lib/mysql /var/lib/mysql_bkp
备份完成后,你可以开始调查这个表是否实际上已经损坏。如果这个表使用了MyISAM存储引擎,你可以通过重新启动MySQL并在MySQL提示符下运行CHECK TABLE语句来检查它是否损坏。
- sudo systemctl start mysql
- CHECK TABLE table_name;
如果这个语句的输出出现了一个消息,那么它会告诉你它是否已损坏。如果确实损坏,通常可以通过发出REPAIR TABLE语句来修复MyISAM表。
- REPAIR TABLE table_name;
假设修复成功,您将在输出中看到类似的消息。
+————————–+——–+———-+———-+ | 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
在[misqld]部分中,添加下面的一行:
/etc/mysql/mysql.conf.d/mysqld.cnf 可以用以下方式表达:
mysql的配置文件mysqld.cnf位于/etc/mysql/mysql.conf.d/。
. . .
[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的表仍可能出现损坏,但由于其自动恢复功能,表损坏和崩溃的风险显著降低。