
EC2で運用するMySQLのデータが消えた!スナップショットからの復元と作成方法
EC2上でMySQLを運用している場合、トラブルによるデータ消失は避けたいですが、ゼロリスクにはできません。特にEBS(Elastic Block Store)にデータを保存し、日次スナップショットを作成している環境では、スナップショットを活用することで迅速に復旧が可能です。今回は、スナップショットの作成方法と、40日目にデータを失った場合の復元手順をまとめていきます
毎日のスナップショット運用をしている前提での復元シナリオ
次の条件を想定しています:
毎日12時にEBSボリュームのスナップショットを作成している。
MySQLのデータディレクトリや設定ファイルがEBSに保存されている。
データ消失は40日目に発生し、直近のスナップショットを用いて復旧する。
手順①:スナップショットを作成する
スナップショットを定期的に作成することで、データ消失時にも対応できます。手動で作成する場合と、AWSのスケジュールを利用する場合がありますが、ここでは手動の作成方法を紹介します。
AWS CLIでスナップショットを作成するコマンド
aws ec2 create-snapshot \
--volume-id vol-xxxxxxxxxxxxxxx \
--description "MySQL daily backup"
--volume-id:バックアップ対象のEBSボリュームIDを指定します。
--description:スナップショットの説明を付けて管理しやすくします。
これをスクリプト化し、例えばcronで毎日実行するよう設定すれば、自動化が可能です。
定期実行の例(cron)
次のようにcronを設定することで、毎日12時にスナップショットを作成できます。
0 12 * * * aws ec2 create-snapshot --volume-id vol-xxxxxxxxxxxxxxx --description "MySQL daily backup"
手順②:スナップショットからMySQLのデータを復元する
データ消失が発生した場合、スナップショットを利用して迅速に復旧できます。次の手順で進めましょう。
1. 該当するスナップショットを探す
データ消失直前のスナップショットを特定します。例えば39日目または40日目の12時に取得したスナップショットが該当します。
AWS CLIでスナップショットをリストアップする例
aws ec2 describe-snapshots --filters Name=tag:Name,Values=my-daily-backup
このコマンドで出力されるスナップショット一覧から、最も新しいスナップショットID(例: snap-0987654321)を確認します。
2. スナップショットから新しいEBSボリュームを作成
該当するスナップショットを元に、新しいEBSボリュームを作成します。
AWS CLIでのコマンド例
aws ec2 create-volume \
--snapshot-id snap-0987654321 \
--availability-zone us-east-1a
これで新しいボリュームが作成されます。
3. 作成したボリュームをEC2にアタッチ
次に、新しいボリュームをEC2インスタンスにアタッチします。
AWS CLIでのコマンド例
aws ec2 attach-volume \
--volume-id vol-xxxxxxxxxxxxxxx \
--instance-id i-xxxxxxxxxxxxxxx \
--device /dev/xvdf
アタッチ後、EC2側でこのボリュームが認識されているか確認します。
lsblk
4. ボリュームをマウントしてデータを確認
新しいEBSボリュームをマウントし、データを確認します。
マウントの手順
ボリュームをマウントするためのディレクトリを作成します。 sudo mkdir /mnt/recovery sudo mount /dev/xvdf /mnt/recovery
マウントしたディレクトリ内で、MySQLのデータディレクトリを確認します。 ls /mnt/recovery 必要なファイル(MySQLのデータファイル、設定ファイル)が存在することを確認してください。
5. MySQLのデータを元の場所に復元
次に、MySQLのデータディレクトリを復元します。
手順
MySQLサービスを停止します。 sudo systemctl stop mysql
スナップショットから復元したデータをMySQLのデータディレクトリへコピーします。 sudo rsync -av /mnt/recovery/mysql-data-dir/ /var/lib/mysql/
MySQLのサービスを再起動します。 sudo systemctl start mysql
6. MySQLにログインしてデータを確認
復元後、MySQLにログインしてデータが正常に戻っているかを確認しましょう。
mysql -u root -p
SHOW DATABASES;
復元後の注意点
1. データの損失期間を理解する
スナップショットは毎日12時時点の状態を反映しているため、最後のスナップショット以降の変更は復元できません。例えば、40日目の12時以降に更新されたデータは失われている可能性が高いです。
2. スナップショットの管理
スナップショットを長期間保管するとストレージコストが増えるため、保存期間や削除ポリシーを適切に設定してください。
3. 論理バックアップの併用
スナップショットはディスク全体の物理バックアップです。MySQL独自のバックアップツール(mysqldumpやxtrabackupなど)を併用することで、より柔軟な復元が可能になります。
まとめ
スナップショットを定期的に作成しておくことで、万が一のデータ消失時にも迅速に対応できます。以下のように手動またはスクリプトでスナップショットを作成することが習慣になれば安心です。
スナップショット作成のコマンド例
aws ec2 create-snapshot \
--volume-id vol-xxxxxxxxxxxxxxx \
--description "MySQL daily backup"
復元時も、スナップショットを利用すれば次のようなコマンドで簡単にデータを戻せます。
aws ec2 create-volume --snapshot-id snap-0987654321 --availability-zone us-east-1a
定期的なスナップショット作成と管理は、データの安全性を確保するための大切な習慣です。この記事を参考に、日頃から備えを万全にしておきましょう!