EC2を対象にしたDBバックアップ自動化
投稿日:2026/02/02
本記事では、 EC2(Docker内MySQL)を対象にしたDBバックアップ自動化 を解説します。
全体像
処理の流れはとてもシンプルです。
cron(EC2)
↓
mysqldump(Docker内MySQL)
↓
.sql ファイルとして保存
↓
古いバックアップは自動削除
- cron:定期実行
- mysqldump:DBダンプ
- 保存先:EC2のEBS
① バックアップ保存先を作成(EC2)
まずは、バックアップを保存するディレクトリを作成します。
sudo mkdir -p /var/backups/mysql
sudo chown ec2-user:ec2-user /var/backups/mysql
ポイント
/var/backups/mysqlは EBS上に保存される- EBSスナップショットとも相性が良い
- EC2再起動・Docker再作成でも消えない
② バックアップ用スクリプトを作成
cronから実行するためのシェルスクリプトを作成します。
nano ~/mysql_backup.sh
📄 mysql_backup.sh
#!/bin/bash
# ===== 設定 =====
CONTAINER_NAME="app-db"
DB_NAME="app_db"
DB_USER="app_user"
DB_PASS="password"
BACKUP_DIR="/var/backups/mysql"
DATE=$(date +"%Y%m%d_%H%M")
# ===== バックアップ実行 =====
docker exec $CONTAINER_NAME \
mysqldump -u$DB_USER -p$DB_PASS \
--single-transaction \
--set-gtid-purged=OFF \
$DB_NAME > $BACKUP_DIR/${DB_NAME}_${DATE}.sql
# ===== 7日より古いバックアップを削除 =====
find $BACKUP_DIR -type f -mtime +7 -name "*.sql" -delete
オプション解説(重要)
--single-transaction→ InnoDB使用時に ロックせず安全にダンプ--set-gtid-purged=OFF→ GTID環境でのリストアトラブル防止
③ 実行権限を付与
chmod +x ~/mysql_backup.sh
④ 手動でテスト実行(超重要)
cronに登録する前に、必ず手動で動作確認 を行います。
./mysql_backup.sh
バックアップが作成されているか確認します。
ls -lh /var/backups/mysql
✔ .sql ファイルが作成されていれば成功です。
⑤ cronに登録して自動化
cronに登録して、定期的に実行されるようにします。
crontab -e
例:毎日 3:00 にバックアップを実行
0 3 * * * /home/ec2-user/mysql_backup.sh >> /var/log/mysql_backup.log 2>&1
- 標準出力・エラーはログに保存
- cron失敗時の調査が楽になります
⑥ cronが動いているか確認
登録内容を確認します。
crontab -l
ログを確認します。
tail -f /var/log/mysql_backup.log
⑦ リストア手順
障害時・検証環境作成時は、以下のコマンドで復元できます。
docker exec -i app-db \
mysql -u app_user -p app_db < app_db_20260201_0300.sql
🔐 セキュリティ強化
パスワードをコマンドから消す
nano ~/.my.cnf
[client]
user=app_user
password=password
chmod 600 ~/.my.cnf
メリット
- コマンド履歴にパスワードが残らない
- cron向き
-u -pオプション不要
📌 この構成の強みまとめ
| 項目 | 状態 |
|---|---|
| 自動バックアップ | ✅ |
| 世代管理 | ✅ |
| RDS不要 | ✅ |
| 月額コスト | ほぼ0円 |
| 復旧速度 | 速い |
まとめ
EC2 + Docker + MySQL という構成でも、
- cron
- mysqldump
- 世代管理
を組み合わせるだけで、DBバックアップ体制を構築できます。