目次
はじめに
Red Hat Enterprise Linux (RHEL) 9へのアップグレード後、以前は正常に動作していたログローテーション処理が失敗するようになり対処はわかるのですが原因がわからず困っていました。
この記事では、その原因と解決策を紹介したいと思います。
logrotate失敗することを確認
対象のlogrotateファイルは以下で、
postrotate (ローテート実行後に実行する処理)にてmysqladmin flush-logsを実行します。
/etc/logrotate.d/mysql
/var/log/mysql/mysqld.log
{
# 中略
postrotate
if test -x /usr/bin/mysqladmin&& \
/usr/bin/mysqladmin ping &>/dev/null
then
/usr/bin/mysqladmin flush-logs
fi
endscript
# 中略
}
またrootユーザに認証情報が通っていること確認します。
[root@denet-mysql ~]# mysqladmin ping
mysqld is alive
定期実行時に失敗することを確認するため/var/lib/logrotate/logrotate.status
の最終実行日時を変更してlogrotateをrestartし
その後失敗することを確認します。
また、ログも対象ディレクトリにローテートされないことが確認できるかと思います。
# 最終実行日時を変更
[root@denet-mysql ~]# vi /var/lib/logrotate/logrotate.status
# 最終実行日時を変更してlogrotateを再起動
[root@denet-mysql ~]# systemctl restart logrotate.service
[root@denet-mysql ~]# systemctl status logrotate.service
# エラーを確認
logrotate[]: error: 'Access denied for user 'root'@'localhost' (using password: NO)'
logrotate[]: error: error running non-shared postrotate script for /var/log/mysql/mysqld.log of '/var/log/mysql/mysqld.log '
原因と対応
RHEL9では、logrotateがcronではなくsystemdによって実行されるようになりました。
systemdで実行されるタスクはcronと違い特定のユーザー環境で実行されないため、
logrotateプロセスには$HOME環境変数が自動的に設定されません。
そのためMySQLの認証情報ファイル(/root/.mylogin.cnfや/root/.my.cnf)などの認証情報を参照できないようです。
解決策としては、postrotateスクリプト内で$HOME環境変数を明示的に設定するなどが挙げられます。
/etc/logrotate.d/mysql
/var/log/mysql/mysqld.log
{
# 中略
postrotate
if test -x /usr/bin/mysqladmin&& \
HOME=/root /usr/bin/mysqladmin ping &>/dev/null
then
HOME=/root /usr/bin/mysqladmin flush-logs
fi
endscript
# 中略
}
また、logrotateのユニットファイルに直接環境変数を記載したり、mysqladminコマンド実行時にオプションで認証情報を渡す形でも問題ないかと思います。
おわりに
この記事がRHEL9でmysql logrotate実行する際のエラーと解決方法を紹介しました。
どこかしら何かしら参考になれば幸いです。
参考にさせていただいた記事
systemd についての Tips
https://vlike-vlife.netlify.app/posts/systemd_tips
Red Hat Enterprise Linux 9でlogrotateを使ってログファイルを1時間ごとにローテーションさせてみた
https://dev.classmethod.jp/articles/rhel9-logrotate-every-hour/