天天看點

mysqlbinlog工具_mysqlbinlog指令詳解 Part 4 -檢視行事件具體SQL語句

前情提要

此次實驗的環境如下

  • MySQL 5.7.25
  • Redhat 6.10
  • binlog模式采用row模式

前面的一些章節我們對mysqldump常用指令進行了講解

這個專題的内容為mysqlbinlog指令的詳解

mysqlbinlog是MySQL中用來處理binlog的工具

這節内容講如何将binlog日志的行事件中的SQL提取出來

行事件包含

  • WRITE_ROWS_EVENT
  • UPDATE_ROWS_EVENT
  • DELETE_ROWS_EVENT

1. 具體指令

以下為一些指令參數的使用

在示範前請先重置binlog并建立innodb_table表,并插入一條資料

具體步驟見mysqlbinlog的第一章

1.1 隻檢視二進制内容

mysqlbinlog指令預設使用binlog語句将行事件以base-64字元串編碼

shell> mysqlbinlog  /path/to/log/master-bin.000001
           
mysqlbinlog工具_mysqlbinlog指令詳解 Part 4 -檢視行事件具體SQL語句

可以看到create table是個Query事件

這裡顯示出了具體的建表語句,說明建表不屬于行事件

mysqlbinlog工具_mysqlbinlog指令詳解 Part 4 -檢視行事件具體SQL語句

BINLOG關鍵字後為經過編碼後的二進制日志

可以看到一個insert語句包含如下事件

  • Query 事件 負責開始一個事務(BEGIN)
  • Table_map事件 負責映射需要的表
  • Write_rows事件 負責寫入資料
  • Xid事件 負責結束事務

1.2 顯示行事件的僞SQL

下面指令将行事件以僞SQL(pseudo-SQL)的形式表現出來

僞SQL會被注釋,即開始位置會有###标志

這些僞SQL隻是為了便于檢視,無其他作用

shell> mysqlbinlog  -v /path/to/log/master-bin.000001
           

或者

shell> mysqlbinlog  -verbose  /path/to/log/master-bin.000001
           
mysqlbinlog工具_mysqlbinlog指令詳解 Part 4 -檢視行事件具體SQL語句

可以看到具體的insert語句以及顯示出來了

大家可能注意到了,其結構和原始語句是不一緻的 values被替換成了set

而且列名被@N代替,N為列名稱

使用-v或這-verbose 兩次會多顯示一些其他資訊,如列的類型和一些中繼資料

shell> mysqlbinlog  -vv /path/to/log/master-bin.000001
           
mysqlbinlog工具_mysqlbinlog指令詳解 Part 4 -檢視行事件具體SQL語句

可以看到多了一些中繼資料和列的名稱

大家可能又注意了varchar(20)類型被顯示成varstring(60)

1.3 顯示去掉BINLOG格式的僞SQL

1.2 中的指令同時顯示BINLOG格式的語句,使用如下指令不顯示它

mysqlbinlog -v --base64-output=DECODE-ROWS /path/to/log/master-bin.000001
           
mysqlbinlog工具_mysqlbinlog指令詳解 Part 4 -檢視行事件具體SQL語句

注意如果你想使用mysqlbinlog的輸出來重新執行SQL,你不應該使用該參數

關于重新執行SQL 後面再說

2. 注意事項

2.1 hexdump參數

shell> mysqlbinlog --hexdump  -v /path/to/log/master-bin.000001
           

可以看到上面的輸出沒有事件代碼等資訊,加入-hexdump參數可檢視所有事件的詳細資訊

Query事件
mysqlbinlog工具_mysqlbinlog指令詳解 Part 4 -檢視行事件具體SQL語句
TABLE_MAP_EVENT事件
mysqlbinlog工具_mysqlbinlog指令詳解 Part 4 -檢視行事件具體SQL語句
WRITE_ROWS_EVENT事件
mysqlbinlog工具_mysqlbinlog指令詳解 Part 4 -檢視行事件具體SQL語句

2.2 --base64-output=NEVER

在有行事件(資料修改)的情況下,使用mysqldump會在輸出的前面顯示格式描述的二進制内容

如果你确定該日志沒有行事件則使用該參數不顯示他

mysqlbinlog -v --base64-output=NEVER  /path/to/log/master-bin.000001
           
mysqlbinlog工具_mysqlbinlog指令詳解 Part 4 -檢視行事件具體SQL語句

2.3 僞SQL顯示的一些限制

正如上面所說,僞SQL在顯示上可能有如下問題

  • 原始的列名會丢失,用@N代替
  • 資料類型顯示不對應
  • 資料的長度顯示不對應,僞SQL是以位元組為機關,而不是字元

3. 參考連結

https://dev.mysql.com/doc/refman/5.7/en/mysqlbinlog-row-events.html

好了 今天的内容就說到這裡,下節再見

mysqlbinlog工具_mysqlbinlog指令詳解 Part 4 -檢視行事件具體SQL語句