偶尔MySQL表可能会损坏,这意味着一个错误已经发生,其中的数据是不可读。虽然这种情况非常少见,遇到了那恭喜你中招了。如果你想从损坏的表中读取数据通常会导致服务器崩溃。

一些常见的原因损坏的表:

  • MySQL服务器在写过程中停止;
  • 外部程序同时修改服务器正在修改的表;
  • 机器意外关机;
  • 计算机硬件故障;
  • MySQL代码中有个bug。

如果您怀疑其中一个表已损坏,则应该在进行故障排除或试图修复该表之前对数据目录进行备份。这将有助于将数据丢失的风险降到最低。

首先,停止MySQL服务:

sudo systemctl stop mysql

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

然后将所有数据复制到一个新的备份目录。在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;

这条语句的输出中会出现一条消息,让你知道它是否出错。如果MyISAM表确实损坏了,通常可以通过发出REPAIR table 语句来修复它:

REPAIR TABLE table_name;

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

Output+--------------------------+--------+----------+----------+
| Table                    | Op     | Msg_type | Msg_text |
+--------------------------+--------+----------+----------+
| database_name.table_name | repair | status   | OK       |
+--------------------------+--------+----------+----------+

There is rarely a need to repair InnoDB tables, as InnoDB features a crash recovery mechanism that can resolve most issues when the server is restarted. However, if you do encounter a situation where you need to rebuild a corrupted InnoDB table, the MySQL documentation recommends using the “Dump and Reload” method. This involves regaining access to the corrupted table, using the mysqldump utility to create a logical backup of the table, which will retain the table structure and the data within it, and then reloading the table back into the database.

With that in mind, try restarting the MySQL service to see if doing so will allow you access to the server:
如果表仍然损坏,MySQL文档提供了一些修复损坏表的替代方法

另一方面,如果损坏的表使用InnoDB存储引擎,那么修复它的过程将会不同。InnoDB是MySQL 8.0的默认存储引擎,它提供了自动的错误检查和修复操作。InnoDB通过对它读取的每个页面执行校验和来检查损坏的页面,如果它发现校验和不一致,它将自动停止MySQL服务器。

很少需要修复InnoDB表,因为InnoDB提供了一种崩溃恢复机制,可以在服务器重启时解决大多数问题。然而,如果你遇到需要重建损坏的InnoDB表的情况,MySQL文档建议使用备份重载方法。这包括重新访问的表,使用mysqldump的实用工具来创建一个[逻辑备份] (https://dev.mysql.com/doc/refman/5.7/en/glossary.html glos_logical_backup)表,将保留其中的表结构和数据,然后重新加载表回数据库。

考虑到这一点,尝试重启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

[mysqld]部分,添加以下内容:

/etc/mysql/mysql.conf.d/mysqld.cnf

. . .
[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的表仍然可以被损坏,但是由于它的自动恢复功能,表损坏和崩溃的风险显著降低。

Logo

更多推荐