3分钟扫盲Mysql的binlog
日志是 Mysql 数据库的重要组成部分,日志记录着数据库运行期间各种状态信息。Mysql常见的日志如下所示:
Mysql 日志主要包括错误日志、查询日志、慢查询日志、事务日志、二进制日志几大类。其中比较重要的就是binlog、redo log和undo log,今天我们介绍一下binlog。
1、认识binlog
binlog是用来记录数据库执行的写操作(如update、delete、add等)的信息,binlog是以二进制(二进制的特点:体积小、恢复数据速度快)的形式保存在磁盘中,通过命令(SHOW VARIABLES LIKE ‘log_bin%’;)可以查询binlog的基本信息,如下图所示:
其中key=log_bin,value=ON表示开启了binlog日志;log_bin_basename显示binlog的存储位置,我们进入到这个二进制文件的存储目录查看一下binlog,如下图是本地存储的 bi n log
binlog属于Mysql的逻辑日志,它是由Server层进行记录,如下图所示:
M ysql数据库的任何存储引擎的都会记录binlog日志。binlog是通过追加的方式进行写入的,可以通过max_binlog_size参数设置单个binlog 文件的大小,每当文件大小达到给定值之后就会生成新的文件来保存日志。如下是查询单个binlog大小的查询结果(命令:SHOW VARIABLES LIKE ‘max_binlog_size%’):
2、binlog的格式
binlog日志有三种格式,分别为STATMENT、ROW和MIXED。在MySQL 5.7.7前默认的格式是STATEMENT,MySQL 5.7.7后默认值是ROW。
(1) STATMENT
该格式是基于SQL语句的复制,每一条修改数据的SQL语句会记录到binlog中,如执行一条更新的sql(update order set status = 1 where orderId = 123456),binlog记录如下如所示:
STATMENT格式有自己的优势也有一定的弊端,如下整理其优势和劣势:
优点 | 不需要记录每一行的变化,减少了binlog日志量,节约了IO,从而提高了性能 |
---|---|
缺点 | 在某些情况下会导致主从数据不一致,比如执行sysdate()、sleep()等 |
(2)ROW
基于行的复制是不记录每条SQL语句的上下文信息,仅需记录哪条数据被修改了。记录的不再是简单的SQL语句了,还包含了操作的具体数据。
row格式的binlog优缺点如下所示:
优点 | 不会出现某些特定情况下的存储过程、或function、或trigger的调用和触发无法被正确复制的问题 |
---|---|
缺点 | 会产生大量的日志,尤其是alter table的时候会让日志暴涨 |
(3) MIXED
基于STATMENT和ROW两种模式的混合复制,一般复制使用STATEMENT模式保存binlog,对于STATEMENT模式无法复制的操作使用ROW模式保存binlog。
MySQL会判断这条SQL语句是否会引起数据不一致,如果是就用row格式,否则就用statement格式。
3、binlog的刷盘机制
对于 Innodb存储引擎而言,只有在事务提交时才会记录 binlog,那么 binlog在什么时候通过什么样的方式将内存中的数据刷到磁盘呢?
binlog的写入时机是事务执行过程中,先把日志写到binlog cache上(系统会给每个线程分配一块作为binlog cache的内存),当事务提交的时候再把binlog cache写到文件缓存系统(page cache),最后由mysql的sync_ binlog参数控制何时将page cache上的binlog数据写到磁盘上,如下图所示:
binlog cache执行write的时候把日志写入到page cache上的速度很快,因为此时并没有把数据持久化硬盘。当执行fsync才是将binlog数据持久化到硬盘上。
write和fsync的执行时机都是可以由参数sync_binlog控制,此参数可以配置成0、1、N(N>1)等值,如下是设置这几种值的含义:
0 | 每次提交事务都只会write,不去强制要求,由系统自行判断何时写入磁盘上。 |
---|---|
1 | 每次提交事务的时候都会执行fsync写入磁盘 |
N(N>1) | 每次提交事务都会write,但是积累N个事务后才fsync写入磁盘 |
sync_binlog最安全的是设置为1,Mysql5.7后从性能和可靠性之间做出了平衡,默认值采用 sync_binlog=1的方式。在实际的工作中可以将sync_binlog的值适当调大,通过牺牲一定的可靠性来获取更好的性能。
4、binlog的作用
在实际应用中binlog 的主要使用场景是主从复制和数据恢复。
(1)主从复制
主从复制的原理如下所示:
在Master端开启binlog之后,通过将binlog发送到各个Slave端,Slave端使用binlog同步数据,从而达到主从数据一致性的需求。但是复制过程有一个很重要的限制,就是复制操作在从库上是串行化的,也就是说主库上的并行更新操作不能在从库上并行操作。
Mysql主从同步就可以有三种模式,分别是同步复制、异步复制和半同步复制。
(2)数据恢复
当数据库发生变更时binlog会记录数据库中的所有变化,需要恢复的时候可以通过mysqlbinlog工具,根据binlog中的开始位置和结束位置或者开始时间和结束时间还原本部分操作,结束位置或者结束时间一般是数据被破坏或删除之前的位置。
总结:
(1)binlog是server层产生的用于记录数据写操作变更的二进制文件,它属于逻辑日志,使用任何存储引擎的Mysql都会记录binlog日志。
(2)binlog的有三种数据格式,分别为STATMENT、ROW和MIXED。
(3)binlog的刷盘是通过 syn c binlog参数控制,不同的参数值有不同的效果,Mysql5.7后默认使用的 syn c binlog=1。
(4)binlog的主要作用有主从复制和数据恢复。