如何修复MySQL 数据库

MySQL 提供了几种不同的方法来分析和修复数据库。出现错误和异常的原因有很多,其中一些包括:
MySQL 更新或降级。
索引或数据的快速变化。
表不一致。
在检查损坏的数据和修复表时,修复错误所采取的步骤取决于您连接到数据库的方式、数据库服务器状态、错误类型和使用的数据库引擎。
晓林电脑服务公司向您展示了对 MySQL 数据库进行故障排除和修复的多种方法。

先决条件
具有 root 权限的终端或命令行。
已安装并配置MySQL 8.0 版。
损坏的数据库或数据库表。
如何检查 MySQL 表是否有错误
运行诊断程序是对问题进行故障排除的第一步。有两种方法可以检查MySQL表的错误:
通过 MySQLCHECK TABLE查询。
使用终端程序mysqlcheck。
使用 CHECK TABLE 检查表
该CHECK TABLE查询在服务运行时在 MySQL 中工作。一般用途是:
CHECK TABLE <table name> [, table name, table name] [option] [option];
最简单的用法是一张没有任何选项的表格:
CHECK TABLE <table name>;
查询的输出CHECK TABLE显示了有关检查结果的信息表:

检查表格时可用的选项是:
FOR UPGRADE- 发现版本不一致。例如,MySQL 8.0不支持两位数的年份,因此包含此类值的表被标记为升级。
QUICK- 不检查不正确链接的行。这有助于避免超时。
FAST- 对未正确关闭的表执行检查。
CHANGED- 仅检查自上次检查以来发生更改或未正确关闭的表。
MEDIUM- 检查表行以验证已删除链接的有效性并对行执行校验和。
EXTENDED- 检查完全一致性。
没有任何选项,对MyISAM表和视图CHECK TABLE执行MEDIUM检查。和对 InnoDB 引擎表和视图执行检查,而忽略其他选项。FOR UPGRADEQUICK
您还可以组合选项进行更详细的检查。例如,要快速检查表是否已充分关闭,请运行:
CHECK TABLE <table name> FAST QUICK;
任何不适用于表格的选项都将被忽略。
使用 mysqlcheck 检查表
该mysqlcheck命令是CHECK TABLE. 该程序在 MySQL 服务运行时在终端中运行。要执行检查:
1. 以root用户身份导航到存储数据库的目录:
sudo su
cd /var/lib/mysql
2. 检查整个数据库:
mysqlcheck <database name>

或者,通过提供表名来检查数据库中的特定表:
mysqlcheck <database name> <table name>

如何修复 MySQL 数据库
有几种方法可以修复 MySQL 中的数据库。但是,请记住,这些方法不是快速修复方法,可能会导致数据丢失。如果数据库表经常损坏,请确定发生的原因。
在进行任何更改和开始修复之前,请创建目录目录的副本:
cp -rfv /var/lib/mysql /var/lib/mysql_copy
或者,在尝试任何修复解决方案之前制作数据库的备份版本。按照我们的指南:IT外包 服务器虚拟化 数据存储 数据备份 数据恢复IT外包 服务器虚拟化 数据存储 数据备份 数据恢复
您将在下面找到如何修复 MySQL 数据库的三个选项。
使用 REPAIR TABLE 查询修复 MySQL 数据库
扫描并定位有问题的数据库和表后,解决问题的最快方法是使用REPAIR TABLE查询:

如果在修复过程中服务器关闭,请在REPAIR TABLE服务器重新启动时重新运行该操作。确保在对同一个表执行任何其他操作之前执行此操作。在正常情况下,MyISAM 表使用此方法不会导致数据丢失。
使用 mysqlcheck 修复 MySQL 数据库
mysqlcheck命令是在终端中修复数据库表的替代方法。
1. 首先,以 root 用户身份导航到 MySQL 数据库文件夹:
cd /var/lib/mysql
2 -r、在mysqlcheck命令中添加修复数据库表的选项:
mysqlcheck -r <database> <table name>

