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 status | mariadb 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の話ですが、ちゃんと監視してて良かった!
本記事がどなかたのお役に立てれば幸いです。
ディスカッション
コメント一覧
まだ、コメントがありません