二进制日志

二进制日志(binlog)记录了所有的DDL(数据定义语言)语句和DML(数据操纵语言)语句,但不包括数据查询(select、show)语句

 

DDL语句的作用: 对数据库对象(数据库、表、列、索引等)进行创建、删除、修改 DML语句的作用: 用于添加、修改、删除和查询数据库记录,并检查数据完整性

 

二进制日志的作用

1、灾难时的数据恢复;

2、MySQL的主从复制。在MySQL8版本中,默认二进制日志是开启着的,涉及到的参数下面会详细讲

 

show variables like '%log_bin%';#查看二进制日志的参数,能查到6行2列的结果,前三行的作用如下

1、log_bin: 二进制文件状态,ON,也就是默认开启的

2、log_bin_basename: 最终生成的二进制文件,/var/lib/mysql/binlog,也就是在/var/lib/mysql/路径有很多binlog前缀的日志文件

3、log_bin_index: 日志的索引文件,/var/lib/mysql/binlog.index,binlog.index是索引文件记录了当前MySQL数据库关联的所有日志文件

 

查看二进制日志文件 cd /var/lib/mysql/ && ll; cat binlog.index;

 

日志格式 MySQL服务器中提供了多种格式来记录二进制日志,共有三个日志格式,对应的特点如下:

日志格式含义
statement基于SQL语句的日志记录,记录的是SQL语句,对数据进行修改的SQL都会记录在日志文件中
row基于行的日志记录,记录的是每一行的数据变更。(MySQL默认的日志格式。是可以修改为其他两种格式的,下面会讲)
mixed混合statement和row两种格式,默认采用statement,在某些特殊情况下会自动切换为row进行记录

 

日志查看: 由于二进制数据的日志不能直接读取,所以需要通过我们学过的二进制日志查询工具mysqlbinlog来查看,如下 mysqlbinlog [参数选项] 日志文件名;

 

参数选项如下 -d 指定数据库名称,只列出指定的数据库相关操作 -o 忽略掉日志中的前n行命令 -v 将基于行数据的日志数据重构为SQL语句 -w 将基于行数据的日志数据重构为SQL语句,并输出注释信息

 

日志删除:对于比较繁忙的业务系统,每天生成的binlog前缀的日志文件是很多的,如果长时间不清理,将会占用大量磁盘空间。清理方式如下

1、reset master: 删除全部binlog日志,删除之后,日志编号,将从binlog.000001重新开始

2、purge master logs to 'binlog.**': 删除**编号之前的所有日志

3、purge master logs before 'yyyy-mm-dd hh24:mi:ss': 删除日志为'yyyy-mm-dd hh24:mi:ss'之前产生的所有日志

 

如果不想手动删除过久的二进制日志文件,我们也可以在mysql的配置文件中配置二进制日志的过期时间,然后二进制日志过期之后会自动删除 show variables like '%binlog_expire_logs_seconds%';#默认的过期时间是30天

 

演示如下

row日志格式的日志文件,查看update行数据变更后的日志

 

首先执行一条update语句 update stu set age = age + 1;

 

查看MySQL默认的日志格式是哪个 show variables like '%binlog_format%';

 

举例: 当我们执行了一条update语句,这3个不同格式的日志会有什么区别呢

1、statement日志格式: 只记录这条update语句(下下面会单独讲,这里只讲下面那行的row格式的)

2、row日志格式: update这条语句能够影响的行,每一行都会被记录(变更之前+变更之后的数据都会被记录) 注意基于行的二进制日志文件,需要mysqlbinlog -v才能打开,不要漏了-v参数,因为我们打开的是行二进制日志文件 我们执行update语句的时候,就会在/var/lib/mysql生成基于行的二进制日志文件

 

查看二进制日志里面到底记录了什么数据,例如查看binlog.000002二进制日志文件 cd /var/lib/mysql && mysqlbinlog -v binlog.000002;#注意你的不是binlog.000002,你要用你binglog后面最大的尾缀,才是最新的数据 #如何查看你binglog后面最大的尾缀: 先cd /var/lib/mysql && ll; 找出binlog.xxxx数字最大的文件,就是目前最新的二进制日志文件 #里面记录的才有我们刚刚执行的update语句产生的日志数据

 

statement日志格式的日志文件,查看update行数据变更后的日志

 

首先执行一条update语句 update stu set age = age - 1;

 

如何把默认的日志格式row修改为statement或mixed。需要在配置文件里面才能改,如下 vim /etc/my.cnf; 进去编辑页面之后,在最末尾行添加如下 binlog_format=STATEMENT 保存退出之后,重启mysql即可生效 systemctl restart mysqld

 

#然后cd /var/lib/mysql && ll; 找出binlog.xxxx数字最大的文件,就是目前最新的二进制日志文件,例如binlog.000003 #里面记录的才有我们刚刚执行的update语句产生的日志数据

 

查看二进制日志里面到底记录了什么数据,例如查看binlog.000003二进制日志文件 mysqlbinlog binlog.000003; #不需要加-v参数,原因:statement日志格式的日志文件记录的就是SQL,也就是我们能读懂的 #如果是row日志格式的日志文件,就需要加-v参数(我们上上面演示过),因为它记录的是基于行的数据,我们读不懂

 

注意只有update、insert、create、delete语句的操作才会被记录到二进制日志中,select语句是不会被记录的 原因:二进制文件只记录DDL和DML语句

 

日志删除

cd /var/lib/mysql && ll; #查看有哪些日志。linux终端执行 purge master logs to 'binlog.000003'; #表示删除binlog.000002日志文件、binlog.000001日志文件。登录进mysql后执行 reset master; #删除所有binlog前缀的日志。登录进mysql后执行