Mysql 删除binlog日志方法

方法1 RESET MASTER;

解释:

该方法可以删除列于索引文件中的所有二进制日志,把二进制日志索引文件重新设置为空,并创建一个以.000001为后缀新的二进制日志文件。
该语法一般只用在主从环境下初次建立复制时。
在主从复制进行过程中,该语句是无效的。

主从环境下的配置步骤:
a. 启动master和slave,开启replication(即复制)
b. 在master上运行一些测试的语句,看数据是否能够复制到 slave上面
c. 当复制运行正常的话,就在从上stop slave 然后执行 reset slave,去掉不需要的数据 
d. 在master上面执行reset master 清除测试产生的数据
查看删除前日志
MariaDB [cndba]> system ls -ltr /data/mysql10.2.11/mysql-bin*
-rw-rw----. 1 mysql mysql 3543 Dec 15 11:41 /data/mysql10.2.11/mysql-bin.000001
-rw-rw----. 1 mysql mysql  342 Dec 15 11:41 /data/mysql10.2.11/mysql-bin.000002
-rw-rw----. 1 mysql mysql   38 Dec 15 11:41 /data/mysql10.2.11/mysql-bin.index
用RESET MASTER命令进行删除
MariaDB [cndba]> RESET MASTER; 
查看删除后的日志
MariaDB [cndba]> system ls -ltr /data/mysql10.2.11/mysql-bin*
-rw-rw----. 1 mysql mysql 328 Dec 15 11:42 /data/mysql10.2.11/mysql-bin.000001
-rw-rw----. 1 mysql mysql  19 Dec 15 11:42 /data/mysql10.2.11/mysql-bin.index

方法2:PURGE MASTER LOGS

   语法:
    PURGE { BINARY | MASTER } LOGS  
    { TO 'log_name' | BEFORE datetime_expr }  
    用于删除列于在指定的日志或日期之前的日志索引中的所有二进制日志。这些日志也会从记录在日志索引文件中的清单中被删除,这样被给定的日志成为第一个。
    实例:
PURGE BINARY LOGS TO 'mysql-bin.000002';  
    PURGE BINARY LOGS BEFORE '2017-12-15 11:53:59';  
    分别表示:删除mysql-bin.000002之前的日志(不包括mysql-bin.000002)
删除2014-04-28 23:59:59时间点之前的日志

注意事项:
    在删除binlog日志同时,也会清理mysql-bin.index的文件记录,清理完后命令中指定的日志文件成为第一个。
    主从架构下,如果复制正在进行中,执行该命令是安全的,例如slave正在读取我们要删除的log,该语句将什么也不会做,并返回一个错误;如果复制是停止的,我们删除了一个slave还未读取的日志,则复制重新建立连接时将会失败。
建议操作步骤:

    a 在每个从属服务器上,使用SHOW SLAVE STATUS来检查它正在读取哪个日志。
    b 使用SHOW MASTER LOGS获得主服务器上的一系列日志。
    c 在所有的从属服务器中判定最早的日志。这个是目标日志。如果所有的从属服务器是最新的,这是清单上的最后一个日志。
    d 备份您将要删除的所有日志。(这个步骤是自选的,但是建议采用。)
    e 清理除目标日志之外的所有日志。

方法3 手动删除binlog日志文件

手动删除binlog日志文件
删除mysql-bin.000003 日志
[root@maridb1 mysql10.2.11]# rm -rf mysql-bin.000003
[root@maridb1 mysql10.2.11]# vi mysql-bin.index
./mysql-bin.000003
./mysql-bin.000004
删除./mysql-bin.000003 这一行
查看删除后的日志
MariaDB [(none)]> system ls -ltr /data/mysql10.2.11/mysql-bin*
-rw-rw----. 1 mysql mysql 328 Dec 15 11:58 /data/mysql10.2.11/mysql-bin.000004
-rw-rw----. 1 mysql mysql  19 Dec 15 11:58 /data/mysql10.2.11/mysql-bin.index

方法4:指定过期天数(expire_logs_days)

MariaDB [(none)]> show variables like 'expire_logs_days';  
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| expire_logs_days | 0     |
+------------------+-------+
1 row in set (0.00 sec)
临时修改过期时间
MariaDB [(none)]> set global expire_logs_days = 60;
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> show variables like 'expire_logs_days';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| expire_logs_days | 60    |
+------------------+-------+
1 row in set (0.00 sec)
修改/etc/my.cnf 增加参数
expire_logs_days=60
重启mysql 服务生效
刷新日志查看,日志被清楚
MariaDB [(none)]> flush logs;
Query OK, 0 rows affected (0.03 sec)

MariaDB [(none)]> show master logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000006 |       371 |
+------------------+-----------+
3 rows in set (0.00 sec)

注意事项
    在双机复制环境下,应确保过期天数不应小于从机追赶主机binlog日志的时间。

触发过期删除的条件
    每次进行 LOG flush的时候会自动删除过期的日志。
    触发log flush的条件为:
      1. 重启mysql;
      2. BINLOG文件大小达到参数max_binlog_size限制;
      3. 手工执行命令。

总结

1、我们一般情况采取第三、第四种方式
2、每次执行命令不需重启即可清楚超期日志

上一篇:ACID的实现原理


下一篇:《MySQL实战45讲》(20-35讲)学习总结