Tech Starlog

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/mysqlEBS上に保存される
  • 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バックアップ体制を構築できます。