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

在現代世界中,公司並不僅僅依賴於特定的數據庫服務器平台。有許多數據庫平台可供選擇,它們足以應對中等工作負荷以及客戶的高可用性和灾难恢復要求。MySQL是這些數據庫平台之一,它提供許多功能和高性能。

就像其他RDBMS一樣,MySQL也容易受到數據庫和表损坏的影響。最近,Microsoft和CrowdStrike引起的故障也影響了MySQL數據庫服務器。由於操作系統失敗,數據庫的表或整個數據庫會遭損壞。

在本文中,我將展示如何損壞和修復MySQL數據庫的表。這篇文章對DBAs很有幫助,可以模擬失敗,幫助他們確定恢復或修復损坏的MySQL表的最佳方法。

了解MySQL數據庫損壞

MySQL數據庫損壞可以以各種方式表現,包括:

無法訪問的表

整個表或表的特定子集變得無法訪問。當您嘗試訪問損壞的表時,您會遇到指向表的索引文件或數據文件損壞的錯誤。

數據不一致錯誤

如果表遭到损坏,而不是有意义的数据,您的查詢可能會返回一些垃圾值或不一致或 incomplete results.

意外關閉

在某些情況下,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數據庫引擎中創建任何表時,當您使用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 表格。第一個方法是使用 CHECK TABLEREPAIR TABLE 命令。

CHECK TABLE 和 REPAIR TABLE 命令

您可以使用 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:它只修復表的索引文件。它不訪問表的數據文件。
  • 延伸: 當我們使用這個選項時,命令將進行彻底的修復。它還會通過扫瞄表的所有記錄來修復或重新創建索引文件。

在這個示例中,我們已經损坏了表的索引; hence,我們將使用 QUICK 選項。執行以下命令。

Plain Text

 

截圖:

如您在上面截圖中所見,corrupt_table 已成功修復。為了核實,在 MySQL Workbench 上運行以下查詢:

MySQL

 

查詢輸出:

如您所見,現在可以存取表格。

使用 mysqldump 命令還原表

第二種方法是從備份中還原整個表。當表高度損壞且無法通過使用 REPAIR TABLE 命令進行修復時,可以使用這種方法。

要从 MySQL 表的備份中還原,我們可以使用 mysqldump 命令。您可以閱讀文章 “mysqldump — 一個數據庫備份程序” 以了解更多關於如何使用 mysqldump 命令。還原表的語法如下。

MySQL

 

在語法中:

  • 用戶名:輸入您用來連接到 MySQL 數據庫的用戶名。
  • -p:指定密碼。如果您保留為空,MySQL 將會提示您輸入密碼。
  • [數據庫名稱]:指定您嘗試還原表的數據庫名稱。
  • Table_dump.sql:請指定完整的備份檔案名稱。

為了示範,我已經備份了位於 C:\MySQLData\Backup 目錄下的 CorruptDB 資料庫。

要還原 corrupt_table,可以使用以下指令。

MySQL

 

當指令成功執行後,您將能夠存取該表格。執行以下查詢來進行驗證。

MySQL

 

查詢結果:

如您在上方截圖中所見,該表格已成功還原。

使用 phpMyAdmin

您還可以使用 phpMyAdmin 工具來修復任何損壞的 MySQL 資料庫。phpMyAdmin 是一個圖形化的使用者介面,用於管理和維護 MySQL 和 MariaDB。為了示範,我已在我的筆記型電腦上安裝了它。

  • 要修復表格,啟動 phpMyAdmin 並導航到包含損壞表格的資料庫。
  • 在右窗格中,您可以查看在 CorruptDB 資料庫中創建的表格列表。
  • 從列表中選擇 Corrupt_table,然後從下拉框中選擇 修復表格 選項。

這是一個供參考的截圖:

表格修復完成後,可以看到 corrupt_table 的狀態變為 OK。這是截圖:

結論

在本文中,我們學習了MySQL數據庫損壞的可能原因以及如何解決它們。我解釋了一個使用十六進制編輯器損壞MySQL表的步驟過程。我還覆蓋了如何使用CHECK TABLEREPAIR TABLE命令來解決它們。我們也學習了如何使用mysqldump工具來恢復表。

修復損壞的MySQL數據庫表可能會很有挑戰性,但有了正確的工具和方式,它是可以控制的。手動方法提供了一個基本解決方案,而phpMyAdmin則提供了一個綜合性強且可靠的重 Recovery option. Always ensure regular backups and maintain your database health to minimize the risk of corruption.

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