/etc/cron.daily/logrotate:
错误:运行 /var/log/mysql.log /var/log/mysql/mysql.log 的共享 postrotate 脚本时出错
/var/log/mysql/mysql-slow.log
运行部分:/etc/cron.daily/logrotate 退出,返回代码 1
答案1
共享的 postrotate 脚本尝试访问 mysql 数据库但失败,可能是因为密码不匹配。
在 Debian 中,mysql 通过 mysql 用户 'debian-sys-maint'@'localhost' 进行控制。此用户的密码存储在/etc/mysql/debian.cnf。
cat /etc/mysql/debian.cnf
注意此文件中使用的密码。如果您有 root 密码(您应该有),则需要使用以下命令进入 mysql。
mysql -u root -p
否则,您只需输入“mysql”。在mysql>提示符下,运行以下命令。
GRANT RELOAD, SHUTDOWN, PROCESS, SHOW DATABASES, SUPER, LOCK TABLES ON *.* TO 'debian-sys-maint'@'localhost' IDENTIFIED BY 'XXXXXXXXXXXX';
替换在/etc/mysql/debian.cnf代替 X。最后...
quit
现在,您应该能够使用以下命令重新启动 mysql 服务器且不会出现任何错误:
/etc/init.d/mysql restart
但是,不需要重新启动。
答案2
在 Ubuntu 18 上我的修复方法是这样的:
mysql -u root -p <<_EOF_
ALTER USER 'debian-sys-maint'@'localhost' IDENTIFIED BY '`sudo grep --only-matching --max-count=1 --perl-regexp 'password\s*=\s*\K.*' /etc/mysql/debian.cnf | sed --expression='s/'\''/\\'\''/g'`';
_EOF_
这将提取密码,并/etc/mysql/debian.cnf
确保转义其中可能包含的任何单引号:
sudo grep \
--only-matching \
--max-count=1 \
--perl-regexp \
'password\s*=\s*\K.*' \
/etc/mysql/debian.cnf \
| sed \
--expression='s/'\''/\\'\''/g'`
并将其插入到以下 SQL 中:
ALTER USER 'debian-sys-maint'@'localhost' IDENTIFIED BY '<extracted-and-escaped-pw-inserted-here>';
...然后将其直接传送到客户端的标准输入mysql -u root -p
。
答案3
对于 Debian 9 (Stretch):debian-sys-maint
用户已经消失,因此解决方案是摆脱以下debian.cnf
任一方式:
/etc/logrotate.d/mysql-server
(适用于 MariaDB 或 MySQL)/etc/logrotate.d/percona-xtradb-cluster-5.7
(适用于 Percona XtraDB 集群)
在此文件中你会发现:
MYADMIN="/usr/bin/mysqladmin --defaults-file=/etc/mysql/debian.cnf"
应改为:
MYADMIN="/usr/bin/mysqladmin"
我不得不用 Percona XtraDB Cluster 来改变它,但目前它还没有为 Debian Stretch 发布,因此 logrotate 脚本目前是错误的。