在現代世界中,公司並不僅僅依賴於特定的數據庫服務器平台。有許多數據庫平台可供選擇,它們足以應對中等工作負荷以及客戶的高可用性和灾难恢復要求。MySQL是這些數據庫平台之一,它提供許多功能和高性能。
就像其他RDBMS一樣,MySQL也容易受到數據庫和表损坏的影響。最近,Microsoft和CrowdStrike引起的故障也影響了MySQL數據庫服務器。由於操作系統失敗,數據庫的表或整個數據庫會遭損壞。
在本文中,我將展示如何損壞和修復MySQL數據庫的表。這篇文章對DBAs很有幫助,可以模擬失敗,幫助他們確定恢復或修復损坏的MySQL表的最佳方法。
了解MySQL數據庫損壞
MySQL數據庫損壞可以以各種方式表現,包括:
無法訪問的表
整個表或表的特定子集變得無法訪問。當您嘗試訪問損壞的表時,您會遇到指向表的索引文件或數據文件損壞的錯誤。
數據不一致錯誤
如果表遭到损坏,而不是有意义的数据,您的查詢可能會返回一些垃圾值或不一致或 incomplete results.
意外關閉
在某些情況下,MySQL在存取表或使用mysqldump
進行備份時可能會當機。我曾在模擬損壞情境時遇到這個錯誤。我損壞了一個表的數據文件。在服務啟動後,當我試圖使用SELECT
語句存取表時,MySQL服務自動關閉。
數據庫操作过程中的錯誤信息
在存取損壞的表時,您可能會遇到某些錯誤,例如:
ERROR 1016: Can't open file: 'table_name.MYI' (errno: 145)
Table ‘table_name’ is marked as crashed and should be repaired
Got error 28 from storage engine
ERROR 1030: Got error 127 from storage engine
這些錯誤表明數據文件或相關索引文件已損壞。
了解損壞的根本原因對於防止未來發生並確保數據完整性至關重要。
修復MySQL表的先決條件
在嘗試任何修復之前,請確保您具有以下內容:
- 完整的MySQL數據庫備份
- 足夠的磁盤空間
- 對MySQL服務器的管理工作員權限
現在,讓我們模擬表損壞。
損壞MySQL表
在學習如何修復數據庫的過程之前,我們先來了解如何讓數據庫變壞。作為示例,我在MySQL數據庫服務器上創建了一個名叫”CorruptDB”的數據庫。我还在CorruptDB數據庫中創建了一個名叫corrupt_table
的表。
以下是創建數據庫和表的代碼。
Create database corruptDB;
Use corruptdb;
CREATE TABLE corrupt_table (
id INT AUTO_INCREMENT PRIMARY KEY,
data VARCHAR(100)
) ENGINE=MyISAM;
我通過運行以下查詢在表中添加了百万條記錄。
INSERT INTO corrupt_table (data)
SELECT CONCAT('RandomData-', FLOOR(1000 + (RAND() * 9000)))
FROM corrupt_table;
注意,表變壞的模擬是在我的筆記本電腦上進行的。不要在生產、開發或任何其他環境中嘗試。在這個演示中使用的表是用MyISAM數據庫引擎創建的。您可以閱讀替代存儲引擎以了解更多關於MySQL服務器的數據庫引擎。
我已完成以下步驟來損壞該表。
步驟1:停止MySQL服務
您需要停止MySQL服務。为此,以管理員身份運行PowerShell並運行以下命令。
net stop MySQL
或者,您也可以從服務中停止它。
步驟2:損壞表的索引文件
現在,我们必须損壞表的索引文件。当您在MyISAM數據庫引擎中創建任何表時,當您使用MyISAM數據庫引擎創建表時,會創建三個文件。
- MYD文件:此文件包含實際數據。
- MYI文件:這是索引文件。
- Frm 文件: 該文件包含一個表格結構。
我們將會毀壞索引文件。數據文件位址在預設位置,即“C:\ProgramData\MySQL\MySQL Server 8.0\Data\corruptdb。”對於毀壞,我們使用的是十六進制編輯器。
下載並安裝十六進制編輯器。使用它開啟 MYI 文件。文件看起來像以下的圖像:
將前 5 字節替換為一些隨機值。保存文件並關閉編輯器。
現在,讓我們開始服務並嘗試存取表格。
步驟 3:開始 MySQL 服務並存取表格
首先,通過在 PowerShell 中執行以下命令來開始 MySQL 服務。
net start MySQL
一旦服務開始,於 MySQL 命令행上執行以下查詢。
mysql> use corruptdb;
Database changed
mysql> select count(1) from corrupt_table;
查詢回傳了以下的錯誤:
錯誤顯示 corrupt_table
的索引已被毀壞,必須進行修復。
手動修復 MySQL 表格的方法
有幾種方法您可以使用來修復毁坏的 MySQL 表格。第一個方法是使用 CHECK TABLE
和 REPAIR TABLE
命令。
CHECK TABLE 和 REPAIR TABLE 命令
您可以使用 MySQL 的內建命令 CHECK TABLE
和 REPAIR TABLE
來恢復表格。這些命令用於診斷和修復任何 MyISAM 表格。
檢查表命令檢查表的完整性。它檢查表結構、索引和數據是否存在損壞,並顯示詳細信息。語法如下:
CHECK TABLE [option]
您可以指定不同的選項。
QUICK
:此選項快速檢查和識別損壞的索引等問題。FAST
:它檢查沒有正確關閉的表。CHANGED
:此選項僅檢查在上次CHECK TABLE
執行後更改的表。MEDIUM
:此選項檢查記錄並確認表與數據之間的链接是否正確。EXTENDED
:此選項彻底扫描並核验表結構和內容。
在這個示例中,我們將進行快速扫描。以下是命令。
CHECK TABLE corrupt_table
截圖:
如您在上面截圖中所見,錯誤指示corrupt_table
的索引損壞並需要修復。
我們將使用REPAIR TABLE
命令來修復表中的損壞。REPAIR TABLE
命令用於從損壞中恢復表結構和數據,特別是使用MyISAM數據庫引擎的表。如果表的索引損壞,REPAIR TABLE
命令將重新建立索引。
REPAIR TABLE
的語法如下:
REPAIR TABLE [option]
您可以指定以下選項:
QUICK
:它只修復表的索引文件。它不訪問表的數據文件。延伸
: 當我們使用這個選項時,命令將進行彻底的修復。它還會通過扫瞄表的所有記錄來修復或重新創建索引文件。
在這個示例中,我們已經损坏了表的索引; hence,我們將使用 QUICK
選項。執行以下命令。
REPAIR TABLE corrupt_table
截圖:
如您在上面截圖中所見,corrupt_table
已成功修復。為了核實,在 MySQL Workbench 上運行以下查詢:
use corruptdb;
select count(1) from corrupt_table;
查詢輸出:
如您所見,現在可以存取表格。
使用 mysqldump 命令還原表
第二種方法是從備份中還原整個表。當表高度損壞且無法通過使用 REPAIR TABLE
命令進行修復時,可以使用這種方法。
要从 MySQL 表的備份中還原,我們可以使用 mysqldump
命令。您可以閱讀文章 “mysqldump — 一個數據庫備份程序” 以了解更多關於如何使用 mysqldump 命令。還原表的語法如下。
mysql -u [username] -p [database_name] < [table_dump.sql]
在語法中:
用戶名
:輸入您用來連接到 MySQL 數據庫的用戶名。-p
:指定密碼。如果您保留為空,MySQL 將會提示您輸入密碼。[數據庫名稱]
:指定您嘗試還原表的數據庫名稱。Table_dump.sql
:請指定完整的備份檔案名稱。
為了示範,我已經備份了位於 C:\MySQLData\Backup 目錄下的 CorruptDB 資料庫。
要還原 corrupt_table
,可以使用以下指令。
mysql -u root -p corruptdb < C:\MySQLData\Backup\corrupt_table.sql
當指令成功執行後,您將能夠存取該表格。執行以下查詢來進行驗證。
use corruptdb;
select count(1) from corrupt_table;
查詢結果:
如您在上方截圖中所見,該表格已成功還原。
使用 phpMyAdmin
您還可以使用 phpMyAdmin 工具來修復任何損壞的 MySQL 資料庫。phpMyAdmin 是一個圖形化的使用者介面,用於管理和維護 MySQL 和 MariaDB。為了示範,我已在我的筆記型電腦上安裝了它。
- 要修復表格,啟動 phpMyAdmin 並導航到包含損壞表格的資料庫。
- 在右窗格中,您可以查看在 CorruptDB 資料庫中創建的表格列表。
- 從列表中選擇
Corrupt_table
,然後從下拉框中選擇 修復表格 選項。
這是一個供參考的截圖:
表格修復完成後,可以看到 corrupt_table
的狀態變為 OK。這是截圖:
結論
在本文中,我們學習了MySQL數據庫損壞的可能原因以及如何解決它們。我解釋了一個使用十六進制編輯器損壞MySQL表的步驟過程。我還覆蓋了如何使用CHECK TABLE
和REPAIR 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