一般都可以通過以下命令將二進制格式的binlog轉換為方便查看的文本輸出。下面會詳細講解各個參數的作用。
mysqlbinlog --no-defaults --base64-output=DECODE-ROWS -vv binlog.000130
目錄
MySQL的二進制日志由包含“ 事件 ”(event)的文件組成,這些 事件描述了對數據庫內容的修改。服務器以二進制格式寫入這些文件。要以文本格式顯示其內容,請使用 mysqlbinlog實用程序。你還可以使用 mysqlbinlog顯示復制設置中從屬服務器寫入的中繼日志文件的內容,因為中繼日志的格式與二進制日志相同
statement格式記錄的二進制日志
mysqlbinlog mysql-bin.000021
在binlog的格式為statement時,使用上面的命令查看二進制文件,會顯示出SQL語句,其他輸出的詳細說明如下。
截取輸出中的一段進行說明
- at 652 表示該時間的起始位置 或者 該時間 event在為禁止文件中的偏移量
- 200508 21:55:22 該日期和時間指示該語句在事件執行(發生)的服務器上何時啟動。為了進行復制,此時間戳會傳遞到從屬服務器。
- server id 101 事件執行(發生)的服務器的值。
- end_log_pos 652 指示下一個事件的開始位置(即,當前事件的結束位置+ 1)
- Query 事件類型
- thread_id=3 指示哪個線程執行了事件
- exec_time=0 是在主服務器上執行事件所花費的時間
復制延遲的指標 是如何計算的 On a slave, it is the difference of the end execution time on the slave minus the beginning execution time on the master. The difference serves as an indicator of how much replication lags behind the master
- error_code=0 指示執行事件的結果。零表示沒有錯誤發生。
- update t set user_name='yanhaihang' where id = 5 可以看到執行的SQL語句
row格式的二進制日志
二進制日志格式為row格式,binlog中會有row events,比如 Update_rows event
mysqlbinlog mysql-bin.000022
當使用上面的命令查看二進制日志文件時,默認情況下 ,二進制日志是以編碼為base-64字符串的binlog語句顯示這些行事件,顯示如下(看不懂數據庫到底做了什么 o(╥﹏╥)o)
mysqlbinlog -v mysql-bin.000022
加上參數 -v 或--verbose 可以 以注釋的偽SQL語句 去看這些行事件
mysqlbinlog -v -v mysql-bin.000022
使用兩次 -v -v 或者 -vv 或者 --verbose --verbose可以額外顯示字段的類型以及字段的一些元數據信息。更加詳細了
mysqlbinlog -vv --base64-output=DECODE-ROWS mysql-bin.000022
加上--base64-output=DECODE-ROWS 選項后,行事件的binlog語句(那些看不懂的字符串)就不再顯示。(*^▽^*)
選項 --base64-output=DECODE-ROWS -v 組合成為一個只看注釋的偽SQL便捷組合。
--base64-output=never 如果為never 則遇到行事件報錯退出
ERROR: --base64-output=never specified, but binlog contains a Update_rows event which must be printed in base64.
其他選項參數
--no-defaults 不會去讀取一些默認的配置文件,因為讀取這些文件的時候使用mysqlbinlog會報錯。加上這個選項后可以避免讀取配置文件而報錯
--server-id=
僅顯示該server_id的服務器創建的事件。你可以這么理解!是一個過濾選項,只過濾出該server_id的時間。像--databas 一樣,只顯示該庫的時間id
更多的選項參考官方文檔
https://dev.mysql.com/doc/refman/8.0/en/mysqlbinlog.html#option_mysqlbinlog_server-id