一、前言
开发业务系统尤其是与财务相关的系统,需要记录每一笔变更操作的日志,这一般有两种实现方案。
1、代码中通过AOP实现,提供注解跟踪记录日志,这种方案能够比较清晰地以业务角度记录操作日志,但记录变更前的旧值会比较困难。
2、对接Binlog日志解析数据生成日志数据,这种方案可以记录字段变更前旧值以及变更后的值,但日志不够清晰,主要是记录谁什么时间对哪张表哪个字段做了变更,变更前数据是什么,变更后数据是什么。
这两种方式我们项目中都有应用,Binlog这一系列文章主要围绕方案二讲解实施过程一些技术知识点。
二、MySQL Binlog 介绍
1、BinLog是什么
BinLog记录数据库所有表结构变更(create alter table)以及表数据修改(insert、update、delete)的二进制日志,它不会记录select这种对数据没有变更的操作。
最开始了解到BinLog是在2007年左右,当时公司会员数据库是1主3从架构,主从复制其实是依赖于binlog,印象比较深的就是主从复制延迟的问题。后来在做对接Vsearch时,数据增量当时有考虑通过BinLog完成同步,不过后来还是通过代码来实现增量数据同步到Vsearch中,具体原因现在想不起来了。
2、开启BinLog
安装的MySQL默认是没有开启BinLog的,可以用命令进行确认
最简单配置只要一行代码,在/etc/my.cnf配置文件[mysqld]下面加上一条语句
log-bin=mysql-bin即可开启binlog。
注:如果是5.7以上版本,需要设置server-id.如果是单机随便指定一个值如果是集群不要重复。
expire_logs_days:不指定时默认为0,binlog不会自动清理,可以根据实际情况修改这个值,超过天数就自动清理掉。
max_binlog_size:日志文件超过这个限定值并且是另一个事务写入时,会新建一个mysql-bin.00000X日志文件。
然后重启MySQL,log_bin变量的值变成ON就说明配置生效了。
3、三种模式
-
ROW:
记录的方式是行,即如果批量修改数据,记录的不是批量修改的SQL语句事件,而是每条记录被更改的SQL语句。
-
Statement
记录每一条修改数据的SQL语句(批量修改时,记录的不是单条SQL语句,而是批量修改的SQL语句事件)
-
Mixed
前两种模式的结合。在Mixed模式下,MySQL会根据执行的每一条具体的sql语句来区分对待记录的日志形式,也就是在Statement和Row之间选择一种.
三、MySQLBinLog
BinLog是二进制文件,无法直接打开,可以使用MySQL自带的MySQLBinLog以查看文件内容。
往user表写入一条数据,然后update,然后执行如下命令。
mysqlbinlog -v --base64-output=DECODE-ROWS mysql-bin.000002