針對MySQL物理備份redo log拷貝前被覆蓋導致xtrabackup備份失敗的問題的排查。
線上出現一例xtrabackup備份失敗事件,具體報錯如下:
xtrabackup: error: log block numbers mismatch:
xtrabackup: error: expected log block no. 273665700, but got no. 277859996 from the log file.
xtrabackup: error: it looks like InnoDB log has wrapped around before xtrabackup could process all records due to either log copying being too slow,
or log files being too small.
xtrabackup: Error: xtrabackup_copy_logfile() failed.備份失敗原因在xtrabackup的輸出信息中已經有說明:log block numbers mismatch,XtraBackup在順序拷貝完redo log末尾的數據后,重新從redo log的起始位置去拷貝時,發現起始位置的log block no.與剛才尾部的no.不連續。
expected log block no. 273665700, but got no. 277859996 from the log file.,本應該讀取的redo 塊是no. 273665700,但是只能獲取到no. 277859996
讀redo錯誤的原因:it looks like InnoDB log has wrapped around before xtrabackup could process all records due to either log copying being too slow, 要么xtrabackup讀取redo的速度太慢了,或者redo 文件太小了,導致讀取速度跟不上redo文件的切換速度,在讀取之前,相應的redo塊已經被覆蓋了。
解決辦法:
1、檢查redo log相關的系統變量:
innodb_log_file_size
innodb_log_files_in_group
設置的redo log大小是innodb_log_file_size * innodb_log_files_in_group,如果設置過小,需要調整后重啟。
2、檢查實例在備份時間左右的機器load負載、硬件資源(網絡、磁盤、CPU、內存)使用情況,如果出現資源瓶頸需要調整,比如出現其他資源占用的任務,需要適當對這些任務進行遷移,或者調整備份時間,選擇在相對低峰的時間進行備份。