binlog(二进制日志)是 mysql 核心日志组件,主要用于记录数据库所有 ddl(表结构变更)、dml(增删改)操作,是数据误恢复、操作审计、主从同步的核心依赖。
本文基于 mysql 8.0.17 版本,结合实际环境实测结果,全程实操讲解 binlog 的开启状态查看、存储路径定位、手动切换切割、安全清理,以及自动过期清理的参数配置。
一、环境说明(实测环境)
本次实操基于 mysql 8.0.17 版本:
mysql> show variables like '%expire%'; +--------------------------------+---------+ | variable_name | value | +--------------------------------+---------+ | binlog_expire_logs_seconds | 2592000 | | disconnect_on_expired_password | on | | expire_logs_days | 0 | +--------------------------------+---------+ 3 rows in set (0.01 sec) mysql> select version(); +-----------+ | version() | +-----------+ | 8.0.17 | +-----------+ 1 row in set (0.00 sec)
二、binlog 基础信息查看
日常运维中,首先需要掌握 binlog 的开启状态、存储位置、命名规则,才能进行后续切换、清理操作,以下命令均为 mysql 内部执行。
2.1 查看 binlog 开启状态
mysql 8.0 及以上版本默认开启 binlog,可通过以下命令验证:
-- 查看 binlog 开关状态 show variables like 'log_bin';

输出说明:
- value 为 on:binlog 已开启(默认状态);
- value 为 off:未开启,需修改配置文件添加
log_bin=on,重启 mysql 生效。
2.2 查看 binlog 存储路径与命名规则
binlog 的存储路径和命名前缀,决定了日志文件的位置和命名格式,核心命令如下:
-- 查看 binlog 存储路径 + 文件前缀(最关键) show variables like 'log_bin_basename'; -- 查看 binlog 索引文件路径(记录所有 binlog 文件名) show variables like 'log_bin_index';

关键说明:
存储路径:默认跟随 mysql 数据目录(如示例中的 /var/lib/mysql/);
命名规则:以 log_bin_basename 的值为前缀,后缀为 6 位自增序号,例如 binlog.000001、binlog.000002,序号依次累加。

2.3 查看所有 binlog 文件 & 当前活跃日志
查看服务器上所有 binlog 文件,以及当前正在写入的 binlog(活跃日志),方便后续清理、切换操作:
-- 列出所有 binlog 文件(含文件大小、是否加密) show binary logs; -- 等价于 show master logs; -- 查看当前正在写入的 binlog 文件及写入位置 show master status;
实测环境输出示例(参考):

2.4 查看 binlog 日志格式
binlog 有三种日志格式,生产环境优先推荐行级模式,确保数据恢复、主从同步的安全性:
show variables like 'binlog_format';
输出说明:
row:行级模式(生产推荐),记录每一行数据的变更,避免语句级模式的同步异常;statement:语句级模式,记录执行的 sql 语句,可能存在同步不一致问题;mixed:混合模式,自动切换行级和语句级,生产不推荐。
实测环境输出示例(仅参考):
mysql> show variables like 'binlog_format'; +---------------+-------+ | variable_name | value | +---------------+-------+ | binlog_format | row | +---------------+-------+ 1 row in set (0.01 sec) mysql>
三、binlog 手动切换(日志切割)
在数据库备份、版本变更、故障排查前,建议手动切换 binlog,生成新的日志文件,拆分操作区间,便于后续精准定位日志、恢复数据,避免单一日志文件过大。
3.1 应用场景
数据库全量备份前,切换 binlog,确保备份后的数据变更写入新日志,便于后续增量恢复;
运维操作(如建表、批量更新)前,切换 binlog,若操作出错,可精准删除该操作对应的日志片段;
单一 binlog 文件过大(接近默认 1g 阈值),手动切割,便于日志传输和分析。
3.2 手动切换命令(mysql 内部执行)
-- 方式1:刷新所有日志(含 binlog、错误日志、慢查询日志) flush logs; -- 方式2:仅切换 binlog(推荐,精准控制,不影响其他日志) flush binary logs;

