二十一、二进制日志介绍

二进制日志作用

记录的对数据库进行的增删改等操作。

可以用于
1、主从复制
2、数据恢复

开启二进制日志

默认未开启,开启需要修改配置文件/etc/my.cnf

$ vim /etc/my.cnf
[mysqld]
server_id=6
#当log_bin=1表示开启二进制日志并放在mysql的data/目录下
log_bin=/data/binlog/mysql-bin
#5.7版本默认配置是row,可以省略该行参数配置,下文会有解释
binlog_format=row 
#每次事务提交都立即将二进制日志刷写到磁盘中
sync_binlog=1	
 
#创建目录并授权
$ mkdir -p /data/binlog/
$ chown -R mysql.mysql /data

#重启
$ /etc/init.d/mysqld restart

查看二进制日志发现文件名为mysql-bin.000001,mysql-bin.000002以此类推
mysql-bin.index记录的是存在的二进制日志文件名

$ cd /data/binlog/ && ll
total 24
-rw-r-----. 1 mysql mysql 680 Mar 29 16:42 mysql-bin.000001
-rw-r-----. 1 mysql mysql 501 Mar 30 20:48 mysql-bin.000002
-rw-r-----. 1 mysql mysql 177 Mar 30 20:50 mysql-bin.000003
-rw-r-----. 1 mysql mysql 177 Mar 30 20:51 mysql-bin.000004
-rw-r-----. 1 mysql mysql 154 Mar 30 20:51 mysql-bin.000005
-rw-r-----. 1 mysql mysql 150 Mar 30 20:51 mysql-bin.index

#index文件记录的是二进制日志文件名
$ cat mysql-bin.index 
/data/binlog/mysql-bin.000001
/data/binlog/mysql-bin.000002
/data/binlog/mysql-bin.000003
/data/binlog/mysql-bin.000004
/data/binlog/mysql-bin.000005

查看二进制日志文件位置

mysql> show variables like '%log_bin%';
+---------------------------------+------------------------------+
| Variable_name                   | Value                        |
+---------------------------------+------------------------------+
| log_bin                         | ON                           |
| log_bin_basename                | /data/binlog/mysql-bin       |
| log_bin_index                   | /data/binlog/mysql-bin.index |
| log_bin_trust_function_creators | OFF                          |
| log_bin_use_v1_row_events       | OFF                          |
| sql_log_bin                     | ON                           |
+---------------------------------+------------------------------+
6 rows in set (0.00 sec)

需要注意的是二进制文件可能有多个,但mysql只使用最后一个。

查看已存在的二进制日志

滚动刷新一个新的二进制文件并查看他的位置

mysql> flush logs; #滚动产生一个新的日志文件
mysql> show binary logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |       680 |
| mysql-bin.000002 |       501 |
| mysql-bin.000003 |       177 |
| mysql-bin.000004 |       177 |
| mysql-bin.000005 |       154 |
+------------------+-----------+
5 rows in set (0.00 sec)

查看正在使用的二进制日志

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000005 |      154 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)


查看二进制日志内容

$ cd /data/binlog
$ mysqlbinlog mysql-bin.000004

#不显示SET开头的内容
$ mysqlbinlog mysql-bin.000004 | grep -v '^SET' 

#-vvv详细显示,--base64-output解密输出,因为默认row模式是以base64加密的需要使用base64解密
$ mysqlbinlog --base64-output=decode-rows -vvv mysql-bin.000004  

二进制是以事件为最小记录单元,at到下一个at为一个事件。

因为默认使用RBR模式也就是行模式记录所以需要进行base64解密才能看到事务的具体内容。

内容是伪代码,含义是往第一列插入值1

-d参数只显示有关数据库的二进制日志内容

#只显示有关test数据库的二进制日志内容
$ mysqlbinlog -d test mysql-bin.000004 

#导出指定库test的二进制日志
$  mysqlbinlog -d test mysql-bin.000004 -r bin.sql

#注意使用-d参数时,二进制日志文件中必须记录如下写法
use test;
insert into student values(1,'tz');

#使用如下写法不能使用-d参数
insert into test.student values(1,'tz');

清理二进制日志

随着数据库使用,二进制日志占用空间会越来越大,此时有两种清理方式

1、自动清理方式
使用expire_logs_days参数,0为永不过期

mysql> show variables like '%expire%';
+--------------------------------+-------+
| Variable_name                  | Value |
+--------------------------------+-------+
| disconnect_on_expired_password | ON    |
| expire_logs_days               | 0     |
+--------------------------------+-------+
2 rows in set (0.00 sec)

#过期时间根据生产环境调整设置,这里设置7天
mysql> set global expire_logs_days=7;

注意:即便是设置了过期时间,也不会到期自动删除日志,需要以下条件触发才会删除过期日志
1、当binlog大小超过max_binlog_size值
2、手动执行flush logs
3、重启数据库(重启MySQL将会自动生成一个新的二进制日志文件用于记录binlog)

2、手工清理方式
查看purge命令帮助信息

mysql> help purge 

使用purge命令删除,适用于主从复制,使用这种方式删除主库的二进制日志,从库不会崩溃

#删除000032之前的二进制日志,不包括000032日志文件
mysql> PURGE BINARY LOGS TO 'mysql-bin.000032';

#按照时间方式,删除2008-04-02 22:46:26之前的日志文件
mysql> PURGE BINARY LOGS BEFORE '2008-04-02 22:46:26'; 

#清除3天前的日志文件
mysql> PURGE MASTER LOGS BEFORE DATE_SUB( NOW( ), INTERVAL 3 DAY);  

3、使用reset master删除所有日志

#慎用,如果在主从复制的主库执行该操作,从库会崩溃
mysql> reset master ;

日志文件滚动生成

有如下几种方式生成新的二进制日志文件
1、使用flush logs;命令
2、重启数据库
3、日志文件达到最大上限,默认1G大小,可通过max_binlog_size=1073741824参数控制

学习来自:老男孩深标DBA课程 第六章 日志管理,《MySQL入门与提高实践》第七章,其余参考1,其余参考2

posted @ 2021-03-14 11:18  努力吧阿团  阅读(125)  评论(0编辑  收藏  举报