如何修复损坏的MySQL数据库表

在现代世界中,公司不仅仅依赖于特定的数据库服务器平台。有许多数据库平台可供选择,足以处理中等工作负载和客户的高可用性和灾难恢复要求。MySQL是这些数据库平台之一,它提供了许多功能和高性能。

就像其他RDBMS一样,MySQL也容易受到数据库和表损坏的影响。最近,由于Microsoft和CrowdStrike的问题,MySQL数据库服务器也遭受了停机。由于操作系统故障,数据库的表或整个数据库都会损坏。

在本文中,我将展示如何损坏和修复MySQL数据库的表。这篇文章对DBAs很有帮助,可以模拟故障,并帮助他们确定恢复或修复损坏MySQL表的最佳可能方式。

了解MySQL数据库损坏

MySQL数据库损坏可能以各种方式表现,包括:

无法访问的表

整个表或表的特定子集变得无法访问。当你尝试访问损坏的表时,你会遇到指向表的索引文件或数据文件损坏的错误。

数据不一致错误

如果表损坏,查询可能会返回一些垃圾值或不一致或不完整的数据。

意外关机

在某些情况下,MySQL在访问表或使用mysqldump运行备份时可能会崩溃。我曾经在模拟损坏场景时遇到过这个错误。我损坏了一个表的数据文件。在启动服务后,当我尝试使用SELECT语句访问表时,MySQL服务自动崩溃。

数据库操作期间的错误消息

在访问损坏的表时,您可能会遇到某些错误,例如:

Plain Text

 

这些错误表明数据文件或相关索引文件已损坏。

了解损坏的根因对防止未来的发生和确保数据完整性至关重要。

修复MySQL表的先决条件

在尝试任何修复之前,请确保您具备以下条件:

  • 完整的MySQL数据库备份
  • 足够的磁盘空间
  • 对MySQL服务器的管理员访问权限

现在,让我们模拟表损坏。

损坏的MySQL表

在了解修复数据库的过程之前,我们首先了解如何损坏数据库。为了演示,我在MySQL数据库服务器上创建了一个名为“CorruptDB”的数据库。在CorruptDB数据库中,我还创建了一个名为corrupt_table的表。

以下是创建数据库和表的代码。

MySQL

 

我通过运行以下查询向表中添加了一百万条记录。

MySQL

 

请注意,表损坏的模拟是在我的笔记本电脑上完成的。不要在生产、开发或其他任何环境中尝试此操作。在这个演示中使用的表是使用MyISAM数据库引擎创建的。您可以阅读替代存储引擎以了解更多关于MySQL服务器数据库引擎的信息。

我已经执行了以下步骤来损坏表。

第1步:停止MySQL服务器服务

您需要停止MySQL服务器。为此,以管理员身份运行PowerShell并执行以下命令。

Plain Text

 

或者,您也可以从服务中停止它。

第2步:损坏表的索引文件

现在,我们必须损坏表的索引文件。当您在MyISAM数据库引擎中创建任何表时,在创建表时会创建三个文件。

  • MYD文件:这个文件包含实际数据。
  • MYI文件:这是一个索引文件。
  • Frm文件:该文件包含一个表格结构。

我们将损坏索引文件。数据文件位于默认位置,“C:\ProgramData\MySQL\MySQL Server 8.0\Data\corruptdb。” 为了损坏,我们使用十六进制编辑器。

下载并安装十六进制编辑器。使用它打开MYI文件。文件看起来如下图片:

将前5个字节替换为一些随机值。保存文件并关闭编辑器。

现在,让我们启动服务并尝试访问表。

步骤3:启动MySQL服务并访问表

首先,通过在PowerShell中执行以下命令来启动MySQL服务。

Plain Text

 

一旦服务启动,就在MySQL命令行上执行以下查询。

MySQL

 

查询返回了以下错误:

错误表明corrupt_table的索引已损坏,必须进行修复。

手动修复MySQL表的方法

有一些方法可以用来修复损坏的MySQL表。第一种方法是使用检查表和修复表命令。

检查表和修复表命令

您可以使用MySQL的CHECK TABLEREPAIR TABLE内置命令来恢复表。这些命令用于诊断和修复任何MyISAM表。

