一、binlog简介
mysql-binlog是MySQL数据库最重要的二进制日志,它记录了所有的DDL和DML((除了数据查询语句),以事件形式记录,还包含语句所执行消耗的事件。binlog主要应用于主从复制和数据恢复。
![f89bc3ba5879d7c609b6650be44339ce.png](https://i-blog.csdnimg.cn/blog_migrate/220d62965282f1ffbeb73b75dd0b30fe.jpeg)
binlog主从复制主要有三个步骤
第一步:master在每次准备提交事务完成数据更新前,将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log event,简称event)
第二步:slave启动一个I/O线程来读取主库上binary log中的事件,并记录到slave自己的中继日志(relay log)中。
第三步:slave还会起动一个SQL线程,该线程从relay log中读取事件并在备库执行,从而实现备库数据的更新。
二、binlog的格式
binlog的格式也有三种:STATEMENT、ROW、MIXED 。
1、STATMENT模式:基于SQL语句的复制(statement-based replication, SBR),只记录修改SQL语句。
优点:日志文件小,节约IO。
缺点:准确性差,对一些系统函数不能准确复制或不能复制,如now()、uuid()等
2、基于行的复制(row-based replication, RBR):每一行记录的每个字段变化前后得到值。
优点:准确性强,能准确复制数据的变更
缺点:日志文件大,较大的网络IP和磁盘IO。
业内目前推荐使用的是row模式,准确性高,虽然说文件大,但是现在有SSD和万兆光纤网络,这些磁盘IO和网络IO都是可以接受的。
3、混合模式复制(mixed-based replication, MBR):statement和row模式的混合。
优点:准确性强,文件大小适中
缺点:有可能发生主从不一致问题。
binlog日志包括两类文件:
1)、二进制日志索引文件(文件名后缀为.index)用于记录所有的二进制文件。
2)、二进制日志文件(文件名后缀为.00000*)记录数据库所有的DDL和DML(除了数据查询语句select)语句事件。
三、binlog配置
在MySQL配置文件my.cnf文件中的mysqld节中添加下面的配置文件:
[mysqld]
server-id=1
#设置日志格式
binlog_format = mixed
#设置日志路径,注意路经需要mysql用户有权限写
log-bin =mysql-bin
#设置binlog清理时间
expire_logs_days = 7
#binlog每个日志文件大小
max_binlog_size = 100m
#binlog缓存大小
binlog_cache_size = 4m
#最大binlog缓存大小
max_binlog_cache_size = 512m
重启MySQL生效,如果不方便重启服务,也可以直接修改对应的变量即可。
四、binglog 常用参数
查看binlog是否开启
show variables like '%log_bin%';
select @@log_bin
查看binlog列表
show binary logs;
查看当前正在写入的日志
show master logs;
show master status;
查看log_bin中的内容
show binlog events [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count];
show binlog events;
指定查看具体的binlog日志的内容
show binlog events in 'mysql-bin.000002';
show binlog events in 'mysql-bin.000003';
刷新日志
flush logs;
重置(清空)所有binlog日志
reset master;
五、mysqlbinlog命令
binlog是二进制文件,使用普通的cat、more、vim都是无法打开的,必须使用自带的mysqllogbin命令查看
1、mysqlbinlog常见的选项有一下几个:
--start-datetime:从二进制日志中读取指定等于时间戳或者晚于本地计算机的时间
--stop-datetime:从二进制日志中读取指定小于时间戳或者等于本地计算机的时间 取值和上述一样
--start-position:从二进制日志中读取指定position 事件位置作为开始。
--stop-position:从二进制日志中读取指定position 事件位置作为事件截至
2、使用mysqlbinlog自带查看命令法
mysqlbinlog mysql-bin.0000002
3、根据时间查看binlog
mysqlbinlog --no-defaults mysql-bin.000720 --start-datetime="2018-09-12 18:45:00" --stop-datetime="2018-09-12:18:47:00"
4、其他命令示例
mysqlbinlog --no-defaults --database=db --start-datetime='2019-04-11 00:00:00' --stop-datetime='2019-04-11 15:00:00' mysql-bin.000007 | more
mysqlbinlog --no-defaults --database=db --base64-output=decode-rows -v --start-datetime='2019-04-11 00:00:00' --stop-datetime='2019-04-11 15:00:00' mysql-bin.000007 | more
5、恢复命令
恢复命令格式
mysqlbinlog mysql-bin.0000xx | mysql -u用户名 -p密码 数据库名
指定位置恢复
mysqlbinlog --start-position=219 --stop-position=681 mysql-bin.000001 > e:甥摰瑡e.sql
六、 GTID相关事件
1.为什么引入GPID?
解决主备复制的延时问题
单线程太慢,
多线程复制的问题是:最终数据可能不一致
2. 引入后有哪些缺点
不支持create table xx as select
3.GPID配置
从MySQL 5.6开始支持GTID复制。要开启GTID,修改my.cnf文件,添加以下配置
gtid-mode=on
enforce-gtid-consistency=true
在这种情况下,每当我们执行一个事务之前,都会记录一个GTID Event
insert into user("name") values("zhuyihan");
此时binlog内容如下:
![70a22e2b2a9ebce3255ff455597c0b05.png](https://i-blog.csdnimg.cn/blog_migrate/42d1892468dbb211451480d2427aa0bc.jpeg)
而当我们切换到下一个binlog文件时,会记录之前的已经执行过的GTID。这里我们通过执行以下sql手工切换到一个新的binlog文件。
mysql> flush logs;
Query OK, 0 rows affected (0.00 sec)
之后在新的binlog文件中,我们看到之前执行过的GTID在下一个文件中出现了。
![a19293f9882eba1303352337f2189935.png](https://i-blog.csdnimg.cn/blog_migrate/14b656680b52b85e131988a50fb52a86.jpeg)
Mysql binlog应用场景与原理深度剖析
本文不是专门讲解GTID的文章,感兴趣的读者,可以自行查看相关资料。