MySQL中的binlog⽇志记录了数据库中数据的变动,便于对数据的基于时间点和基于位置的恢复,但是binlog也会⽇渐增⼤,占⽤很⼤的磁
盘空间,因此,要对binlog使⽤正确安全的⽅法清理掉⼀部分没⽤的⽇志。
[⽅法⼀]⼿动清理binlog
清理前的准备:
1.查看主库和从库正在使⽤的binlog是哪个⽂件
show master status
show slave status\G


2.在删除binlog⽇志之前,⾸先对binlog⽇志备份,以防万⼀
开始⼿动清除binlog,删除指定⽇期以前的⽇志
purge master logs before '2016-09-01 17:20:00'; //删除指定⽇期以前的⽇志索引中binlog⽇志⽂件

purge master logs to'mysql-bin.000022'; //删除指定⽇志⽂件的⽇志索引中binlog⽇志⽂件
注意:使⽤该语法,会将对应的⽂件和mysql-bin.index中对应路径删除
时间和⽂件名⼀定不可以写错,尤其是时间中的年和⽂件名中的序号,以防不下⼼将正在使⽤的binlog删除切勿删除正在使⽤的
binlog
reset master:将删除⽇志索引⽂件中记录的所有binlog⽂件,创建⼀个新的⽇志⽂件,起始值从000001开始。不要轻易使⽤该命令,
这个命令通常仅仅⽤于第⼀次⽤于搭建主从关系的时的主库。
reset slave:清除master.info⽂件、relay-log.info⽂件,以及所有的relay log⽂件,并重新启⽤⼀个新的relaylog⽂件
使⽤reset slave之前必须使⽤stop slave 命令将复制进程停⽌。


[⽅法⼆]通过设置binlog过期时间,使系统⾃动删除binlog⽂件
1.在mysql中修改
查看binlog过期时间,这个值默认是0天,也就是说不⾃动清理,可以根据⽣产情况修改,本例修改为7天

mysql> show variables like 'expire_logs_days'; 
+------------------------+-------+ 
| Variable_name  | Value | 
+------------------------+-------+ 
| expire_logs_days |   0  | 
+------------------------+-------+ 
mysql> set global expire_logs_days = 7;    #设置binlog多少天过期
设置之后不会⽴即清除,触发条件是以下之⼀:

1.binlog⼤⼩超过max_binlog_size,max_binlog_size默认为1G
2.⼿动执⾏flush logs

如果binlog⾮常多,不要轻易设置该参数,有可能导致IO争⽤,这个时候可以使⽤purge命令予以清除:
将bin.000055之前的binlog清掉:
mysql>purge binary logs to 'bin.000055';
将指定时间之前的binlog清掉:
mysql>purge binary logs before '2017-05-01 13:09:51

2.在配置⽂件my.cnf中修改
mysqld在每个⼆进制⽇志名后⾯添加⼀个数字扩展名。每次你启动服务器或刷新⽇志时该数字则增加。如果当前⽇志⼤⼩达到
max_binlog_size,还会⾃动创建新的⼆进制⽇志。如果你正则使⽤⼤的事务,⼆进制⽇志还会超过max_binlog_size:事务全写⼊⼀个⼆进制
⽇志中,绝对不要写⼊不同的⼆进制⽇志中。
expire_logs_days :定义了mysql清除过期⽇志的时间。默认值为0,表⽰“没有⾃动删除”。
max_binlog_size:⼆进制⽇志最⼤⼤⼩,如果⼆进制⽇志写⼊的内容超出给定值,⽇志就会发⽣滚动。你不能将该变量设置为⼤于1GB或
⼩于4096字节。默认值是1GB。
在my.cnf中添加配置,设置过期时间为30天
expire_logs_days = 30
max_binlog_size使⽤默认值即可
注意:
过期时间设置的要适当,对于主从复制,要看从库的延迟决定过期时间,避免主库binlog还未传到从库便因过期⽽删除,导致主从不⼀致

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