我无法使 Mysql 日志轮换正常工作。 我不知道为什么这如此复杂,即使我遵循了文档和互联网建议,仍然无法使其工作。 我已在 3 个文件下启用了 Mysql 上的所有 3 个日志:常规日志、日志错误和慢速查询:error.log, mysql-slow.log , mysql.log
。 所有 3 个日志均正常运行。 其中一个文件(mysql.log)每天生成 10 Gbs,我想每 2 天对这个文件进行日志轮换,这意味着我想始终保留过去 2 天的数据,并不断循环数据以使其永远不会超过 30 Gbs 的数据,所以它看起来像这样(我修改了输出,为您提供我想要的示例):
ls -lh
-rw-r----- 1 mysql mysql 9.1G Apr 18 06:30 mysql.log
-rw-r----- 1 mysql mysql 9.3G Apr 17 06:28 mysql.log-20210417.backup
-rw-r----- 1 mysql mysql 9.0G Apr 16 06:28 mysql.log-20210416.backup
首先我尝试修改该文件/etc/logrotate.conf
,它看起来像这样:
# see "man logrotate" for details
# rotate log files weekly
weekly
# use the syslog group by default, since this is the owning group
# of /var/log/syslog.
su root syslog
# keep 4 weeks worth of backlogs
rotate 4
# create new (empty) log files after rotating old ones
create
# uncomment this if you want your log files compressed
#compress
# packages drop log rotation information into this directory
include /etc/logrotate.d
# no packages own wtmp, or btmp -- we'll rotate them here
/var/log/wtmp {
missingok
monthly
create 0664 root utmp
rotate 1
}
/var/log/btmp {
missingok
monthly
create 0660 root utmp
rotate 1
}
# system-specific logs may be configured here
/var/log/mysql/mysql.log {
su mysql mysql
create 600 mysql mysql
notifempty
daily
rotate 2
missingok
compress
copytruncate
postrotate
just if mysqld is really running
if test -x /usr/bin/mysqladmin && \
/usr/bin/mysqladmin ping &>/dev/null
then
/usr/bin/mysqladmin flush-logs
fi
endscript
}
我只是在文件末尾添加了以 开头的部分然后,我在目录中/var/log/mysql/mysql.log {
创建了该文件,并使用以 开头的部分更新了该文件。mysql
/etc/logrotate.d/
/var/log/mysql/mysql.log {
两种方法都失败了(使用 /etc/logrotation.conf 和 /etc/logrotate.d/mysql 文件),文件日志不断堆积超过 2 天:
total 52G
-rw-r----- 1 mysql mysql 13K Apr 16 08:41 error.log
-rw-r----- 1 mysql mysql 140 Apr 1 06:25 error.log.1
-rw-r----- 1 mysql mysql 5.7G Apr 18 09:37 mysql-slow.log
-rw-r----- 1 mysql mysql 114K Apr 18 19:24 mysql.log
-rw-r----- 1 mysql mysql 9.1G Apr 18 06:30 mysql.log.1
-rw-r----- 1 mysql mysql 9.3G Apr 14 06:28 mysql.log.1-2021041506.backup
-rw-r----- 1 mysql mysql 9.0G Apr 15 06:28 mysql.log.1-2021041606.backup
-rw-r----- 1 mysql mysql 9.2G Apr 16 06:28 mysql.log.1-2021041706.backup
-rw-r----- 1 mysql mysql 9.1G Apr 17 06:28 mysql.log.1-2021041806.backup
此外,我注意到创建了另一个文件,其名称末尾带有“1”:。mysql.log.1
奇怪。
我尝试修改的另一件事是文件/etc/cron.daily/logrotate
:我尝试了 2 个脚本:
#!/bin/sh
# Clean non existent log file entries from status file
cd /var/lib/logrotate
test -e status || touch status
head -1 status > status.clean
sed 's/"//g' status | while read logfile date
do
[ -e "$logfile" ] && echo "\"$logfile\" $date"
done >> status.clean
mv status.clean status
test -x /usr/sbin/logrotate || exit 0
/usr/sbin/logrotate /etc/logrotate.d/mysql
和
#!/bin/sh
/usr/sbin/logrotate /etc/logrotate.d/mysql
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
/usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0
两者都不起作用。您能帮我提供一些建议/指导,告诉我下一步该怎么做吗?抱歉发了这么长的帖子,谢谢。
答案1
已解决。在这种情况下,必须检查所有相关脚本: /etc/logrotate.conf 、 /etc/cron.daily/logrotate 和 /etc/logrotate.d/mysql 。
对我来说,问题出在 /etc/logrotate.d/mysql 中,使用 flush-logs 命令时,用户无权运行该命令,