3.3 切换生效验证
执行切换命令后,通过以下命令验证是否生效:
show master status;
生效表现:当前正在写入的 binlog 文件名序号 +1(例如从 binlog.000003 变为 binlog.000004),后续所有数据变更均写入新日志文件。
3.4 自动切换触发条件
无需人工干预,满足以下条件时,mysql 会自动切换 binlog:
- 当前 binlog 文件达到
max_binlog_size阈值(默认 1g); - mysql 服务重启(包括正常重启、异常重启后恢复);
- 执行
flush logs或flush binary logs手动触发。
binlog 文件大小,实测环境示例查看结果(仅参考):
mysql> show variables like 'max_binlog_size'; +-----------------+------------+ | variable_name | value | +-----------------+------------+ | max_binlog_size | 1073741824 | +-----------------+------------+ 1 row in set (0.00 sec) mysql> mysql> select 1073741824/1024/1024/1024; +---------------------------+ | 1073741824/1024/1024/1024 | +---------------------------+ | 1.000000000000 | +---------------------------+ 1 row in set (0.00 sec) mysql>
四、binlog 安全清理(手动+自动,重点实测参数)
binlog 会持续占用磁盘空间,若不及时清理,可能导致磁盘爆满,影响数据库正常运行。核心禁忌:rm -rf 严禁直接使用 物理删除 binlog 文件,会导致 binlog 索引文件错乱、mysql 启动失败,必须通过 mysql 内置命令安全清理。
结合当前实测的 binlog_expire_logs_seconds 和 expire_logs_days 参数,重点讲解自动清理配置和手动清理方法。
4.1 先搞懂:mysql 8.0.17 自动清理参数
从 mysql 8.0 开始,官方引入了更精细的 binlog 自动过期清理参数 binlog_expire_logs_seconds(按秒控制),优先级高于传统的 expire_logs_days(按天控制),结合实测结果详细说明:
实测参数解读
mysql> show variables like '%expire%'; +--------------------------------+---------+ | variable_name | value | +--------------------------------+---------+ | binlog_expire_logs_seconds | 2592000 | | disconnect_on_expired_password | on | | expire_logs_days | 0 | +--------------------------------+---------+ 3 rows in set (0.00 sec) mysql>
binlog_expire_logs_seconds = 2592000:按秒控制过期时间,2592000 秒 = 30 天,意味着 binlog 会自动保留最近 30 天,30 天前的日志会自动删除;expire_logs_days = 0:按天控制过期时间,0 表示关闭按天过期功能;- 优先级规则:
binlog_expire_logs_seconds ≠ 0 expire_logs_days只要 ,就会优先生效, 会被忽略(这是 mysql 8.0 的新特性)。
结论:当前的 mysql 8.0.17 已开启 binlog 自动清理,规则为 保留最近 30 天,无需手动干预。
修改自动清理时间(按需调整)
若需要调整自动保留天数(如生产环境保留 7 天,测试环境保留 3 天),可通过以下命令在线修改,无需重启 mysql,永久生效:
-- 示例1:设置自动保留7天(7天=604800秒) set persist binlog_expire_logs_seconds = 604800; -- 示例2:设置自动保留3天(3天=259200秒) set persist binlog_expire_logs_seconds = 259200; -- 示例3:关闭自动清理(不推荐,会导致binlog无限累积) set persist binlog_expire_logs_seconds = 0;
说明:persist 关键字表示参数永久生效,重启 mysql 后不会丢失;若使用 set global,则仅临时生效,重启后恢复默认。
4.2 手动清理 binlog(三种方式,按需使用)
自动清理适用于日常运维,若需要手动清理过期日志(如磁盘紧急释放空间),推荐以下三种安全方式,均在 mysql 内部执行。
方式1:按时间范围清理(最常用)
删除指定时间点之前的所有 binlog,精准控制清理范围,适合定期手动运维:
-- 方式1:删除7天前所有 binlog purge binary logs before now() - interval 7 day; -- 方式2:删除指定日期时间之前的 binlog(精准到秒) purge binary logs before '2026-04-26 19:19:41';
方式2:按文件名精准清理(最安全)
先查看所有 binlog 文件,保留当前活跃日志,清理前面的所有老旧日志,避免误删正在使用的日志:
-- 步骤1:查看所有 binlog 文件,确认要保留的文件 show binary logs; -- 步骤2:清理指定文件之前的所有日志(保留该文件及之后的日志) -- 示例:保留 binlog.000003,删除 binlog.000001、binlog.000002 purge binary logs to 'binlog.000003';
方式3:重置所有 binlog(仅测试环境使用)
生产环境、主从架构 严禁使用,该命令会清空所有历史 binlog,日志序号从 000001 重新开始:
reset master;
4.3 清理后验证
执行清理命令后,通过以下命令确认旧日志已删除:
show binary logs;
若老旧日志已消失,仅保留目标日志或新日志,说明清理成功。
五、日常运维常用命令汇总(直接复制使用)
-- 1. 查看 binlog 开启状态 show variables like 'log_bin'; -- 2. 查看 binlog 存储路径+前缀 show variables like 'log_bin_basename'; -- 3. 查看所有 binlog 文件 show binary logs; -- 4. 查看当前正在写入的 binlog show master status; -- 5. 查看 binlog 日志格式 show variables like 'binlog_format'; -- 6. 手动切换 binlog(推荐) flush binary logs; -- 7. 查看自动清理参数 show variables like '%expire%'; -- 8. 设置自动保留7天 binlog(永久生效) set persist binlog_expire_logs_seconds = 604800; -- 9. 按时间清理7天前 binlog purge binary logs before now() - interval 7 day; -- 10. 按文件名清理(保留 binlog.000003 及之后) purge binary logs to 'binlog.000003';
六、总结
本文基于 mysql 8.0.17 实测环境,聚焦 binlog 核心运维操作,重点总结以下关键点,方便日常查阅:
- 查看操作:通过
log_bin_basename、show binary logs可快速定位 binlog 位置、文件列表,掌握日志状态; - 切换操作:日常运维(备份、变更)前,用
flush binary logs手动切换日志,拆分操作区间,便于后续排查; - 清理操作:禁止直接物理删除 binlog,手动清理用
purge命令,自动清理依赖 mysql 8.0 新参数binlog_expire_logs_seconds(优先级高于expire_logs_days); - 实测重点:当前环境默认自动保留 30 天 binlog,无需额外配置,可按需用
set persist调整保留天数; - 生产建议:binlog 保留天数根据业务需求调整(核心业务 3~7 天),定期检查磁盘空间,避免日志累积导致磁盘爆满。
以上就是mysql 8.x中binlog核心操作教学:查看、切换、清理的详细内容,更多关于mysql binlog操作的资料请关注代码网其它相关文章!
发表评论