如何修复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服务。

  1. sudo systemctl stop mysql

 

Note

注意:在一些平台上(如Rocky Linux),MySQL服务可能被称为mysqld。

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

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

 

备份完成后,你可以开始调查这个表是否实际上已经损坏。如果这个表使用了MyISAM存储引擎,你可以通过重新启动MySQL并在MySQL提示符下运行CHECK TABLE语句来检查它是否损坏。

  1. sudo systemctl start mysql

 

  1. CHECK TABLE table_name;

 

如果这个语句的输出出现了一个消息,那么它会告诉你它是否已损坏。如果确实损坏,通常可以通过发出REPAIR TABLE语句来修复MyISAM表。

  1. 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服务,看看这样做是否能让您访问服务器。

  1. sudo systemctl restart mysql

 

如果服务器仍然崩溃或无法访问,则启用InnoDB的force_recovery选项可能会有所帮助。您可以通过编辑mysqld.cnf文件来完成此操作。在Ubuntu和Debian系统上,此文件通常位于etc/mysql目录中。在Red Hat和Rocky系统上,此文件通常位于/etc/my.cnf.d目录中。

  1. 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。

  1. mysqldump database_name table_name > out.sql

 

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

  1. mysql -u user -p –execute=“DROP TABLE database_name.table_name

 

接下来, 使用您刚刚创建的转储文件恢复表。

  1. mysql -u user -p < out.sql

 

请注意,InnoDB存储引擎通常比较老的MyISAM引擎更具有容错能力。使用InnoDB的表仍可能出现损坏,但由于其自动恢复功能,表损坏和崩溃的风险显著降低。

发表回复 0

Your email address will not be published. Required fields are marked *