问题解决了,但我正在写下未来的参考。
/root/.my.cnf
[mysqladmin] user = root password = pa$$w0rd
/etc/logrotate.d/mysql
/var/log/mysql-slow.log /var/log/mysqld.log { daily rotate 7 dateext compress missingok #notifempty sharedscripts create 644 mysql mysql postrotate /usr/bin/mysqladmin flush-logs endscript }
从命令行运行时, logrotate
工作正常:
# logrotate -v -f /etc/logrotate.d/mysql
但从凌晨4点从cron运行时,它不起作用日志文件已被轮换,但MySQL不会将错误logging到新创build的文件:
-rw-r--r-- 1 mysql mysql 0 Aug 7 10:13 /var/log/mysqld.log -rw-r--r-- 1 mysql mysql 20 Aug 4 04:04 /var/log/mysqld.log-20120804.gz -rw-r--r-- 1 mysql mysql 20 Aug 5 04:04 /var/log/mysqld.log-20120805.gz -rw-r--r-- 1 mysql mysql 20 Aug 6 16:28 /var/log/mysqld.log-20120806.gz
在postrotate
,我将stderr和stdoutredirect到一个日志文件,以查看会发生什么情况:
postrotate /usr/bin/mysqladmin flush-logs > /var/log/mysqladmin.flush-logs 2>&1 endscript
我得到的是:
/usr/bin/mysqladmin: connect to server at 'localhost' failed error: 'Access denied for user 'root'@'localhost' (using password: NO)'
这听起来像mysqladmin
不会在logrotate中读取/root/.my.cnf
。
所以,试试这个:
postrotate env HOME=/root/ /usr/bin/mysqladmin flush-logs > /var/log/mysqladmin.flush-logs 2>&1 endscript
资源:
我有一个类似的问题。
添加/root/.my.cnf
,我没有重启MySQL,所以postrotate flush命令没有运行。
一旦我重新启动MySQL它读取根my.cnf文件并按预期工作。
在我的情况下,/ /etc/logrotate.d/mysql
的块看起来有点不同:
postrotate test -x /usr/bin/mysqladmin || exit 0 if [ -f `my_print_defaults --mysqld | grep -oP "pid-file=\K[^$]+"` ]; then # If this fails, check debian.conf! mysqladmin --defaults-file=/etc/mysql/debian.cnf flush-logs fi endscript
注意注释:“如果失败,请检查debian.conf!” 以及具有参数--defaults-file=/etc/mysql/debian.cnf
。 这个文件具有相同的[client]
部分,用空密码定义用户root
。 很显然,/ /root/.my.cnf
使用的密码也必须放在该文件中。 安全方面,/etc/mysql/debian.cnf类似于/root/.my.cnf
:由root:root
拥有,并且chmodded为0600
。