该mysqlcheck -r命令是REPAIR TABLE查询的终端版本。
使用 ALTER TABLE 修复 MySQL 数据库
使用该ALTER TABLE查询使用相同的存储引擎重建表。例如,如果您有一个 InnoDB 表,请运行:
ALTER TABLE <table name> ENGINE = InnoDB;
要重建 MyISAM 表,请使用:
ALTER TABLE <table name> ENGINE = MyISAM;
如果您不确定表使用哪个存储引擎,请运行以下查询以找出:
SHOW CREATE TABLE <table name>;

对 MySQL 数据库运行特定于引擎的诊断和修复
根据使用的数据库引擎,MySQL 提供特定于引擎的方法来分析和修复数据库表。
MyISAM 表容易损坏。但是,大多数时候错误很容易修复。
使用 InnoDB 数据库时,校验和值不匹配时会出现损坏。错误通常是由于断电或其他一些硬件问题而发生的。
使用 myisamchk 检查和修复 MyISAM 表
MySQL 为 MyISAM 表提供了一个特定的检查器。
1. 关闭 MySQL 服务器。打开终端并运行:
systemctl mysql stop
2. 作为 root 用户,导航到数据库的位置:
cd /var/lib/mysql/<database name>
3. 要检查特定表,请运行:
myisamchk <table name>
4. 通过运行修复表:
myisamchk --recover <table name>
5.重启MySQL服务器:
systemctl restart mysql
6.最后,在恢复后检查MySQL中的表:
sudo mysql -u <user> -p <password>
USE <database name>;
SELECT * FROM <table name> LIMIT 4;

运行 InnoDB 恢复过程
MySQL 文档建议为 InnoDB 数据库运行 InnoDB 恢复过程。
IT外包 服务器虚拟化 数据存储 数据备份 数据恢复IT外包 服务器虚拟化 数据存储 数据备份 数据恢复
1. 使用您喜欢的文本编辑器找到并打开全局配置文件。对于 Ubuntu 和 Debian 系统,位置是:
cd /etc/mysql/my.cnf
注意:对于 CentOS 和 Fedora,位置是:
cd /etc/my.cnf
2. 将以下选项添加到my.cnf文件:
[mysqld]
innodb_force_recovery=4
默认情况下,强制恢复选项设置为 0(关闭)并上升到 6。每个新级别都包含较低数字的恢复功能。
3. 保存并关闭文件。
4. 重启 MySQL 服务器以确保应用新的配置文件:
systemctl restart mysql
5. 在主文件夹中,使用以下命令将所有数据库导出到备份文件mysqldump:
sudo mysqldump --all-databases --add-drop-database --add-drop-table --routines > <file name>.sql
6. 启动 MySQL 客户端并删除所有受影响的数据库表。要删除数据库表,请尝试:
DROP TABLE IF EXISTS <table name>;
如果表没有删除,请尝试手动删除数据库表。以 root 用户身份登录并导航到数据库所在的目录:
sudo su
cd /var/lib/mysql/<database name>
删除数据库表:
rm -r <table name>
7. 停止 MySQL 服务器:
systemctl stop mysql
8.在my.cnfinnodb_force_recovery文件中,将步骤2中添加的禁用恢复模式的选项注释掉。然后,保存文件并关闭。
9. 再次启动 MySQL 服务器:
systemctl start mysql
10. 从MySQL shell 中的备份.sql文件恢复数据库。登录 MySQL 客户端:
sudo mysql -u <username> -p <password>

USE <database name>;
# Turning off auto commit is optional and speeds things up for larger databases
SET autocommit=0;
SOURCE <file name>.sql;
12. 最后,测试数据库以确认一切正常。如果不是,请从备份中恢复数据库并尝试另一种方法。
结论
本教程概述了修复 MySQL 数据库的几种不同方法。由于必然会发生数据库损坏,因此 MySQL 提供了多种方法来发现和修复数据库中的错误,本文概述了其中的一些方法。
但是,由于恢复有时会导致数据丢失,保护信息的最佳方式是创建定期备份并遵循最佳数据库安全实践。