目录
一、什么是Binlog
二、Binlog文件记录模式
三、Binlog 日志内容
四、常用的binlog日志操作命令
五、binlog日志中间件
一、什么是Binlog
Binlog (Binary log)是MySQL的二进制日志,以二进制的形式记录了对于数据库的变更(DDL,DML,DCL)不包括select和show 操作。Binlog日志是以事件形式记录,还包含语句执行的消耗时间。
Binlog主要的使用场景:
1. 用来查看mysql变更:通过mysqlbinlog工具来查看变更。
2. MySQL的备份恢复:通过mysqlbinlog工具来恢复数据。
ps: 数据库备份其他方法,如 通过导出数据或者表文件的拷贝来保护数据、数据库复制-MySQL内部复制功能建立在两个或两个以上服务器之间,通过设定它们之间的主从关系来实现的。
3. MySQL的主从复制:在主库中开启Binlog功能,这样主库就可以把Binlog传递给从库,从库拿到Binlog后实现数据恢复从而达到主从数据一致性。
二、Binlog文件记录模式
Binlog文件名默认为“主机名_binlog-序列号”格式。也可以在配置文件中指定名称。
文件记录模式有STATEMENT, ROW和MIXED三种,具体含义如下:
STATEMENT(Statement-based-replication,SBR):基于语句的复制。每一天被修改数据的SQL都会
记录到master的Binlog中,slave在复制的时候SQL进程会解析成和原来master端执行过的相同的SQL再次执行。
优点:日志量少,减少磁盘IO,提升存储和恢复速度。
缺点:在某些情况下会导致主从数据不一致,比如last_insert_id(), now()等函数。
ROW(row-based replication, RBR): 日志中会记录每一行数据被修改的情况,然后在slave端对相同的
数据进行修改。
优点:能清楚记录每一个行数据的修改细节,能完全实现主从数据同步和数据的恢复。
缺点:批量操作,会产生大量的日志,尤其是alter table会让日志暴涨。
MIXED(mixed-based replication, MBR): 以上两种模式的混合使用,一般会使用STATEMENT模式保存Binlog,
对于STATEMENT模式无法复制的操作使用ROW模式保存Binlog,MySQL会根据执行的SQL语句选择写入模式。
三、Binlog 日志内容
binlog日志记录了所有的DDL和DML语句,一般来说开启binlog日志大概会有1%的性能损耗。
binlog日志包括两类文件
1)二进制日志索引文件(文件名后缀为.index)用于记录所有的二进制文件
2)二进制日志文件(文件名后缀为.00000*)记录数据库所有的DDL和DML(除了数据查询语句select)语句事件。
文件结构:
使用前提:
开启binlog日志->操作之前对数据进行备份->flush logs,将缓存存磁盘
四、常用的binlog日志操作命令
1)查看所有binlog日志列表
mysql> show master logs;
2)查看master状态,即最后(最新)一个binlog日志的编号名称,及其最后一个操作事件pos结束点(Position)值
mysql> show master status;
3)flush刷新log日志,自此刻开始产生一个新编号的binlog日志文件
mysql> flush logs;
4) 查看所有的binlog:
mysql> show binary logs;
5)show binlog events [IN 'log_name'] [FROM pos] [LIMIT [offset,] [row_count];
解释:
IN 'log_name' :指定要查询的binlog文件名(不指定就是第一个binlog文件)
FROM pos :指定从哪个pos起始点开始查起(不指定就是从整个文件首个pos点开始算)
LIMIT [offset,] :偏移量(不指定就是0)
row_count :查询总条数(不指定就是所有行)
6)mysqlbinlog 两对非常重要的参数
--start-datetime --stop-datetime 解析某一个时间段内的 binlog;
--start-position --stop-position 解析在两个 position 之间的 binlog;
7)利用binlog日志恢复mysql数据
五、binlog日志中间件
数据最终一致性: 在数据库操作成功后,需要进行一些其他操作,如:发送一条消息到MQ中、更新缓存或者更新搜索引擎中的索引等
如何保证数据库操作与这些行为的一致性,就成为一个难题。以数据库与redis缓存的一致性为例:操作数据库成功了,可能会更新redis失败;反之亦然。很难保证二者的完全一致。
思路: 不要同时去更新数据库和其他组件,只是简单的更新数据库即可。
如果数据库操作成功,必然会产生binlog。之后,我们通过一个组件,来模拟的mysql的slave,拉取并解析binlog中的信息。通过解析binlog的信息,去异步的更新缓存、索引或者发送MQ消息,保证数据库与其他组件中数据的最终一致。
将模拟slave的组件,统一称之为binlog同步组件。目前有很多开源的实现,例如linkedin的databus,阿里巴巴的canal,美团点评的puma等。
当我们通过binlog同步组件完成数据一致性时,示意图如下:
扩展:
Databus: 低延迟、可靠的、支持事务的、保持一致性的数据变更抓取系统。由LinkedIn于2013年开源。Databus通过挖掘数据库日志的方式,将数据库变更实时、可靠的从数据库拉取出来,业务可以通过定制化client实时获取变更并进行其他业务逻辑。
canal是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费
二者对比: