MySQL Binlog日志保留时长配置 & 删除方法

本文介绍了一次MySQL测试环境中因未配置binlog保留时间导致的binlog文件异常增长问题。详细阐述了binlog文件的增长原因、MySQL配置参数expire_logs_days的作用及配置方法,以及如何通过命令行和MySQL客户端进行手动清理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一. 背景

今天运维同学通知大数据测试环境一台mysql服务器, 关于mysql binlog文件存储异常的大.
通过如下命令:
show master logs;
可以看到, binlog 主服务器上的同步日志 “master.00数字” 文件达到了307个之多, 且每个文件大小约为1.1G, 占用磁盘空间达到300多G, 任由这种情况发展下去, 细思极恐啊.

MySQL master binlog 查询结果如下:

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1266690
Server version: 5.7.28-log MySQL Community Server (GPL)

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show master logs;
+---------------+------------+
| Log_name      | File_size  |
+---------------+------------+
| master.000001 | 1194127507 |
| master.000002 | 1183878743 |
| master.000003 | 2233177654 |
| master.000004 | 1074432717 |
| master.000005 | 1074995519 |
| master.000006 |  675126155 |
| master.000007 | 1074592348 |
| master.000008 | 1076686190 |
| master.000009 | 1075531352 |
| master.000010 | 1076749773 |
| master.000011 | 1074219420 |
...
| master.000305 | 1075076094 |
| master.000306 | 1073741903 |
| master.000307 |   13675149 |
+---------------+------------+

二. 产生原因

想起早前在做maxwell消费binlog实验的时候, 使用了这台测试mysql服务器做master, 其他测试服务器上的maxwell进程则作为slave.

为支持本次测试, /etc/my.cnf的配置参数当时新增了如下几个:

###  Desc: binlog function support; Author:David; Date:20201120

#mysqld模块
[mysqld]
server_id=1
log-bin=master
binlog_format=row

但是要命的是, 当时忘记配置 binlog 日志的保留时间参数了:
expire_logs_days=7
导致从20201120 至 20210920, 在约11个月的时间里 master binlog文件增长到307个之多.

三. 配置MySQL Binlog日志保留时长

3.1 <临时有效>方式 - 命令行

登录到mysql数据库中, 使用如下命令行方式执行命令行:
临时有效,重启mysqld服务后失效;
.
show variables like "%expire_logs_days%";
set expire_logs_days=7;
.
这种设置, 在重启mysqld服务后就失效了.

3.2 <永久有效>方式 - 配置文件

方式 ①:
在/etc/my.cnf文件中的[mysqld]模块下, 新增如下参数:
expire_logs_days=7
这样设置将永久有效,但需重启mysqld服务才会生效.
说明:
0-表示永不过期, 单位为天。
.
重启后, 再手工将(/data/mysql/data)目录下的N天前的"master.000数字" 文件删除.

方式 ②:
登录到mysql数据库中,执行:
set global expire_logs_days=7;
这样设置后, 后续的文件将按该策略进行滚动删除;
但如果删除之前的文件(如删除7天前的master binlog 文件), 还需执行如下操作:
mysql> PURGE MASTER LOGS BEFORE DATE_SUB(CURRENT_DATE, INTERVAL 7 DAY);

四. MySQL Binlog日志自动清理 & 手动删除方法

说明:
当开启mysql数据库主从时,会产生大量如mysql-bin.00000* log的文件,这会大量耗费您的硬盘空间。
mysql-bin.000001
mysql-bin.000002
mysql-bin.000003
mysql-bin.000004
mysql-bin.000005

有三种解决方法:

  • 1.关闭mysql主从,关闭binlog;
  • 2.开启mysql主从,设置expire_logs_days;
  • 3.手动清除binlog文件,> PURGE MASTER LOGS TO ‘MySQL-bin.010′;

实现:
1.关闭mysql主从,关闭binlog

# vim /etc/my.cnf  //注释掉log-bin,binlog_format
# Replication Master Server (default)
# binary logging is required for replication
# log-bin=mysql-bin
# binary logging format - mixed recommended
# binlog_format=mixed

然后重启数据库

2.重启mysql,开启mysql主从,设置expire_logs_days

# vim /etc/my.cnf  //修改expire_logs_days,x是自动删除的天数,一般将x设置为短点,如10

expire_logs_days = x //二进制日志自动删除的天数。默认值为0,表示“没有自动删除”
此方法需要重启mysql,附录有关于expire_logs_days的英文说明

当然也可以不重启mysql,开启mysql主从,直接在mysql里设置expire_logs_days

show binary logs;
show variables like ‘%log%’;
set global expire_logs_days = 10;

3.手动清除binlog文件

# /usr/local/mysql/bin/mysql -u root -p

PURGE MASTER LOGS BEFORE DATE_SUB(CURRENT_DATE, INTERVAL 10 DAY); //删除10天前的MySQL binlog日志,附录2有关于PURGE MASTER LOGS手动删除用法及示例
show master logs;

也可以重置master,删除所有binlog文件:

# /usr/local/mysql/bin/mysql -u root -p

reset master; //附录3有清除binlog时,对从mysql的影响说明

附录:
1.expire_logs_days英文说明
Where X is the number of days you’d like to keep them around. I would recommend 10, but this depends on how busy your MySQL server is and how fast these log files grow. Just make sure it is longer than the slowest slave takes to replicate the data from your master.
Just a side note: You know that you should do this anyway, but make sure you back up your mysql database. The binary log can be used to recover the database in certain situations; so having a backup ensures that if your database server does crash, you will be able to recover the data.

2.PURGE MASTER LOGS手动删除用法及示例,MASTER和BINARY是同义词

PURGE {MASTER | BINARY} LOGS TO ‘log_name’
PURGE {MASTER | BINARY} LOGS BEFORE ‘date’
删除指定的日志或日期之前的日志索引中的所有二进制日志。这些日志也会从记录在日志索引文件中的清单中被删除MySQL BIN-LOG 日志,这样被给定的日志成为第一个。

实例:

PURGE MASTER LOGS TO ‘MySQL-bin.010’; //清除MySQL-bin.010日志
PURGE MASTER LOGS BEFORE ‘2008-06-22 13:00:00’; //清除2008-06-22 13:00:00前binlog日志
PURGE MASTER LOGS BEFORE DATE_SUB( NOW( ), INTERVAL 3 DAY); //清除3天前binlog日志BEFORE,变量的date自变量可以为’YYYY-MM-DD hh:mm:ss’格式。

3.清除binlog时,对从mysql的影响
如果您有一个活性的从属服务器,该服务器当前正在读取您正在试图删除的日志之一,则本语句不会起作用,而是会失败,并伴随一个错误。不过,如果从属服务器是休止的,并且您碰巧清理了其想要读取的日志之一,则从属服务器启动后不能复制。当从属服务器正在复制时,本语句可以安全运行。您不需要停止它们。

&lt;think&gt;嗯,用户想了解如何清理MySQLbinlog日志,包括删除过期binlog配置方法。首先,我需要回忆一下关于MySQL binlog的相关知识。记得binlog是二进制日志,用于记录数据库的更改操作,主从复制恢复数据时会用到。但长时间不清理的话,会占用大量磁盘空间,所以用户需要清理方法。 根据系统级指令里的引用,用户提供了几个引用来源,我需要结合这些内容来组织回答。首先,手动清理的方法,比如使用PURGE命令。比如引用[1]提到用purge binary logs topurge binary logs before来删除指定文件或时间点之前的日志,这点很重要,因为直接删除文件可能导致不一致,所以必须用purge命令。另外,引用[4]提到了RESET MASTER命令,可以清空所有binlog,但要注意这会删除所有日志,适用于初始化场景,可能不适用于用户的情况,但需要提及。 然后是自动清理的配置。引用[1][2]都提到了expire_logs_days这个变量,在MySQL58中的设置方式不同吗?记得在MySQL8中,可能改成了binlog_expire_logs_seconds,但引用[2]说可以通过expire_logs_days设置,可能需要确认版本差异。比如,在MySQL5中,设置全局变量expire_logs_days=7,然后flush logs触发清理,同时修改my.cnf永久生效。而MySQL8可能支持两种参数,但用户引用里提到的是expire_logs_days,所以可能需要说明不同版本的配置方法。 另外,引用[3]提到MySQL重启时会检查并清理过期的日志,所以自动清理是否在修改参数后立即生效?可能需要执行flush logs或者等待日志切换。例如,设置全局变量后,执行flush logs让系统生成新的binlog文件,并触发清理旧文件。 还需要注意用户可能混淆了不同版本的处理方式,比如MySQL8默认使用binlog_expire_logs_seconds,而expire_logs_days可能已被弃用,但根据引用[2]的内容,用户可能还在使用expire_logs_days,所以需要分版本说明。例如,在回答中区分MySQL58的不同配置方法,或者在MySQL8中两种参数并存时的优先级问题。 另外,引用[4]提到的RESET MASTER命令,会删除所有binlog并重置索引文件,适用于需要完全清空的场景,但用户可能需要的是定期清理而不是全部删除,所以需要提醒谨慎使用该命令。 操作步骤方面,可能需要先检查当前binlog状态,使用show binary logs或show variables like &#39;%log_bin%&#39;; 确定日志位置设置。然后根据需求选择手动或自动清理。手动用PURGE,自动设置过期时间。配置自动清理时需要修改my.cnf并重启服务,或者动态设置全局变量。 还需要注意事项,比如不要直接删除文件,避免索引不一致;主从复制环境中要考虑从库是否已经读取了binlog,避免数据不一致;自动清理的时间设置要根据存储需求调整。 总结回答结构:先介绍手动清理方法(PURGE命令),然后自动清理配置(expire_logs_daysbinlog_expire_logs_seconds),不同版本的处理,操作命令示例,注意事项。最后生成相关问题。 现在需要检查是否有遗漏点,比如是否提到了版本差异,是否正确引用了来源。比如引用[1]提到在MySQL5中使用expire_logs_days,而引用[2]是MySQL8,但同样使用该变量,可能用户的信息中MySQL8仍支持该参数,或者需要说明两种参数的优先级。比如在MySQL8中,如果同时设置了expire_logs_daysbinlog_expire_logs_seconds,后者优先级更高,需要用户注意。 最后,生成的回答需要符合中文,结构清晰,分步骤说明,正确引用标记。&lt;/think&gt;### 如何清理MySQLbinlog日志 清理MySQLbinlog日志可以通过**手动清理****自动清理**两种方式实现,具体步骤如下: --- #### **一、手动清理** 1. **使用`PURGE`命令** - 删除指定文件之前的所有binlog: ```sql PURGE BINARY LOGS TO &#39;mysql-bin.009560&#39;; -- 保留mysql-bin.009560及之后的日志 ``` - 删除指定时间之前的所有binlog: ```sql PURGE BINARY LOGS BEFORE &#39;2023-08-01 00:00:00&#39;; -- 清理2023年8月1日前的日志 ``` *注意:切勿直接通过`rm`命令删除文件,否则会导致`binlog.index`与实际文件不匹配[^1]。* 2. **重置所有binlog(慎用)** 使用`RESET MASTER`会删除所有binlog并重置索引文件,适用于初始化场景: ```sql RESET MASTER; -- 清空所有binlog日志[^4] ``` --- #### **二、自动清理** 通过配置**日志过期时间**实现自动清理: 1. **临时生效(无需重启)** ```sql SET GLOBAL expire_logs_days = 7; -- 设置保留7天的日志[^1] FLUSH LOGS; -- 触发日志轮换并清理过期文件 ``` 2. **永久生效(需修改配置文件)** - 编辑MySQL配置文件`my.cnf`(或`my.ini`): ```ini [mysqld] expire_logs_days = 7 -- MySQL 5.x版本 binlog_expire_logs_seconds = 604800 -- MySQL 8.x版本(7天=604800秒) ``` - 重启MySQL服务使配置生效: ```bash systemctl restart mysql ``` *注意:MySQL 8.0默认使用`binlog_expire_logs_seconds`,若同时配置,此参数优先级高于`expire_logs_days`[^2][^3]。* --- #### **三、操作验证** 1. 查看当前binlog状态: ```sql SHOW BINARY LOGS; -- 列出所有binlog文件 SHOW VARIABLES LIKE &#39;%log_bin%&#39;; -- 检查日志路径及配置 ``` 2. 确认过期时间是否生效: ```sql SHOW VARIABLES LIKE &#39;expire_logs_days&#39;; SHOW VARIABLES LIKE &#39;binlog_expire_logs_seconds&#39;; ``` --- #### **注意事项** 1. **主从复制环境**:确保从库已读取需清理的binlog,否则可能导致复制中断。 2. **磁盘空间监控**:定期检查binlog占用情况,避免突发写操作导致磁盘满载。 3. **备份策略**:清理前建议备份重要binlog,以防数据恢复需要。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值