MySQL不会在旋转后将错误logging到新文件中?

问题解决了,但我正在写下未来的参考。

/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