前情提要
此次實驗的環境如下
- 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
可以看到create table是個Query事件
這裡顯示出了具體的建表語句,說明建表不屬于行事件
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
可以看到具體的insert語句以及顯示出來了
大家可能注意到了,其結構和原始語句是不一緻的 values被替換成了set
而且列名被@N代替,N為列名稱
使用-v或這-verbose 兩次會多顯示一些其他資訊,如列的類型和一些中繼資料
shell> mysqlbinlog -vv /path/to/log/master-bin.000001
可以看到多了一些中繼資料和列的名稱
大家可能又注意了varchar(20)類型被顯示成varstring(60)
1.3 顯示去掉BINLOG格式的僞SQL
1.2 中的指令同時顯示BINLOG格式的語句,使用如下指令不顯示它
mysqlbinlog -v --base64-output=DECODE-ROWS /path/to/log/master-bin.000001
注意如果你想使用mysqlbinlog的輸出來重新執行SQL,你不應該使用該參數
關于重新執行SQL 後面再說
2. 注意事項
2.1 hexdump參數
shell> mysqlbinlog --hexdump -v /path/to/log/master-bin.000001
可以看到上面的輸出沒有事件代碼等資訊,加入-hexdump參數可檢視所有事件的詳細資訊
Query事件 TABLE_MAP_EVENT事件 WRITE_ROWS_EVENT事件2.2 --base64-output=NEVER
在有行事件(資料修改)的情況下,使用mysqldump會在輸出的前面顯示格式描述的二進制内容
如果你确定該日志沒有行事件則使用該參數不顯示他
mysqlbinlog -v --base64-output=NEVER /path/to/log/master-bin.000001
2.3 僞SQL顯示的一些限制
正如上面所說,僞SQL在顯示上可能有如下問題
- 原始的列名會丢失,用@N代替
- 資料類型顯示不對應
- 資料的長度顯示不對應,僞SQL是以位元組為機關,而不是字元
3. 參考連結
https://dev.mysql.com/doc/refman/5.7/en/mysqlbinlog-row-events.html
好了 今天的内容就說到這裡,下節再見