介绍
偶尔,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 的表仍会被破坏,但由于其 自动恢复功能,表破坏和崩溃的风险显著降低。