MySQL のログローテーションでトラブってた話
debian 9.5 上で MySQL 5.5 っぽい MariaDB 10.1 についての話です。
MariaDB ですがファイル類が mysql 表記なので MySQL と書いていきます。
自宅にある Zabbix サーバーが動いていたマシンの HDD にトラブルがあり、新しい HDD に移行作業を行いました。/var/lib/mysql
をまるっとコピーするという移行なので若干のトラブルはありそうと思っていましたが…。
新サーバーセットアップ時のログローテーション用ユーザーと旧サーバーのログローテーション用ユーザーでパスワードが違うことが原因っぽいです。
でイケると思う。
順を追って原因を探ってみた
logrotate のエラーはこんな感じ
/etc/cron.daily/logrotate: mysqladmin: connect to server at 'localhost' failed error: 'Access denied for user 'root'@'localhost' (using password: NO)' error: error running shared postrotate script for '/var/log/mysql/mysql.log /var/log/mysql/mysql-slow.log /var/log/mysql/mariadb-slow.log /var/log/mysql/error.log ' run-parts: /etc/cron.daily/logrotate exited with return code 1
/etc/cron.daily/logrotate
を実行した時のログなのでファイルを見ると
#!/bin/sh test -x /usr/sbin/logrotate || exit 0 /usr/sbin/logrotate /etc/logrotate.conf
設定ファイルは /etc/logrotate.conf
なのでこっちも見る。
めぼしい設定がないので include してるディレクトリになんかありそう。
<snip> # packages drop log rotation information into this directory include /etc/logrotate.d <snip>
$ ls /etc/logrotate.d/ -1 apache2 apt dpkg exim4-base exim4-paniclog mysql-server rsyslog samba ufw unattended-upgrades zabbix-agent zabbix-server-mysql
/etc/logrotate.d/mysql-server
を開いて見ると
# - I put everything in one block and added sharedscripts, so that mysql gets # flush-logs'd only once. # Else the binary logs would automatically increase by n times every day. # - The error log is obsolete, messages go to syslog now. /var/log/mysql/mysql.log /var/log/mysql/mysql-slow.log /var/log/mysql/mariadb-slow.log /var/log/mysql/error.log { daily rotate 7 missingok create 640 mysql adm compress sharedscripts postrotate test -x /usr/bin/mysqladmin || exit 0 if [ -f `my_print_defaults --mysqld | grep -m 1 -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 }
mysqladmin
に /etc/mysql/debian.cnf
を読み込ませてるっぽい
/etc/mysql/debian.cnf
は root 所有で 600 なので sudo で見てみると
[client] host = localhost user = root password = socket = /var/run/mysqld/mysqld.sock [mysql_upgrade] host = localhost user = root password = socket = /var/run/mysqld/mysqld.sock basedir = /usr
別のマシンではここでユーザーに debian-sys-maint
が入っていてしっかりパスワードが設定されています。
MySQL にログローテーション用ユーザーを追加してこのファイルを書き換えてあげれば良さそう。
MySQL のコンソールに入ってユーザーの情報を確認します。
$ mysql -uroot -p MariaDB > SELECT Host, User FROM mysql.user; +-----------+------------------+ | Host | User | +-----------+------------------+ | % | zoar | | 127.0.0.1 | root | | ::1 | root | | localhost | debian-sys-maint | | localhost | root | | localhost | zabbix | +-----------+------------------+
debian-sys-maint
ユーザーはいるので旧 HDD から /etc/mysql/debian.cnf
を持ってくるかパスワードを再設定すればよさそうです。
旧 HDD は既に外してしまっているのでパスワードを再設定します。
MariaBD > SET PASSWORD FOR 'debian-sys-maint'@'localhost' = PASSWORD('%見せないよ%');
/etc/mysql/debian.cnf
にさっきのパスワードを入れておきます。
$ sudo vi /etc/mysql/debian.cnf # Automatically generated for Debian scripts. DO NOT TOUCH! [client] host = localhost user = debian-sys-maint password = %見せないよ% socket = /var/run/mysqld/mysqld.sock [mysql_upgrade] host = localhost user = debian-sys-maint password = %見せないよ% socket = /var/run/mysqld/mysqld.sock basedir = /usr
ローテーションを試してみます。
$ sudo logrotate -d /etc/logrotate.d/mysql-server
エラーは出てないっぽいのでコレでイケるんじゃないかな。