MySQL binlog日志详解

 

简介

一系列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
  1. WRITE_ROWS_EVENT
  2. UPDATE_ROWS_EVENT
  3. 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读取该事件的内容来进行相应的初始化工作
 
Alt text
非GTID模式
由GTID模式转化为非GTID模式Alt text
每个gtid文件中会有一个Previous_gtids

清理binlog

手动清理binlog

purge {binary | master} logs to "binlog-file-name"
purge {binary | master} logs before "datetime-expr"
注意:
动态关闭/开启GTID会连续Rotate 3次binlog文件Alt text

自动清理binlog

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

 参考

 

posted on 2018-12-30 11:50  jiaxin666  阅读(923)  评论(0编辑  收藏  举报

导航