首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL datadir 物理遷移報錯「Failed to open log」根因分析與三種修復方案

     編輯:MySQL 綜合教學

現象

將 MySQL 5.6 datadir 從機器 A (pathA) 遷移至機器 B (pathB) 後啟動失敗,錯誤日誌:

/usr/sbin/mysqld: File '/home/mysql_3306/mysql-bin.000003' not found (Errcode: 2)
[ERROR] Failed to open log (file '/home/mysql_3306/mysql-bin.000003', errno 2)
[ERROR] Could not open log file
[ERROR] Can't init tc log
[ERROR] Aborting

明明已修改 my.cnf 所有路徑,為何仍尋找舊路徑?

根因:binlog.index 索引檔記錄絕對路徑

  • log-bin-index 指向的索引檔(預設 mysql-bin.index)內部以絕對路徑記錄每個 binlog 檔案位置。
  • 遷移時若未同步修改此檔,MySQL 啟動讀取索引 → 找不到舊路徑 binlog → 啟動中止。

三種修復方案(按推薦順序)

方案一:手動編輯 binlog.index(最快、保留現有 binlog)

  1. 進入新 datadir:cd /new/path
  2. 編輯 mysql-bin.index,將每行舊路徑替換為新路徑:
    sed -i 's|/home/mysql_3306/|/home/mysql_3306_bak/|g' mysql-bin.index
  3. 啟動 MySQL:systemctl start mysqld

方案二:刪除 binlog.index 讓 MySQL 重建(簡單、但丟失舊 binlog 索引)

  1. 刪除/備份索引檔:mv mysql-bin.index mysql-bin.index.bak
  2. 啟動 MySQL,自動生成新索引(僅包含啟動後新產生的 binlog)。
  3. 風險:舊 binlog 檔仍存在但不在索引中,PURGE BINARY LOGS 會報錯「Target log not found in binlog index」。

方案三:配置 log-bin-index 指向新路徑(配置層面修正)

[mysqld]
log-bin = /new/path/mysql-bin
log-bin-index = /new/path/mysql-bin.index

需確保索引檔內容已為新路徑(結合方案一)。

深度驗證實驗

  1. 手動在索引中植入不存在路徑(/tmp/mysql-bin.000005)。
  2. 執行 PURGE BINARY LOGS TO 'mysql-bin.000007' → 報錯 File '/tmp/...' not found。
  3. 重啟 MySQL → 同樣報錯並啟動失敗(最後一個索引條目無效時才會阻止啟動)。

結論:MySQL 啟動時會檢查索引中所有 binlog 是否存在,僅當「最後一條」無效時才阻止啟動。

最佳遷移實踐(避坑指南)

  1. 遷移前執行 FLUSH LOGS 產生新 binlog,減少舊檔依賴。
  2. 使用 rsync -av --delete 同步整個 datadir 目錄(含索引檔),保持相對路徑一致。
  3. 若必須改變 datadir 路徑,同步修改 my.cnf 與 binlog.index。
  4. 或採用邏輯備份(mysqldump --single-transaction --master-data=2)遷移,完全規避物理路徑問題。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved