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_accountmysqlbinlog --base64-output=DECODE-ROWS -v binlog.xxx > replay.sql,再 mysql < replay.sql(需手動補全欄位名)。mysqlbinlog -R --host=... --user=... --password=... --raw mysql-bin.000144@n 變數),需人工或腳本轉換為真實 SQL。| grep -A 20 'Table_map' 等過濾。event_type: 2 等數字代碼對應 Log_event 類型,可查閱 MySQL 源碼 log_event.h。掌握此指令,是 Binlog 審計、數據恢復、異構同步開發的基礎技能。