有了binlog日志,我們可以實現主從架構,可以用canal、maxwell等工具實現將MySQL數據同步到大數據環境;同時可以對binlog進行解析,可以實現快速的數據恢復(Flashback),如使用binlog2sql、Myflash、Mariadb mysqlbinlog等,要實現這些功能,對binlog的詳細了解是有必要的。
一. binlog配置
要啟動非常簡單,通過配置log_bin選項即可啟用binlog,5.7需要同時設置server_id參數,8.0開始server_id默認值為1
常見配置參數如下:
log-bin=/mysql_data/mysql-bin
log-bin-index=/mysql_data/mysql-bin.index
binlog-rows-query-log-events = 1 ###on/off
expire_logs_days = 15
###二進制日志自動刪除/過期的天數。默認值為0,表示不會自動刪除。
15
表示日志保留15天,超過15天則設置為過期
#關於過期日志自動刪除補充:
#Q:在什么時間會刪除過期日志?
#A:每次進行 LOG flush的時會自動刪除過期的日志。
#Q:什么時間才能觸發log flush,手冊上的解釋為:
#A:1. 重啟;
# 2. BINLOG文件大小達到參數max_binlog_size限制;
# 3. 手工執行命令。
log_expire_logs_seconds = 604800 ####在MySQL8.0版本中新增參數binlog_expire_logs_seconds,可以精確到秒,而此前版本中expire_logs_days的單位為天,最小值為1
log_slave_updates=1
####################################
MySQL expire_logs_days 參數用於控制Binlog文件的保存時間,當Binlog文件存在的時間超過該參數設置的閾值時,Binlog文件就會被自動清除,該參數的時間單位是天,設置為0,表示Binlog文件永不過期,即不自動清除Binlog文件。
在MySQL 8.0 版本,expire_logs_days參數被廢棄,使用新的參數binlog_expire_logs_seconds代替,新參數的時間粒度是秒,能夠更加靈活的控制Binlog文件過期時間。
####################################log-slave-updates參數默認時關閉的狀態
從庫做為其他從庫的主庫時 log-slave-updates參數是必須要添加的,因為從庫要作為其他從庫的主庫,必須添加該參數。該參數就是為了讓從庫從主庫復制數據時可以寫入到 binlog日志,為什么要用這個參數寫binlog日志呢,不是在配置文件中開啟log-bin = /data/3307/mysql-bin選項就可以嗎?
答:從庫開啟log-bin參數,如果直接往從庫寫數據,是可以記錄log-bin日志的,但是從庫通過I0線程讀取主庫二進制日志文件,然后通過SQL線程寫入的數據,是不會記錄binlog日志的。也就是說從庫從主庫上復制的數據,是不寫入從庫的binlog日志的。所以從庫做為其他從庫的主庫時需要在配置文件中添加log-slave-updates參數。
################################################
binlog_format = row
max_binlog_size=1Gb
inlog_cache_size=32768
max_binlog_cache_size=4
Grelay_log = relay-log
relay_log_recovery = 1
relay_log_purge=0 #####
mha 場景下 disable
binlog_checksum=CRC32
sync_binlog = 1
gtid_mode = 1
force_gtid_consistency = 1
binlog_transaction_dependency_tracking=WRITESET
#版本是 5.7.22
相關參數解釋:
binlog-rows-query-log-events使用ROW格式時可以在binlog日志里面記錄一條Rows_query事件,即實際的SQL語句;
二. 查看binlog
生成的binlog日志如何查看呢?有兩種方式,使用SHOW BINLOG EVENTS命令和mysqlbinlog工具。
show binlog events命令:可以在mysql客戶端執行命令查看對應binlog文件中的事件;沒有指定文件名時默認是查看第一個日志文件的事件。
# 查看有哪些binlog日志文件show binary logs;# 查看binlog 事件SHOW BINLOG EVENTS> [IN 'log_name']> [FROM pos]> [LIMIT [offset,] row_count]
mysqlbinlog工具:
通過mysqlbinlog工具可以查看二進制日志文件或relay log內的事件,使用-vv可以顯示出row格式的行信息,使用--start-datetime/--stop-datetime,--stop-position/--start-position 可以指定事件的開始/結束時間或位點。
使用--read-from-remote-server/--read-from-remote-master可以從遠程服務器讀取日志,並能寫入到本地文件,或持續進行日志接收(實現備份,binlog server)。
read-from-remote-master支持選項BINLOG-DUMP-NON-GTIDS(非gtid模式下)和BINLOG-DUMP-GTIDS,使用BINLOG-DUMP-GTIDS可以結合--exclude-gtids實現事件過濾。
# 讀取遠程服務器的日志mysqlbinlog \--read-from-remote-server \--host=10.82.30.102 \--port=3308 \--password \--user=yau \--stop-position=125 \mysql-bin.000041 # 使用read-from-remote-master選項從遠程# 服務器讀取日志mysqlbinlog \--read-from-remote-master=BINLOG-DUMP-NON-GTIDS \--host=10.82.30.102 \--port=3308 \--password \--user=yau \--stop-position=125 \mysql-bin.000041
結合使用--stop-never、--connection-server-id=#、--raw選項可以實現遠程實時備份binlog;
使用--result-file/-r指定保存事件的文件名;結合--raw選項,文件名為前綴名稱;
mysqlbinlog \--read-from-remote-master=BINLOG-DUMP-NON-GTIDS \--host=10.82.30.102 \--port=3308 \--password \--user=yau \--stop-never \--connection-server-id=1002 \--result-file=backup102- \--raw \mysql-bin.000042
下圖為查看備份的日志,文件名用指定的前綴+源端二進制日志的文件名;
三. binlog事件
binlog_event.h中的Log_event_type定義了事件的各種類型,5.7.22有38種事件類型;每個日志文件開頭有一個Format_desc事件,日志文件結尾有一個Rotate事件,表示日志結束。所有binlog事件都有一個通用的結構,由事件頭和事件數據組成;每個版本的事件內容不同。事件頭包括事件創建時間,server_id等信息;事件數據部分為具體的數據修改;