LightSail で MariaDB がクラッシュ!

はじめに

猫とキャンプと野球観戦と AWS が大好きな旦那、LeoSaki です。モフモフしたい。

タイトル通り、LightSail で利用している MariaDB がクラッシュしてしまいました。

原因は不明。

ある日突然CPUが急上昇してアラームが発生。

トップページに表示されていたのは。

Error establishing a database connection

この当時、どうにも時間がなくて、読み取り専用でMariaDBを立ち上げやり過ごしていました。

ようやく時間が作れたので、復旧を試みた際のメモを残します。

何が起こったか

https://example.com/wp-login.php にアクセス → ログイン不可

ssh でサーバーへ入り tail -n 20 /opt/bitnami/apache2/logs/error_log

WordPress database error Table 'wp_options' is read only

テーブルが読み取り専用」が大量に出力。

原因の切り分け

チェック項目コマンド結果
ディスク空きdf -h十分な空き → OK
サービス状態/opt/bitnami/ctlscript.sh statusmariadb not running
MariaDBログtail -n 40 /opt/bitnami/mariadb/logs/mysqld.log起動直後に core dump

要は InnoDB が破損し、MariaDB が即死している状態でした。

緊急モード(innodb_force_recovery)でDBを起動→バックアップ取得

my.cnf に追記

sudo vi /opt/bitnami/mariadb/conf/my.cnf

[mysqld]
innodb_force_recovery = 6   # 1 〜 6 を順に試し、最終的に 6 で起動

起動成功を確認

sudo /opt/bitnami/ctlscript.sh restart mariadb

読み取り専用でも dump は取れる!

mysqldump -u root -p --all-databases > ~/all_db_backup.sql

※パスワードが不明な場合は以下。

cat /home/bitnami/bitnami_application_password

念のため wp-content も固める

tar czvf ~/wp-content.tar.gz /opt/bitnami/wordpress/wp-content

“きれいな” MariaDB を作り直し → リストア

既存データディレクトリを対比し、mysql_install_db で初期化

# 停止と退避
sudo /opt/bitnami/ctlscript.sh stop mariadb
sudo mv /opt/bitnami/mariadb/data /opt/bitnami/mariadb/data_bak
sudo mkdir /opt/bitnami/mariadb/data
sudo chown mysql:mysql /opt/bitnami/mariadb/data

# 新規初期化
sudo /opt/bitnami/mariadb/bin/mysql_install_db \
  --defaults-file=/opt/bitnami/mariadb/conf/my.cnf \
  --basedir=/opt/bitnami/mariadb \
  --datadir=/opt/bitnami/mariadb/data

# 起動
sudo /opt/bitnami/ctlscript.sh start mariadb

※ここで innodb_force_recovery を 0 に戻すことを忘れずに。

リストア

mysql -u root -p < ~/all_db_backup.sql

しかし、状況変わらず・・・。

MariaDBバイナリ自体の破損の可能性がありそう。

新インスタンス移行

LightSailでWordPressの新規インスタンスを作成。

旧サーバーから新サーバーへのデータ移行

秘密鍵ファイル(.pem)を、旧サーバーに配置(~/.ssh/XXXX.pem)

※秘密鍵ファイルはLightSailのコンパネから取得可能です

秘密鍵ファイルのパーミッションを変更

chmod 400 ~/.ssh/XXXX.pem

qcpコマンドでデータ移行

scp -i ~/.ssh/XXXX.pem ~/wp-content-backup.tar.gz bitnami@新IP:/home/bitnami/
scp -i ~/.ssh/XXXX.pem ~/all_db_backup.sql bitnami@新IP:/home/bitnami/

新サーバーでデータ復元

wp-content復元

cd /opt/bitnami/wordpress
sudo mv wp-content wp-content-original    # 念のため元のwp-contentを退避
sudo tar xzvf ~/wp-content-backup.tar.gz
sudo chown -R bitnami:daemon wp-content

    データベースリストア

    新サーバーのDB管理用パスワード確認

    cat /home/bitnami/bitnami_application_password

    all_db_backup.sqlをリストア

    mysql -u root -p < ~/all_db_backup.sql

    ※パスワードは↑で表示されたもの

    なぜか、wp-content内uploadsディレクトリごと移行できていなかった

    旧サーバーから新サーバーへ

    scp -i ~/.ssh/XXXX.pem -r /opt/bitnami/wordpress/wp-content/uploads bitnami@新IP:/home/bitnami/

    新サーバーで展開

    sudo mv /home/bitnami/uploads /opt/bitnami/wordpress/wp-content/
    sudo chown -R bitnami:daemon /opt/bitnami/wordpress/wp-content/uploads

    とりあえず、復活!

    ネットワーク関連とか、SSLの表示崩れ関連とか、幾つか問題は残っていますが・・・。

    まとめ

    症状Table 'wp_options' is read only → MariaDB コアダンプ

    応急処置innodb_force_recovery=6 で起動し dump を確保

    恒久対策:クリーンな DB へ リストア or 新インスタンス移行

    おわりに

    マネージドサービスであるLightSailを過信して、あまり対策を講じていなかった、とか言っても、こんなこと滅多に起こることではないでしょう。複数のレンタルサーバーでの運用に携わってきましたが、初めてです。

    個人のWordPressの話ですが、ちゃんと監視してて良かった!

    本記事がどなかたのお役に立てれば幸いです。

    LightsailAWS,Lightsail

    Posted by LeoSaki