Docker内のPostgreデータベースをバックアップするスクリプトと使用方法
本方案はPostgreSQLネイティブの`pg_dump`論理バックアップツールを活用し、ホストマシンのスクリプトおよびスケジュールタスクと連携させることで、データの定期スナップショット取得と安全な復元を実現します。
レンダリング中...
本方案は、PostgreSQLのネイティブな論理バックアップツールである `pg_dump` を、ホストマシンのスクリプトおよびスケジュールタスクと連携させ、データの定期的なスナップショット取得と安全な復元を実現します。
> 本記事の内容はLinux環境を前提としています。Windowsなどの他の環境では適宜変更してください。
## 1. スクリプトの準備
```bash
#!/bin/bash
# --- 設定 ---
CONTAINER_NAME="pgsql" # コンテナ名
DB_USER="postgres" # データベースユーザー名
DB_NAME="loden" # データベース名 (すべてのデータベースをバックアップする場合は "all" を使用)
BACKUP_DIR="/root/pgsql/backup" # ホストマシン上のバックアップパス
DATE=$(date +%Y%m%d_%H%M%S) # ファイル名の日付形式
RETENTION_DAYS=10 # バックファイルの保持日数
# --- ディレクトリの存在確認 ---
mkdir -p $BACKUP_DIR
# --- バックアップの実行 ---
# 原理:コンテナ内で pg_dump を実行し、標準出力(stdout)をホストマシンのファイルにリダイレクト
echo "コンテナ [$CONTAINER_NAME] のバックアップを実行中..."
if [ "$DB_NAME" == "all" ]; then
# すべてのデータベースをバックアップ
docker exec $CONTAINER_NAME pg_dumpall -c -U $DB_USER > "$BACKUP_DIR/full_backup_$DATE.sql"
else
# 単一データベースをバックアップ (カスタムフォーマット -Fc の使用を推奨: 圧縮され復元が高速)
docker exec $CONTAINER_NAME pg_dump -U $DB_USER -F c $DB_NAME > "$BACKUP_DIR/${DB_NAME}_${DATE}.dump"
fi
# バックアップファイルが生成されたか(かつサイズが0でないか)を確認
if [ -s "$BACKUP_DIR/${DB_NAME}_${DATE}.dump" ] || [ -s "$BACKUP_DIR/full_backup_$DATE.sql" ]; then
echo "バックアップが成功しました!"
else
echo "バックアップが失敗しました。コンテナの状態またはログを確認してください。"
# オプション: 失敗時にアラートメールを送信
exit 1
fi
# --- 古いバックアップのクリーンアップ ---
find $BACKUP_DIR -type f -mtime +$RETENTION_DAYS -name "*.dump" -delete
find $BACKUP_DIR -type f -mtime +$RETENTION_DAYS -name "*.sql" -delete
```
## 2. 環境設定
スクリプトを実行する前に、ホストマシンの環境が準備できていることを確認してください:
1. **バックアップディレクトリの作成**: バックアップファイルはDockerのマウントポイント以外の独立したパスに保存することを推奨します:
```Bash
mkdir -p /root/pgsql/backup
```
2. **スクリプトへの実行権限の付与**:
```Bash
chmod +x /root/pgsql/pg_backup.sh
```
3. **パスワードなし環境の設定 (重要)**: スクリプトが無人状態で自動実行されるように、パスワードプロンプトを回避する必要があります。ネイティブな方法は2つあります:
- **方法 A (推奨)**: `docker-compose.yml` の `environment` セクションに `PGPASSWORD: あなたのパスワード` を追加する。
- **方法 B**: スクリプトのバックアップ行に環境変数を追加する。例: `docker exec -e PGPASSWORD=... $CONTAINER_NAME pg_dump ...`。
## 3. 自動バックアップの有効化
Linuxの組み込みスケジュールタスク `crontab` を使用して、バックアップスクリプトを深夜などの負荷が低い時間帯に自動実行させます。例:
1. 次のコマンドを入力してエディタを開く:`crontab -e`
2. 次の設定行を追加する(毎日午前3:00にバックアップを実行):
```Bash
0 3 * * * /bin/bash /root/pgsql/pg_backup.sh >> /root/pgsql/backup.log 2>&1
```
*注: `>> ...log` の部分はバックアップログを保存し、バックアップが成功したかどうかを確認しやすくします。*
## 4. データの復元
データの誤削除(例: `TRUNCATE` や `DROP`)が発生した場合は、以下の手順に従って復元してください。
復元前にバックアップファイルの形式を確認してください。スクリプトが特定のデータベースをバックアップする場合(`-F c`)、ファイル名の拡張子は通常 `.dump` です。この種のファイルは `pg_restore` ツールを使用する必要があります。
復元コマンド:ホストマシンからバックアップを直接指定したデータベースに復元する
```Bash
docker exec -i pgsql pg_restore -U postgres -d loden_new --clean --if-exists < /root/pgsql/backup/loden_20260106_164814.dump
```
一般的な復元コマンドのパラメータ説明:
- `-d <db_name>`:ターゲットデータベースを指定(復元練習のためには、まずテストデータベース(例中の `loden_new` など)を作成することを推奨)。
- `--clean`:復元前に既存のデータオブジェクトをクリーンアップ(危険だが効果的)。
- `-j <n>`:復元タスクを並列実行。データベースが非常に大きい場合は、`-j 4` を使用して高速化できます。END
コメント
ログインしてコメントを閲覧・投稿してください
ログインへ