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

MySQL 利用 Binlog 進行資料恢復實戰指南

     編輯:MySQL 綜合教學

MySQL 利用 Binlog 進行資料恢復實戰指南

一、什麼是 Binlog?

Binlog(二進位日誌)記錄所有對資料發生或潛在發生更改的 SQL 語句,以二進位形式儲存於磁碟。預設位於資料目錄,檔名格式為 hostname-bin.xxxxxx,每次重啟 MySQL 會生成新檔案。

啟用 Binlog 配置

編輯 my.cnf:

[mysqld]
log_bin = mysql-bin
server_id = 1

重啟後驗證:

mysql> SHOW VARIABLES LIKE '%log_bin%';
my.cnf 配置示例
my.cnf 配置示例
Binlog 狀態查看
Binlog 狀態查看

二、Binlog 三種格式深度對比

格式說明優點缺點
Statement (SBR) 記錄每條修改資料的 SQL 語句 日誌量小、IO 少、效能較好 需記錄執行上下文;特定函數(UUID、USER、SYSDATE 等)導致主從不一致;INSERT...SELECT 產生更多行鎖
Row (RBR) 僅記錄哪一行被修改成什麼樣 日誌內容清晰、無存儲過程/函數/觸發器複制問題、主從一致性最強 大量修改(如 UPDATE 全表、ALTER TABLE)會產生海量日誌、IO 壓力大
Mixed 一般語句用 Statement,無法複制的場景自動切換 Row 折衷方案,MySQL 自動判斷 仍可能因 Row 格式導致日誌暴增

無法被 Statement 格式複制的函數: LOAD_FILE()、UUID()、USER()、FOUND_ROWS()、SYSDATE()(除非啟用 --sysdate-is-now)。

三、線上實戰:硬體故障後的資料搶救

場景描述

DB 主機硬體故障宕機,重啟失敗導致資料損壞,mysqldump 備份也失敗。所幸之前已啟用 Binlog,可從 Binlog 提取資料。

恢復步驟

  1. 將 Binlog 檔案傳輸至正常運行的機器。
  2. 使用 mysqlbinlog 解析並導入:
/app/mysql/bin/mysqlbinlog bin-log.xxx | /app/mysql/bin/mysql

查詢特定時間區間的 SQL

Row 格式下,mysqlbinlog 輸出的 SQL 為 Base64 編碼,需加參數解碼:

/opt/mysql/bin/mysqlbinlog \
  --base64-output=decode-rows -v \
  --start-date='2014-09-16 14:00:00' \
  --stop-date='2014-09-16 14:20:00' \
  /opt/mysql/log/mysql-bin.000017 \
  > /opt/mysql_bak/mysqlbinlogsql_restore_2014091614.sql
Binlog 解析輸出示例
Binlog 解析輸出示例

四、關鍵參數說明

  • --base64-output=decode-rows:解碼 Row 格式的 Base64 內容。
  • -v:詳細模式,重構 SQL 語句。
  • --start-date / --stop-date:按時間範圍過濾。
  • --start-position / --stop-position:按位置點過濾(更精確)。
  • --database:僅解析指定資料庫的事件。

五、實務建議

  1. 生產環境強制啟用 Binlog,並設定合理的 expire_logs_days 避免磁碟撐爆。
  2. 主從架構下,從庫同樣應開啟 Binlog(log_slave_updates=ON),便於級聯恢復。
  3. 定期演練:每季進行一次基於 Binlog 的時間點恢復演練(PITR),驗證備份可用性。
  4. 大事務拆分:避免超大事務導致 Binlog 膨脹、主從延遲。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved