目录
传送门
在前面讨论过MySQL的各种日志MySQL日志系列(1):MySQL各种日志
这里重点讨论一下binlog日志
binlog
binlog就是通常意义的二进制日志,文件一般是binlog.index文件(文件名称可以自定义)
前面介绍了如何配置及查看日志,具体可查看MySQL日志系列(1):MySQL各种日志
日志索引文件
binlog日志生成的时候,一般会有一个binlog.index文件,这个文件并不存储真正的日志,而是binlog日志的索引文件,可以打开查看一下内容
其中的binlog.000001~binlog.000016就是具体的日志文件,在同一个日志目录中
查看当前日志文件SQL命令
除了可以在服务器的MySQL日志目录查看日志文件以外,还可以通过日志命令查看
show BINARY logs;
binlog日志文件更新
binlog日志文件以"000001"结尾,一般日志文件个数跟MySQL启动次数相同,就是说,每启动一次就会生成一个新的日志文件,并且序号递增。
比如现在重启一次MySQL
service mysql restart
再查看一下日志文件,会发现新增了一个日志文件,binlog.000017
一般生产是很少重启MySQL服务器的,都是运行特别长时间的服务,那如果都记录在一个文件中,会造成文件特别大,所以可以通过配置日志文件大小来切割文件:在MySQL配置my.cnf里面设置参数:max_binlog_size = 100M,这种,表示如果文件达到100M兆,就会生成的新的文件。注意这里的大小一般不能超过1G或者小于4096B,默认为1G
binlog日志文件删除
MySQL提供了2种删除日志文件的方式,自动和手动。
自动删除日志文件配置
在MySQL配置my.cnf里面设置参数:expire_logs_days = 10,表示10天之后自动删除日志文件,不配置默认为0,表示不删除
手动删除日志文件
全部删除
手动删除日志,当然不是直接rm删除,而是通过MySQL提供的安全删除SQL命令去执行
reset master
执行该命令会删除所有的binlog文件,并且会重新生成,序号从"000001"开始
指定范围删除
-- 删除比文件名编号小的所有日志文件
purge master logs to 'log_name';
-- 删除指定日期之前的所有日志
purge master logs before 'date';
比如,删除指定"binlog.000018"日志文件以前的所有日志
PURGE MASTER logs to 'binlog.000018';
文件编号小于18的都被删除了
具体命令可以参考SQL Statements for Controlling Replication Source Servers
暂时停止binlog日志
binlog日志是默认关闭的,在配置文件中一旦配置开启之后,就无法关闭了。
必须通过修改配置文件,并且重启MySQL服务器才能停止。不过可以通过SQL命令临时停止binlog日志功能:
SET sql_log_bin = 0;
然后将值改为1,又恢复binlog日志记录。
比如,先关闭binlog日志功能,然后插入nacos库一条记录
INSERT INTO `nacos`.`config_info` (`id`, `data_id`, `group_id`, `content`, `md5`, `gmt_create`, `gmt_modified`, `src_user`, `src_ip`, `app_name`, `tenant_id`, `c_desc`, `c_use`, `effect`, `type`, `c_schema`, `encrypted_data_key`)
VALUES ('13', 'test13', 'DEFAULT_GROUP', 'test:\r\n id: aa', 'e761ae7c0bf7356db9d8104423581b6b', '2022-06-18 14:40:49', '2022-06-18 14:40:49', 'nacos', '112.45.96.24', '', '', NULL, NULL, NULL, 'yaml', NULL, '');
然后查看一下binlog日志文件binlog.000019,没有任何变化 ,开启binlog日志之后,再插入一条记录
INSERT INTO `nacos`.`config_info` (`id`, `data_id`, `group_id`, `content`, `md5`, `gmt_create`, `gmt_modified`, `src_user`, `src_ip`, `app_name`, `tenant_id`, `c_desc`, `c_use`, `effect`, `type`, `c_schema`, `encrypted_data_key`)
VALUES ('14', 'test14', 'DEFAULT_GROUP', 'test:\r\n id: aa', 'e761ae7c0bf7356db9d8104423581b6b', '2022-06-18 14:40:49', '2022-06-18 14:40:49', 'nacos', '112.45.96.24', '', '', NULL, NULL, NULL, 'yaml', NULL, '');
然后查看一下binlog日志文件binlog.000019,日志文件增加了
即可以通过SQL命令动态的暂停/恢复binlog日志记录功能
SET sql_log_bin = {0 | 1};
使用binlog恢复数据
binlog的一大功能就是用来恢复数据,如果MySQL数据意外丢失,可以用binlog日志来恢复,SQL命令为
mysqlbinlog [option] filename | mysql -uuser -ppass
其中
- option是一些可选参数,比较重要的两对是--start-date,--stop-date和--start-position,--stop-postion:分别代表恢复的起始时间,起始位置
比如,对于刚才的那张表`nacos`.`config_info`,现在的数据是5条数据
刚才插入"test14"这条数据时,是开启了binglog日志的,"test13"是没有记录的。
现在先关闭临时关闭binlog日志功能
SET sql_log_bin = 0;
然后删除data_id为"test13","test14"这2条数据
DELETE from `nacos`.`config_info` where data_id in('test13','test14');
现在再查询一下表`nacos`.`config_info`,刚才2条数据没有了
现在执行一下恢复命令,
./mysqlbinlog --skip-gtids=true /data/mysql/bin_log/binlog.000001 | ./mysql -uroot -p
- 注意可能要加--skip-gtids=xxx参数