mysql binlog

binlog 文件

什么是binlog

  • binlog 全称为 (binary log) ,记录了对MYSQL数据库执行的所有操作语句(不包括SELECT,SHOW这类操作,因为这类型的操作不会对数据本身做修改),但是如果操作本身没有对数据库进行修改,那么该操作也会被记录入数据库。

  • 如下表:test

id name
1 test
  • 执行如下sql,是不对test表做数据修改,但是也会记录该操作
1
update test set name = 1 where id = 2

binlog日志的作用

  • 恢复:数据恢复需要binlog
  • 复制:与恢复原理类似,主要用来做主从复制,master->slave
  • 审计:用户可以通过二进制日志中的信息来进行审计,判断是否又对数据库进行注入攻击

binlog日志的格式

从mysql5.1以后,开始引入binlog_format参数用于设置binlog的格式

  • statement:记录逻辑sql语句(如果使用 read commited事务隔离级别,会出现类似丢失更新的现象,导致主从复制出现问题,由于事务未提交且没有gaplock锁 binlog日志在缓冲中未写入binlog文件,写入文件顺序是事务提交的顺序.可能会导致同步是否顺序不一致)
  • row:不在记录简单的sql语句(能够解决statement在read committed事务隔离级别遇到问题,但是日志文件会变得更大)
  • mixed:mysql默认会采用statement格式,但是在一些特定情况下会使用row(相当于两者混合,自适应使用)

binlog日志的写入

  • 在默认情况下,binlog日志并不是每次写的时候就同步到磁盘的(类似于缓冲写,先写缓存,在同步到磁盘),但是如果在此时数据库发生宕机,再会给恢复和复制带来一些问题,有些数据可能没写入binlog,导致最后一部分数据丢失,这个时候sync_binlog参数就可以解决这个问题,sync_binlog这个参数,代表每次缓存写多少次日志同步到磁盘,如果参数设为1,则不写缓存每次操作直接同步到磁盘,但是这样会对系统IO产生一定影响,但是设置为1同时还有一种影响,就是一个事务还未提交前已经将该条日志记录到了磁盘,如果这时候事务还没提交数据库就宕机了,再回复的时候,未提交的事务并没有回滚,就会出现问题,在这种情况下可以通过设置,innodb_support_xa=1来解决
  • 这里可能有人会觉得开启binlog日志会对数据库性能有影响,但是在官方手册中标识,性能损耗只有1%,但考虑到可用性,数据的恢复和复制,这点性能的损耗还是可以接受的
文章作者: 怀风
文章链接: http://blog.leishunyu.com/2018/12/14/2018-12-14-mysql binlog/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Maple