問題は解決しましたが、将来の参考のために書き留めておきます。
/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は新しく作成されたファイルにエラーを記録しません。
-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とstdoutの両方をログファイルにリダイレクトして、何が起こるかを確認します。
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)'
Logrotate中にmysqladmin
が/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ファイルが読み込まれ、期待どおりに動作しました。
したがって、私の場合、debian-sys-maint
ユーザーへの権限の問題があります。これは、galera-cluster
が各ノードで同じ整合性を持っているためです。ただし、各ノードは、各ノードのdebianユーザーによって個別にインストールされますが、設定ファイルは/etc/mysql/debian.cnf
です
したがって、logrotate
ファイルは次のようになります。
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 --local flush-error-log \
flush-engine-log flush-general-log flush-slow-log
fi
endscript
ソリューションは非常に単純なので、1つのノードでdebian-sys-maint
ユーザーのパスワードを変更し、すべてのノードの「/etc/mysql/debian.cnf」ファイルにパスワードを設定します
SET PASSWORD FOR 'debian-sys-maint'@'localhost' = password('YOUR PASSWORD');
私としては、それが役に立つことを願っています。
私の場合、/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
が所有し、0600
にchmoddedします。
私の場合。設定されている必要があります--defaults-file="/root/.my.cnf"
から/root/.my.cnf
in /usr/local/mysql/bin/mysqladmin --defaults-file="/root/.my.cnf" ping
および/usr/local/mysql/bin/mysqladmin --defaults-file="/root/.my.cnf" flush-logs
/etc/logrotate.d/mysql
/var/log/mysql/mysql_general_log.log
/var/log/mysql/error.log {
create 600 mysql mysql
notifempty
daily
rotate 5
missingok
compress
postrotate
# just if mysqld is really running
if test -x /usr/local/mysql/bin/mysqladmin && \
/usr/local/mysql/bin/mysqladmin --defaults-file="/root/.my.cnf" ping &>/dev/null
then
/usr/local/mysql/bin/mysqladmin --defaults-file="/root/.my.cnf" flush-logs
fi
endscript
}
ぼくの /root/.my.cnf
持ってる
-rw------- 1 root root 43 Mar 21 20:51 .my.cnf
[mysqladmin]
password= 111
user= root