線上服務器誤執行 rm -f ibdata1 ib_logfile*,但 MySQL 進程仍在運行,業務讀寫看似正常。
已刪除但被進程持有的文件,實際數據仍駐留磁碟,可通過 /proc/PID/fd/ 訪問:
ls -la /proc/$(pidof mysqld)/fd/ | grep -E 'ibdata|ib_log'
# 輸出示例:
# lrwx------ 1 mysql mysql 64 Jan 15 10:00 3 -> /var/lib/mysql/ibdata1 (deleted)
InnoDB Buffer Pool 中的髒頁未刷盤,直接複製文件會導致:
mysql> FLUSH TABLES WITH READ LOCK;
mysql> SET GLOBAL innodb_max_dirty_pages_pct=0; -- 強制加速髒頁刷盤
mysql> SHOW ENGINE INNODB STATUS\G
# 關鍵指標:
# Log sequence number: 363096003
# Log flushed up to: 363096003
# Last checkpoint at: 363096003
# checkpoint age = LSN - Last checkpoint = 0 表示刷盤完成
# INSERT BUFFER
Ibuf: size 1, free list len ..., seg size ...
# PURGE THREAD
Purge done for trx's n:o < 16644 undo n:o < 0
# FILE I/O 所有線程處於 waiting 狀態,Pending flushes = 0
PID=$(pidof mysqld)
cp /proc/$PID/fd/3 /var/lib/mysql/ibdata1
cp /proc/$PID/fd/8 /var/lib/mysql/ib_logfile0
cp /proc/$PID/fd/9 /var/lib/mysql/ib_logfile1
chown mysql:mysql /var/lib/mysql/ib*
systemctl restart mysqld
ibdata* 刪除事件innodb_file_per_table=ON 降低單點故障影響面利用 Linux 文件描述符特性搭配 InnoDB 刷盤機制,可在不停機情況下實現物理文件級災難恢復。核心在於「鎖表 → 刷盤驗證 → 文件找回 → 重啟驗證」的標準化流程執行。