如何修复 MySQL 中损坏的表

介绍

偶尔,MySQL表可能会被破坏,这意味着发生了错误,其中包含的数据是不可读的。

一些腐败桌子的常见原因是:

  • MySQL 服务器在写作中间停下来. * 外部程序修改了由服务器同时修改的表. * 机器意外关闭. * 计算机硬件故障. * MySQL 代码中某处有软件错误。

如果您怀疑其中一个表被破坏,您应该在解决问题或尝试修复表之前备份您的数据目录,这将有助于减少数据丢失的风险。

首先,停止 MySQL 服务:

1sudo systemctl stop mysql

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

在Ubuntu系统中,默认数据目录是 /var/lib/mysql/:

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

备份后,您已经准备好开始调查表是否实际上损坏了。如果表使用了 MyISAM 存储引擎,您可以通过重新启动 MySQL 并从 MySQL 提示中运行一个‘CHECK TABLE’ 声明来检查表是否损坏了:

1sudo systemctl start mysql
1CHECK TABLE table_name;

如果 MyISAM 表确实受损,通常可以通过发出一个修复表声明来修复它:

1REPAIR TABLE table_name;

假设修复成功,您将在输出中看到这样的消息:

1[secondary_label Output]
2+--------------------------+--------+----------+----------+
3| Table                    | Op     | Msg_type | Msg_text |
4+--------------------------+--------+----------+----------+
5| database_name.table_name | repair | status   | OK       |
6+--------------------------+--------+----------+----------+

但是,如果表仍然损坏,那么MySQL文档会建议一些替代方法来修复损坏的表(https://dev.mysql.com/doc/refman/5.7/en/rebuilding-tables.html)。

另一方面,如果损坏的表使用InnoDB存储引擎(https://dev.mysql.com/doc/refman/5.7/en/innodb-storage-engine.html),那么修复的过程将有所不同。InnoDB是MySQL的默认存储引擎,从版本8.0开始,它具有自动破坏检查和修复操作。

很少需要修复InnoDB表格,因为InnoDB具有崩溃恢复机制的特点,可以在服务器重启时解决大多数问题. 然而,如果您确实遇到需要重建被损坏的InnoDB表格的情况,MySQL文档建议使用["倾出再装入"方法 (https://dev.mysql.com/doc/refman/5.7/en/rebuilding-tables.html# rebuilding-tables-dump-reload). 这涉及重新访问被损坏的表格,使用mysqldump工具创建表格的[逻辑备份(https://dev.mysql.com/doc/refman/5.7/en/glossary.html# glos_logical_backup),它将保留表格结构和其中的数据,然后将表格重新装入数据库.

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

1sudo systemctl restart mysql

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

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

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

1[label /etc/mysql/mysql.conf.d/mysqld.cnf]
2. . .
3[mysqld]
4. . .
5innodb_force_recovery=1

保存并关闭文件,然后尝试重新启动MySQL服务. 如果您可以成功访问破坏的表,请使用mysqldump实用程序将您的表数据投放到新文件中。

1mysqldump database_name table_name > out.sql

然后从数据库中放下表格,以避免重新打开 MySQL 提示,您可以使用以下语法:

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

接下来,恢复您刚刚创建的 dump 文件的表:

1mysql -u user -p < out.sql

请注意,InnoDB 存储引擎通常比旧的 MyISAM 引擎更耐错误。使用 InnoDB can 的表仍会被破坏,但由于其 自动恢复功能,表破坏和崩溃的风险显著降低。

Published At
Categories with 技术
comments powered by Disqus