MySQL のログローテーションでトラブってた話

debian 9.5 上で MySQL 5.5 っぽい MariaDB 10.1 についての話です。
MariaDB ですがファイル類が mysql 表記なので MySQL と書いていきます。

自宅にある Zabbix サーバーが動いていたマシンの HDD にトラブルがあり、新しい HDD に移行作業を行いました。/var/lib/mysql をまるっとコピーするという移行なので若干のトラブルはありそうと思っていましたが…。

新サーバーセットアップ時のログローテーション用ユーザーと旧サーバーのログローテーション用ユーザーでパスワードが違うことが原因っぽいです。

  • MySQLdebian-sys-maint ユーザーの存在を確認
  • あればパスワードを再設定、なければユーザーを作成
  • /etc/mysql/debian.cnf の内容を編集

でイケると思う。

順を追って原因を探ってみた

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

エラーは出てないっぽいのでコレでイケるんじゃないかな。