今朝、気づいたらVPSでWordpressなサイト(このサイト)にアクセスすると、データベースエラーと出てアクセスできなくなってる事に気づいてびっくり。
慌ててターミナルからログインして確認をしたところ、どうも自動でアップグレードをしようとして失敗して起動できなくなってしまっていた様子。
以下確認した内容と復旧手順をメモしておくことにした。(が、再発時はこのページ見れないので別の方法で記録しておかないといけないな…)
MySQL 起動時のエラー
ERROR 1045 (28000): Access denied for user 'debian-sys-maint'@'localhost' (using password: YES)
debian-sys-maint ユーザーでの接続に失敗していました。
Debian/Ubuntu 系の MySQL/MariaDB では、このユーザーを使って systemctl start mysql
時に内部的なメンテナンス処理(テーブルアップグレードなど)を行います。/etc/mysql/debian.cnf
に書かれているパスワードと、MySQL 内部に登録されているパスワードが一致していないと、このエラーが出ます。
AppArmor が my.cnf.fallback のアクセスを拒否
apparmor="DENIED" operation="open" profile="/usr/sbin/mysqld" name="/etc/mysql/my.cnf.fallback"
こちらは致命的ではなさそうです。AppArmor によって一部のファイル読み込みが拒否されただけで、起動失敗の直接原因ではなさそうなのでひとまず放置。
mysql_upgrade が失敗
FATAL ERROR: Upgrade failed
debian-sys-maint でログインできず、テーブルのアップグレードに失敗しています。要はこれが原因。
原因と対応
原因
/etc/mysql/debian.cnf
に書かれている debian-sys-maint のパスワードと、MySQL 内の mysql.user テーブルのパスワードが食い違っている。
そのため、アップグレード処理に失敗し、MySQL サービスが正常に立ち上がらない。
対応
- MySQL をセーフモードで起動
sudo systemctl stop mysql
sudo mysqld_safe --skip-grant-tables &
- パスワード認証を無効化して起動します。
root でログイン
mysql -u root
- debian-sys-maint ユーザーのパスワードを確認または再設定
/etc/mysql/debian.cnf の内容を確認:
cat /etc/mysql/debian.cnf
- この中に以下のような設定があります:
[client]
user = debian-sys-maint
password = xxxx
- この password に合わせて MySQL 内のユーザーを更新します。
USE mysql;
ALTER USER 'debian-sys-maint'@'localhost' IDENTIFIED BY 'xxxx';
FLUSH PRIVILEGES;
exit;
- MySQL を再起動
sudo systemctl stop mysql
sudo systemctl start mysql
- テーブルのアップグレードを再実行
sudo mysql_upgrade
以上で、正常にupgradeが出来るようになり復旧しましたとさ。