首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 誤刪 ibdata1 後的緊急恢復實戰(利用 /proc 文件系統)

     編輯:MySQL 資料庫相關知識

線上誤刪 ibdata1、ib_logfile* 並不代表資料立即丟失——只要 mysqld 進程還在,Linux 會在 /proc/PID/fd/ 保留被刪除檔案的開啟檔案描述符。本文實戰恢復全流程。

核心原理

  • Linux:檔案被刪除但仍有進程持有 fd → 實體資料仍在磁碟,目錄項消失。
  • /proc/PID/fd/N 是指向該檔案的符號連結,可 cp 出來。
  • InnoDB:Buffer Pool 中的髒頁必須先 flush 到磁碟,否則複製出來的檔案不一致。

恢復步驟(生產環境實操)

  1. 鎖表停寫,強制 Flush 髒頁
    
    mysql> FLUSH TABLES WITH READ LOCK;
    mysql> SET GLOBAL innodb_max_dirty_pages_pct = 0;  -- 加速 flush
    -- 觀察 checkpoint age 歸零
    mysql> SHOW ENGINE INNODB STATUS\G
    -- LOG SEQUENCE NUMBER = LAST CHECKPOINT AT 即為完成
    
  2. 確認後台線程空閒
    INSERT BUFFER: Ibuf: size 1
    Purge done for trx's n:o < current
    FILE I/O: all threads waiting for i/o request
  3. 找到 mysqld PID 並複製檔案
    
    PID=$(pidof mysqld)
    cp /proc/$PID/fd/3 /var/lib/mysql/ibdata1   # fd 編號以實際為準
    cp /proc/$PID/fd/4 /var/lib/mysql/ib_logfile0
    cp /proc/$PID/fd/5 /var/lib/mysql/ib_logfile1
    chown mysql:mysql /var/lib/mysql/ib*
    
  4. 解鎖並重啟驗證
    
    mysql> UNLOCK TABLES;
    systemctl restart mysqld
    # 檢查錯誤日誌無報錯,業務驗證正常
    

關鍵提醒

  • 千萬不要重啟 mysqld bevor 恢復完成,重啟會關閉 fd,資料永久丟失。
  • 若無法鎖表(極高併發),可先 SET GLOBAL read_only=ON 降低寫入,再執行上述流程。
  • 事後必須建立「關鍵檔案存在性監控」(Zabbix/Prometheus 監控 ibdata1、ib_logfile*)。

預防清單

  1. 備份策略:每日全量 + Binlog 增量,異地存儲。
  2. 權限控制:運維帳號無 DROP/SHUTDOWN 權限,刪除檔案需 sudo 審批。
  3. 檔案系統層面:chattr +i /var/lib/mysql/ibdata1 防誤刪(維護時暫時去掉)。

冷靜、不重啟、利用 /proc 搶救,是誤刪 ibdata1 存活的關鍵。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved