簡介 一系列binlog文件和一個index文件組成 binlog文件以一個4位元組的常量作為開頭(表示這是一個binlog文件) 後面跟著一系列binlog事件 作用 複製 備份恢復 崩潰恢復(啟用binlog,採用事物的兩階段提交協議,事務在存儲引擎中的可能為prepared和commit) bi ...
簡介
一系列binlog文件和一個index文件組成 binlog文件以一個4位元組的常量作為開頭(表示這是一個binlog文件) 後面跟著一系列binlog事件
作用
複製 備份恢復 崩潰恢復(啟用binlog,採用事物的兩階段提交協議,事務在存儲引擎中的可能為prepared和commit)
binlog使用
開啟binlog
log_bin[=base-name] 絕對路徑 不是絕對路徑(以base-name作為首碼命令binlog文件)
binlog格式
三種格式
STATEMENT ROW MIXED
優缺點
statement STATEMENT占用空間較小 可以用mysqlbinlog讀懂其中內容 不確定事件(USER、UUID、SYSDATE等)可能導致主從數據不一致 row row文件相對較大 不會存在數據不一致(最安全的資料庫複製方式) DDL語句和FLUHS系列語句還是會以文本形式記錄下來(事件類型為query_event)
binlog相關參數
max_binlog_size 單個binlog文件大小(binlog文件大小可能比max_binlog_size大) 同一個事務中產生的所有事件必須記錄在同一個binlog中
binlog過濾器
set sql_log_bin=0 禁用當前會話binlog功能 binlog_do_db binlog_ignore_db
sync_binlog
sync_binlog=0(寫入內容後持久化操作由操作系統來做) sync_binlog=1(寫入內容後立即執行fsync操作同步到磁碟上) sync_binlog=N(寫入N個事務才執行一次fsync操作)
binlog事件
查看事件
show binlog events in 'binlg-file' limit 10; 獲取事件類型,事件在文件中的位置等 binlog格式為statement,還可以看到具體SQL語句binlog事件格式
binlog事件
公有事件頭(common-header / event header) 私有事件頭(post-header 部分binlog事件包含) 事件體(body / event data) 所有binlog都以一個13或者19位元組的公有事件頭開始binlog事件類型
FORMAT_DESCRIPTION_EVENT一個binlog文件中僅會出現一次GTID_LOG_EVENT
記錄GTID事務號了,用於5.6版本之後基於GTID同步的方式QUERY_EVENT
1、事務開始時,在binlog中記錄一個類型為query_event的begin事件 2、statement格式binlog中,具體執行的SQL語句保留在query_event事件中 3、row格式binlog,所有DDL操作以文本的格式記錄在query_event事件中ROWS_QUERY_EVENT(預設無)
啟用binlog_rows_query_log_events後,row格式binlog DML也會記錄在Rows_query事件中TABLE_MAP_EVENT ROWS_EVENT WRITE_ROWS_EVENT UPDATE_ROWS_EVENT DELETE_ROWS_EVENT XID_EVENT
statement和row格式的binlog,都會添加一個XID_EVENT事件作為事物的結束 該事件記錄了該事務的id,崩潰恢復時,根據事務在binlog中的提交情況決定是否提交存儲引擎中prepared的事務 一個事務產生的所有event會被GTID_LOG_EVENT和XID_EVENT包住ROTATE_EVENT STOP_EVENT GTID模式
開啟GTID模式下,會記錄額外兩種事件,Previous_gtids事件和Gtid事件 Previous_gtids記錄該binlog文件之前執行過的所有事務對應的GTID集合,在系統啟動時,mysql讀取該事件的內容來進行相應的初始化工作非GTID模式
由GTID模式轉化為非GTID模式
每個gtid文件中會有一個Previous_gtids
清理binlog
手動清理binlog
purge {binary | master} logs to "binlog-file-name" purge {binary | master} logs before "datetime-expr" 註意: 動態關閉/開啟GTID會連續Rotate 3次binlog文件自動清理binlog
expire_logs_day=N(0<=N<=99) binlog發生切換或者mysql server啟動時,遍歷index文件 找到第一個“最後修改時間”在N天內的binlog文件 將該binlog之前的所有binlog文件刪除掉