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

MySQL Binlog 混合模式完整解析指令:--base64-output=DECODE-ROWS -v 詳解

     編輯:MySQL 資料庫相關知識

MySQL Binlog 三種格式:ROW、STATEMENT、MIXED。混合模式下,單一 Binlog 檔案同時包含行級與語句級事件,普通 mysqlbinlog 無法完整還原 SQL。本文提供完整解析指令與輸出解讀。

核心解析指令

mysqlbinlog --base64-output=DECODE-ROWS -v mysql-bin.000144 | more

參數詳解

參數作用
--base64-output=DECODE-ROWS將 Row-based 事件(Write_rows、Update_rows、Delete_rows)解碼為可讀的偽 SQL 格式(顯示 ### INSERT INTO ... SET @1=..., @2=...)
-v / --verbose將 Statement-based 事件重構為完整 SQL 語句輸出

兩者結合,即可完整覆蓋 Mixed 格式下的所有事件類型。

實際輸出範例解讀

# at 171
#140216 23:59:26 server id 1  end_log_pos 260  Table_map: `billing`.`billing_account` mapped to number 216
#140216 23:59:26 server id 1  end_log_pos 418  Write_rows: table id 216 flags: STMT_END_F
### INSERT INTO billing.billing_account
### SET
###   @1=80491
###   @2=1000013580491
###   @3=1000056980491
###   @4=1
###   @5=1
###   @6='Integration-Tests'
###   @7=2014-02-16 23:59:26
###   @8='Integration-Tests'
###   @9=2014-02-16 23:59:26
###   @10='Integration-Tests'
###   @11=NULL
###   @12='0'
###   @13=1000105380491
###   @14='0'
###   @15='159.153.208.254'
###   @16=1
###   @17=NULL

關鍵點

  • Table_map 事件:建立表名與內部 ID 映射(此處 216 → billing.billing_account)。
  • Write_rows 事件:對應 INSERT 操作,flags: STMT_END_F 表示語句結束。
  • ### SET @n=value:欄位按建表順序編號,需對照表結構確認欄位名。
  • 若為 Update_rows:會顯示 ### WHERE 與 ### SET 兩部分;Delete_rows 僅顯示 ### WHERE。

進階用法

  • 指定位置範圍:--start-position=171 --stop-position=418
  • 過濾特定庫/表:--database=billing --table=billing_account
  • 導出供重放:mysqlbinlog --base64-output=DECODE-ROWS -v binlog.xxx > replay.sql,再 mysql < replay.sql(需手動補全欄位名)。
  • 解析遠端 Binlog:mysqlbinlog -R --host=... --user=... --password=... --raw mysql-bin.000144

注意事項

  1. 輸出的偽 SQL 不能直接執行(含 @n 變數),需人工或腳本轉換為真實 SQL。
  2. 大型 Binlog 解析耗時久、佔記憶體,建議加 | grep -A 20 'Table_map' 等過濾。
  3. event_type: 2 等數字代碼對應 Log_event 類型,可查閱 MySQL 源碼 log_event.h。

掌握此指令,是 Binlog 審計、數據恢復、異構同步開發的基礎技能。

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