mysql-slow.log被截断后滚动旧文件位置及日志滚动开启方法
MySQL慢查询日志截断问题答复
1. 慢查询日志滚动文件、历史压缩旧文件的默认存储路径
MySQL原生没有内置慢查询日志自动轮转、历史文件压缩的功能,不存在官方预设的轮转后文件、压缩包默认存储路径。
你遇到的慢日志被截断,基本是外部日志轮转工具或者手动操作导致的:
- 如果是系统自带的
logrotate工具做的自动轮转,轮转生成的旧文件、压缩包默认和当前生效的慢查询日志存放在同一个目录。你可以直接在MySQL里执行show variables like 'slow_query_log_file';查到当前慢日志的实际存放路径:如果是包管理器安装的MySQL,默认路径一般是/var/log/mysql/或者/var/lib/mysql/;如果是二进制包手动编译安装的,默认在MySQL的数据目录下。轮转后的文件命名通常是mysql-slow.log.1、mysql-slow.log.2.gz这种带数字后缀、压缩包带.gz后缀的格式。 - 如果是手动执行了
flush logs或者mysqladmin flush-logs命令触发日志重载,且操作前没有给旧日志做重命名备份,旧日志会被直接覆盖截断,不会生成备份的轮转文件。
2. 是否需要在配置文件指定参数启用慢查询日志滚动功能
不需要,也没法通过修改MySQL配置文件(my.cnf/my.ini)开启慢日志自动滚动——因为MySQL本身就没提供对应功能的配置参数。
要实现慢日志自动轮转、压缩旧文件,通用方案有两种,都不需要修改MySQL核心配置:
- 用系统级的
logrotate工具配置规则:在/etc/logrotate.d/目录下新增MySQL慢日志的轮转配置,指定日志路径、保留历史文件份数、是否开启gzip压缩、轮转后执行flush logs通知MySQL重新打开日志文件即可,这是生产环境最常用的方案,不需要额外开发脚本。 - 自定义定时切割脚本:写简单的shell定时任务,按固定周期(比如按天)把当前慢日志重命名为带日期的备份文件,需要压缩的话直接调用gzip压缩,最后执行
mysqladmin flush-logs让MySQL生成新的空慢日志文件继续写入即可。
补充排查提示:你可以先去当前慢日志所在目录下看有没有带数字后缀、
.gz后缀的同名文件,如果有就是已经被logrotate自动切割了,不是日志丢失。
内容的提问来源于stack exchange,提问作者Banana Tech
相关产品推荐
相关产品推荐

