binlog日志


有了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語句;

c1059c6860fdc901bbd9186ee0b1f00c.png

二. 查看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

下圖為查看備份的日志,文件名用指定的前綴+源端二進制日志的文件名;

3af0cc373299cb42b2063ae910f99f51.png

三. binlog事件 

binlog_event.h中的Log_event_type定義了事件的各種類型,5.7.22有38種事件類型;每個日志文件開頭有一個Format_desc事件,日志文件結尾有一個Rotate事件,表示日志結束。所有binlog事件都有一個通用的結構,由事件頭和事件數據組成;每個版本的事件內容不同。事件頭包括事件創建時間,server_id等信息;事件數據部分為具體的數據修改;

535c46d313e1194c9185b0cce7619eb7.png


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM