当MySQL数据库和表损坏或损坏时,您应该做的第一件事是确定损坏背后的可能原因。以下是MySQL数据库损坏的一些常见原因:
- 错误的硬件
- MySQL软件bug
- MySQL服务异常终止
- 由于内存不足或损坏MySQL数据文件/索引文件导致服务器崩溃
如何识别腐败的MySQL数据库和表?
当MySQL数据库及其表发生损坏时,您可以通过检查MySQL错误日志找到有关可能遇到的不同数据库问题的相关信息。您可以在“my.ini文件中指定的数据目录”中找到错误日志。Windows下data目录的默认位置如下:
C:\Program Files\MySQL\MySQL Server 8.0\data或C: \ ProgramData \ MySQL
注意:默认情况下,“C:\ProgramData”目录是隐藏的。您需要更改文件夹选项以查看目录和内容。
要在其他平台(如Ubuntu)中查找错误日志,请检查变量log_error。
注意:有关MySQL错误日志的更多详细信息,请参阅此链接。
要识别表损坏,请运行以下命令:
- 如果你的服务器还在运行,你正在使用MyISAM/InnoDB数据库引擎,使用CHECK TABLE语句检查单个或多个表的错误。CHECK TABLE命令的语法为:
检查表tablename [,tablename2…]][选项][option2…) |
要更深入地检查表,请使用以下可用选项:
表1 -检查表检查选项
选项名称 |
描述 |
快速 |
顾名思义,这是检查表是否损坏的最快选项。它避免了扫描行中不正确的链接。此选项适用于InnoDB和MyISAM表和视图。 |
快 |
它只检查没有正确关闭的MyISAM表。 |
改变了 |
检查未正确关闭或自上次检查以来已更改的MyISAM表。 |
媒介 |
该选项仅适用于MyISAM表和视图。它扫描行以验证删除的链接是否正确。它还通过计算行的键校验和来验证键的计算校验和。 |
扩展 |
它是最慢的选项,因为它对每行的所有键执行全键查找。如果其他检查没有报告任何错误,但您怀疑数据库表已损坏,则使用此选项。 |
- 另一个可以用来检查表错误的命令是mysqlcheck。mysqlcheck命令的语法如下:
Mysqlcheck [options] dbname tablename [tablename2…]] |
与检查表有关的选项如下所示:
表2 - mysqlcheck表检查选项
选项名称 |
描述 |
——检查 |
检查表中的错误 |
——所有数据库 |
检查所有数据库表是否有错误 |
——check-only-changed |
只检查自上次检查以来已更改的表 |
——扩展,- e |
检查表需要很长时间,但可以确保表是100%一致的 |
——快 |
只检查未正确关闭的表 |
——medium-check |
与——extended操作相比,执行检查的速度更快 |
——快速 |
这是检查表是否损坏的最快选项 |
- 如果服务器宕机或数据库表无法访问,请运行myisamchk命令。语法是:
Myisamchk[选项]表名MYI |
下表列出了检查表的选项:
表3 - myisamchk表检查选项
选项名称 |
描述 |
——检查- c |
检查表错误的默认选项 |
——check-only-changed |
仅检查自上次检查以来已更改的表 |
——延长止 |
仔细检查一下桌子。如果表有很多行,这个过程将花费一些时间。 |
——快,- f |
只检查没有正确关闭的表 |
信息,我 |
只打印被检查的表的统计信息 |
——medium-check |
检查表的速度比——extend-check操作快 |
- - -只读 |
不要将表格标记为已检查。使用此选项检查正在被其他不使用锁定的应用程序使用的表 |
注意:如果表的状态为OK(如下面的代码片段所示),则不需要修复表。
+--------------------+--------+-------------+--------------+
| Table | Op | Msg_type | Msg_text |
+---------------------+--------+--------------+-------------+
| databasetable1 | check | status | OK
+---------------------+--------+------------=-+-------------+
但是,如果状态不是OK,则表示表已损坏,需要修复。
修复MySQL数据库和表
当MySQL数据库及其表损坏时,从上次已知的良好备份中恢复数据库。但是必须使用更新后的备份使数据库联机。
即使您有最新的可用备份,您也可能希望尝试修复和恢复MySQL数据库和表,因为使数据库联机可能花费更少的时间。
手动修复MySQL数据库和表的方法
注:
- 在修复损坏的MySQL数据库表之前,请确保对其进行备份。这将防止进一步的数据损坏。
- 如果您已经发现了损坏的InnoDB表,请跳到InnoDB崩溃恢复。
方法1 -使用修理表法
注意:repair TABLE命令只能修复MyISAM表、ARCHIVE表和csv表。
如果在MyISAM数据库表中发现了损坏,请尝试使用REPAIR table语句修复表。修复单个表的语法是:
修复表表名[选项] |
注意:将tablename替换为损坏的数据库表的名称。
执行如下MySQL命令修复数据库中的所有表:
Mysqlcheck——repair——databasename |
请参考下表检查REPAIR table选项:
表4 -修理表选项
选项名称 |
描述 |
快速 |
这是只修复数据文件而不修复索引文件的最快选项 |
扩展 |
尝试从数据文件中恢复所有可能的行。将此选项作为最后的手段,因为它还会发现许多垃圾行。 |
USE_FRM |
如果.MYI索引文件丢失或头文件损坏,请使用此选项 |
您还可以使用mysqlcheck命令行实用程序来修复MyISAM数据库表。该实用程序提供命令行访问REPAIR TABLE语句。运行以下命令从命令行修复指定的表:
修复databasename表名 |
要修复MySQL数据库中的所有表,使用如下命令:
Mysqlcheck——修复——所有数据库 |
方法2 -使用MySQL内置修复选项
MySQL提供了两个内置选项来修复数据库表的损坏:
2.1.使用myisamchk命令行实用程序
注意:执行myisamchk命令前,请确保使用service mysqld stop命令停止MySQL服务器。这对于防止用户在处理损坏的表时访问它们非常重要。
运行带“——recover”选项的myisamchk恢复MyISAM表:
Myisamchk—恢复表名 |
'——recover '选项是执行MyISAM表恢复的默认选项。如果该选项失败,请尝试运行带——safe-recover选项的myisamchk命令:
Myisamchk——安全恢复表名 |
——safe-recover选项比默认恢复选项慢,因为MySQL一次扫描数据文件中的每条记录,然后恢复索引。使用myisamchk修复表后,重新启动MySQL服务器。
2.2.InnoDB崩溃恢复
要修复MySQL InnoDB表,请尝试运行InnoDB恢复进程。按照以下步骤修复损坏的InnoDB表:
步骤1:在MySQL服务器上找到并打开配置文件my.cnf。
步骤2:找到[mysqld]段,然后添加以下语句:
(mysqld) Innodb_force_recovery = 1 重启mysql服务 |
注意:innodb_force_recovery默认值为' 0 ',但您可能需要将该值更改为' 1 '以启动InnoDB db引擎并转储表。您可能需要将innodb_force_recovery值增加到4或更高来转储您的表;但这涉及到数据丢失的风险。
步骤3:当您能够启动数据库时,将所有数据库导出到转储文件。sql文件:
Mysqldump——all-databases——add-drop-database——add-drop-table > dump.sql |
步骤4:现在重新启动服务器,并使用drop database命令删除单个受影响的数据库或所有数据库。
注意:如果不能删除数据库,请停止mysql服务器,然后运行以下命令手动删除数据库:
cd /var/lib/mysql
Rm -rf db_name
步骤5:一旦db被删除,禁用InnoDB恢复模式。为此,在[mysqld]中注释以下行:
# innodb_force_recovery =… |
步骤6:保存my.cnf文件,然后再次启动MySQL服务器。
执行这些步骤有望帮助您恢复InnoDB表。如果执行恢复失败,请使用专业的MySQL数据库修复软件修复数据库并恢复其所有数据。
修复损坏的MySQL数据库和表的快速解决方案
对损坏的数据库和表进行故障排除可能需要花费大量时间,并且可能无法产生预期的结果。您可能会遇到数据不一致错误。使用MySQL的恒星修复软件可以快速修复损坏的MySQL数据库并恢复所有表和其他对象,保持数据完整。该软件在几个简单的步骤中执行修复,不需要编写多行代码。
来自Stellar®的MySQL修复软件的一些关键功能如下:
- 修复MySQL InnoDB和MyISAM数据库表
- 修复损坏的MySQL数据库在Windows和Linux系统
- 恢复所有数据库对象,包括表,键,视图,触发器等。
- 修复多个损坏的MySQL数据库文件在一个单一的进程
- 预览所有可恢复的MySQL数据库对象
步骤修复MySQL数据库和表使用恒星修复MySQL软件
步骤1:运行MySQL的恒星修复软件主界面打开选择数据文件夹对话框。选择您正在使用的MySQL版本,然后浏览要修复的数据库文件。点击好吧。
图1 -选择MySQL版本
第二步:从选择数据库对话框中,选择要修复的单个或所有数据库。
图2 -选择要修复的数据库
第三步:点击修复开始修复损坏的MySQL数据库。
第四步:当修复完成消息框出现时,点击好吧按钮。
步骤5:预览窗口在左侧窗格中显示所有可恢复的数据库表和其他组件。单击表以在右窗格中查看其内容。
图3 -可恢复的MySQL数据库对象预览
步骤6:从预览窗口中选择要恢复的表,然后选择保存在文件菜单。
第七步:在保存数据库对话框中,执行以下操作:
- 选择MySQL下另存为
- 要在线保存修复后的MySQL数据库,请通过在下面指定所需的详细信息连接到MySQL服务器连接到服务器。
- 点击保存。
图4 - MySQL数据库文件保存选项
第八步:当保存完整的弹出消息框,点击好吧。
图5 -保存完整消息框
修复后的数据库和表现在将被保存。
结论
您可以按照本文中介绍的分步指导手动修复损坏的MySQL数据库和表。但是,手动对损坏的数据库进行故障排除可能会花费大量时间,并导致数据不一致。但是使用Stellar Repair for MySQL软件可以帮助你快速修复损坏的数据库(InnoDB和MyISAM)表的原始格式。