修復錯誤刪除 InnoDB ibdata 檔案資料


當錯誤刪除了 MySQL 的 InnoDB 資料庫檔案 ibdata 及 ib_logfile, 如果 MySQL 伺服器仍在執行狀態, 而且資料可以照常寫入, 切記不要關閉 MySQL 伺服器或 kill 掉 mysqld, 這時還可以將 InnoDB 資料庫修復的, 以下記錄修復的步驟, 如果要測試, 切記在測試環境進行, 切勿在生產環境測試:

1. 先找出 mysqld 的 pid, 可以用 netstat 查詢:

上面的例子看到, mysqld 的 pid 是 1921.

2. 然後執行以下指令:

要記下上面返回的結果, 上面例子只有 3 個檔案, 記下日期時間後的檔案名稱, 上面例子是 3, 8 及 9.

3. 以下步驟是登入 MySQL 並執行以下 MySQL 指令, 以下指令的作用是停止 MySQL 寫入工作:

輸入以下指令加快停止的時間:

現在要等待所有 dirty pages 完全寫入硬碟, 用 “SHOW ENGINE INNODB STATUS” 查詢:

回傳的結果很長, 需要查看其中幾項, 以確保完全沒有寫入動作, 先看 “LOG” 段落 的 “Checkpoint age”, 當看到 “Checkpoint age” 是 “0” 才完成。

然後查看 “INSERT BUFFER AND ADAPTIVE HASH INDEX” 段落的 “Ibuf”, 數值需要等於 1:

另一個要檢查的項目是 TRANSACTIONS 段落, 確保 Purge 進程把 undo log 全部清除掉, 交易 ID 要一樣:

確保 MySQL 完全沒有寫入工作後, 可以進行下一步, 複製 InnoDB 的檔案回資料庫目錄。

4. 把第 2 步看到的檔案複製到原來的 MySQL 目錄:

# cd /proc/1921/fd
# cp 3 /var/lib/mysql/ibdata1
# cp 8 /var/lib/mysql/ib_logfile0
# cp 9 /var/lib/mysql/ib_logfile1

5. 修改檔案 owner 為 mysql:

# chown mysql.mysql /var/lib/mysql/ib*

6. 最後重新啟動 MySQL 伺服器:

# systemctl restart mysql

Leave a Reply