萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL Binlog 二進制日誌操作實戰指南

Binlog 是 MySQL 數據恢復、主從複制的核心。本文以 CentOS 6.5 + MySQL 5.1 為環境,詳解 SHOW BINLOG EVENTS、mysqlbinlog 工具的時間點/位置過濾、導出 SQL 文件、增量恢復等實操技巧,附完整命令示例與輸出解讀。

一、Binlog 基礎認知

  • 記錄所有修改數據的 SQL,事務提交時寫入末尾。
  • 三種格式:Statement(基於語句,如 UPDATE ... LIMIT 1 可能導致主從不一致)、Row(基於行,記錄每行變更,複雜 UPDATE/DELETE 有優勢)、Mixed(混合模式)。

二、MySQL 客戶端查看 Binlog

-- 僅查看第一個 binlog 文件
SHOW BINLOG EVENTS;

-- 查看指定文件
SHOW BINLOG EVENTS IN 'binlog.000007';

-- 查看當前正在寫入的文件
SHOW MASTER STATUS \G;

-- 獲取所有 binlog 文件列表
SHOW BINARY LOGS;

三、mysqlbinlog 工具深度應用

1. 按時間範圍過濾

/usr/local/mysql/bin/mysqlbinlog --no-defaults \
  --start-datetime='2014-08-04 00:00:00' \
  --stop-datetime='2014-08-13 23:59:59' \
  -d wordpress binlog.000007

2. 按 Position 範圍過濾

/usr/local/mysql/bin/mysqlbinlog --no-defaults \
  --start-position=107 --stop-position=1000 \
  -d wordpress binlog.000007

⚠️ 關鍵注意事項

  • 不要直接查看正在寫入的 binlog 文件
  • 不要加 -force 強制讀取
  • Row 格式需加 -vv 參數解析

四、導出 SQL 文件並恢復數據實戰

以 Windows 環境為例,逐段導出並驗證:

第 1 段 (pos 4-106):啟動事件

mysqlbinlog --start-position=4 --stop-position=106 \
  yueliangdao_binglog.000001 > c:\test1.txt

輸出包含 START 事件、ROLLBACK 等元信息。

第 2 段 (pos 106-134):自增變量

SET INSERT_ID=1

第 3 段 (pos 134-254):建表語句

CREATE TABLE a1(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  STR VARCHAR(1000)) ENGINE=MYISAM

第 4 段 (pos 254-330):插入數據

INSERT INTO a1(str) VALUES ('I love you'),('You love me')

5. 兩種恢復方式

管道直接導入:

mysqlbinlog --start-position=134 --stop-position=330 \
  yueliangdao_binglog.000001 | mysql -uroot -p

導出文件再 source:

mysqlbinlog --start-position=134 --stop-position=330 \
  yueliangdao_binglog.000001 > test1.txt
mysql> SOURCE c:\test1.txt;

驗證:SELECT * FROM a1; 成功恢復兩行數據。

五、常用導出腳本模板

# 整個文件導出
cd /usr/local/mysql
./mysqlbinlog /usr/local/mysql/data/mysql-bin.000001 > /opt/001.sql

# 按時間導出單文件
./mysqlbinlog --stop-date="2009-04-10 17:41:28" \
  /usr/local/mysql/data/mysql-bin.000002 > /opt/004.sql

# 按時間導出多文件(空格分隔,寫全路徑)
./mysqlbinlog --start-date="2009-04-10 17:30:05" \
  --stop-date="2009-04-10 17:41:28" \
  /usr/local/mysql/data/mysql-bin.000002 \
  /usr/local/mysql/data/mysql-bin.000003 > /opt/004.sql

# 導出並直接導入
./mysqlbinlog --start-date="2009-04-10 17:30:05" \
  --stop-date="2009-04-10 17:41:28" \
  /usr/local/mysql/data/mysql-bin.000002 | mysql -u root -p123456

六、避坑提醒

  • 恢復前務必確認 binlog 格式、GTID 模式兼容性
  • 大文件建議分段導出,避免內存溢出
  • Row 格式恢復時需確保表結構一致
copyright © 萬盛學電腦網 all rights reserved