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%,但考虑到可用性,数据的恢复和复制,这点性能的损耗还是可以接受的