简介

一系列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读取该事件的内容来进行相应的初始化工作
MySQL binlog日志详解 Mysql 第1张 MySQL binlog日志详解 Mysql 第2张 非GTID模式
由GTID模式转化为非GTID模式
MySQL binlog日志详解 Mysql 第3张 MySQL binlog日志详解 Mysql 第4张
每个gtid文件中会有一个Previous_gtids

清理binlog

手动清理binlog

purge {binary | master} logs to "binlog-file-name" purge {binary | master} logs before "datetime-expr" 注意: 动态关闭/开启GTID会连续Rotate 3次binlog文件 MySQL binlog日志详解 Mysql 第5张 MySQL binlog日志详解 Mysql 第6张

 

 

 

自动清理binlog

expire_logs_day=N(0<=N<=99) binlog发生切换或者mysql server启动时,遍历index文件 找到第一个“最后修改时间”在N天内的binlog文件 将该binlog之前的所有binlog文件删除掉

 参考

MariaDB原理与实现-二进制日志binlog MyFlash——美团点评的开源MySQL闪回工具  

 

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