二十一、二进制日志介绍
二进制日志作用
记录的对数据库进行的增删改等操作。
可以用于
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
参数控制
今天的学习是为了以后的工作更加的轻松!