检查表命令用于检查表的完整性。它检查表结构、索引和数据是否存在损坏,并显示详细信息。语法如下:

Plain Text

 

您可以指定不同的选项。

  1. QUICK:此选项快速检查和识别损坏的索引等问题。
  2. FAST:它检查未正确关闭的表。
  3. CHANGED:此选项仅检查自上次CHECK TABLE执行以来更改过的表。
  4. MEDIUM:此选项检查记录,并验证表与数据之间的链接是否正确。
  5. EXTENDED:此选项彻底扫描并验证表结构及其内容。

在此演示中,我们将执行快速扫描。以下是命令。

Plain Text

 

截图:

如您在上面的截图中所见,错误指示corrupt_table的索引损坏,需要修复。

我们将使用REPAIR TABLE命令来修复表中的损坏。REPAIR TABLE命令用于从损坏中恢复表结构及数据,尤其是使用MyISAM数据库引擎的表。如果表的索引损坏,REPAIR TABLE命令将重建索引。

REPAIR TABLE的语法如下:

Plain Text

 

您可以指定以下选项:

  • QUICK:它只修复表的索引文件。它不访问表的数据文件。
  • 扩展:当我们使用这个选项时,命令将执行彻底的修复。它还会通过扫描表的所有记录来修复或重新创建索引文件。

在这个演示中,我们已经损坏了表的索引;因此,我们将使用QUICK选项。执行以下命令。

Plain Text

 

截图:

如上面的截图所示,corrupt_table已经被成功修复。为了验证,在MySQL Workbench上运行以下查询:

MySQL

 

查询输出:

如您所见,现在可以访问表了。

使用mysqldump命令恢复表

第二种方法是从备份中恢复整个表。当表高度损坏,无法通过使用REPAIR TABLE命令修复时,可以使用此方法。

要从备份中恢复MySQL表,我们可以使用mysqldump命令。您可以阅读文章”mysqldump — 数据库备份程序“以了解更多关于如何使用mysqldump命令的信息。恢复表的语法如下。

MySQL

 

在语法中:

  • Username:输入您用来连接MySQL数据库的用户名。
  • -p:指定密码。如果您留空,MySQL将提示输入密码。
  • [database_name]:指定您尝试恢复表的数据库的名称。
  • Table_dump.sql:指定备份文件的完全限定名称。

为了演示,我已经备份了位于 C:\MySQLData\Backup 目录中的 CorruptDB 数据库。

要恢复 corrupt_table,我们可以使用以下命令。

MySQL

 

命令成功执行后,您将能够访问该表。执行以下查询以验证。

MySQL

 

查询输出:

正如您在上面的屏幕截图中所看到的,该表已成功恢复。

使用 phpMyAdmin

您还可以使用 phpMyAdmin 工具来修复任何损坏的 MySQL 数据库。phpMyAdmin 是一个用来管理和维护 MySQL 和 MariaDB 的图形用户界面。为了演示,我已经在我的笔记本电脑上安装了它。

  • 要修复表,请启动 phpMyAdmin 并导航到存在损坏表的数据库。
  • 在右侧窗格中,您可以查看在 CorruptDB 数据库中创建的表的列表。
  • 从列表中选择 Corrupt_table,并从下拉框中选择 Repair table 选项。

以下是供参考的屏幕截图:

表修复完成后,您可以看到 corrupt_table 的状态变为 OK。以下是屏幕截图:

结论

在这篇文章中,我们了解了MySQL数据库损坏的可能原因以及如何修复它们。我解释了使用十六进制编辑器逐步损坏MySQL表的过程。我还介绍了如何使用`CHECK TABLE`和`REPAIR TABLE`命令来修复它们。我们还学习了如何使用`mysqldump`工具恢复表。

修复损坏的MySQL数据库表可能具有挑战性,但有了正确的工具和方法,是可以处理的。手动方法提供了一个基本的解决方案,而phpMyAdmin则提供了一个全面且可靠的恢复选项。始终确保定期备份并维护数据库健康,以最大限度地减少损坏的风险。

Source:
https://dzone.com/articles/repair-corrupt-mysql-database-tables-step-by-step