データベースバックアップ実践ガイド

中級 | 25分 で読める | 2025.01.10

バックアップの重要性

データベースバックアップは、データ損失からの復旧に不可欠です。定期的なバックアップと、リストア手順のテストが重要です。

PostgreSQL

pg_dump(論理バックアップ)

# 単一データベースのバックアップ
pg_dump -h localhost -U postgres -d mydb > backup.sql

# カスタムフォーマット(圧縮、並列リストア対応)
pg_dump -h localhost -U postgres -d mydb -Fc > backup.dump

# テーブル単位
pg_dump -h localhost -U postgres -d mydb -t users > users.sql

# データのみ
pg_dump -h localhost -U postgres -d mydb --data-only > data.sql

# スキーマのみ
pg_dump -h localhost -U postgres -d mydb --schema-only > schema.sql

pg_dumpall(全データベース)

# 全データベースとロールをバックアップ
pg_dumpall -h localhost -U postgres > all_databases.sql

# ロールのみ
pg_dumpall -h localhost -U postgres --roles-only > roles.sql

リストア

# SQLファイルからリストア
psql -h localhost -U postgres -d mydb < backup.sql

# カスタムフォーマットからリストア
pg_restore -h localhost -U postgres -d mydb backup.dump

# 並列リストア(高速化)
pg_restore -h localhost -U postgres -d mydb -j 4 backup.dump

# データベース作成込み
createdb -h localhost -U postgres newdb
pg_restore -h localhost -U postgres -d newdb backup.dump

自動バックアップスクリプト

#!/bin/bash
# postgres-backup.sh

DB_HOST="localhost"
DB_USER="postgres"
DB_NAME="mydb"
BACKUP_DIR="/var/backups/postgres"
DATE=$(date +%Y%m%d_%H%M%S)
RETENTION_DAYS=7

# バックアップ実行
pg_dump -h $DB_HOST -U $DB_USER -d $DB_NAME -Fc > "$BACKUP_DIR/${DB_NAME}_${DATE}.dump"

# 圧縮
gzip "$BACKUP_DIR/${DB_NAME}_${DATE}.dump"

# 古いバックアップを削除
find $BACKUP_DIR -name "*.dump.gz" -mtime +$RETENTION_DAYS -delete

# S3にアップロード(オプション)
aws s3 cp "$BACKUP_DIR/${DB_NAME}_${DATE}.dump.gz" s3://my-backups/postgres/

echo "Backup completed: ${DB_NAME}_${DATE}.dump.gz"

MySQL / MariaDB

mysqldump

# 単一データベース
mysqldump -h localhost -u root -p mydb > backup.sql

# 全データベース
mysqldump -h localhost -u root -p --all-databases > all_databases.sql

# 圧縮しながらバックアップ
mysqldump -h localhost -u root -p mydb | gzip > backup.sql.gz

# テーブル指定
mysqldump -h localhost -u root -p mydb users orders > tables.sql

# ストアドプロシージャ込み
mysqldump -h localhost -u root -p mydb --routines --triggers > backup_with_routines.sql

リストア

# SQLファイルからリストア
mysql -h localhost -u root -p mydb < backup.sql

# 圧縮ファイルからリストア
gunzip < backup.sql.gz | mysql -h localhost -u root -p mydb

# データベース作成込み
mysql -h localhost -u root -p -e "CREATE DATABASE newdb"
mysql -h localhost -u root -p newdb < backup.sql

自動バックアップスクリプト

#!/bin/bash
# mysql-backup.sh

DB_HOST="localhost"
DB_USER="root"
DB_PASS="password"
DB_NAME="mydb"
BACKUP_DIR="/var/backups/mysql"
DATE=$(date +%Y%m%d_%H%M%S)
RETENTION_DAYS=7

# バックアップ実行
mysqldump -h $DB_HOST -u $DB_USER -p$DB_PASS $DB_NAME | gzip > "$BACKUP_DIR/${DB_NAME}_${DATE}.sql.gz"

# 古いバックアップを削除
find $BACKUP_DIR -name "*.sql.gz" -mtime +$RETENTION_DAYS -delete

echo "Backup completed: ${DB_NAME}_${DATE}.sql.gz"

MongoDB

mongodump

# 全データベース
mongodump --host localhost --port 27017 --out /backup

# 単一データベース
mongodump --host localhost --db mydb --out /backup

# 認証あり
mongodump --host localhost --authenticationDatabase admin \
  -u admin -p password --db mydb --out /backup

# 圧縮
mongodump --host localhost --db mydb --archive=backup.archive --gzip

# コレクション指定
mongodump --host localhost --db mydb --collection users --out /backup

リストア

# ディレクトリからリストア
mongorestore --host localhost --db mydb /backup/mydb

# アーカイブからリストア
mongorestore --host localhost --archive=backup.archive --gzip

# ドロップしてリストア
mongorestore --host localhost --db mydb --drop /backup/mydb

自動バックアップスクリプト

#!/bin/bash
# mongo-backup.sh

MONGO_HOST="localhost"
MONGO_PORT="27017"
DB_NAME="mydb"
BACKUP_DIR="/var/backups/mongodb"
DATE=$(date +%Y%m%d_%H%M%S)
RETENTION_DAYS=7

# バックアップ実行
mongodump --host $MONGO_HOST --port $MONGO_PORT \
  --db $DB_NAME \
  --archive="$BACKUP_DIR/${DB_NAME}_${DATE}.archive" \
  --gzip

# 古いバックアップを削除
find $BACKUP_DIR -name "*.archive" -mtime +$RETENTION_DAYS -delete

echo "Backup completed: ${DB_NAME}_${DATE}.archive"

cronでの自動実行

# crontab -e

# 毎日午前3時にバックアップ
0 3 * * * /usr/local/bin/postgres-backup.sh >> /var/log/backup.log 2>&1

# 毎週日曜日にフルバックアップ
0 2 * * 0 /usr/local/bin/full-backup.sh >> /var/log/backup.log 2>&1

# 6時間ごとにバックアップ
0 */6 * * * /usr/local/bin/incremental-backup.sh >> /var/log/backup.log 2>&1

クラウドサービスでのバックアップ

AWS RDS

# 手動スナップショット作成
aws rds create-db-snapshot \
  --db-instance-identifier mydb \
  --db-snapshot-identifier mydb-snapshot-$(date +%Y%m%d)

# 自動バックアップは設定で有効化
# バックアップ保持期間: 1-35日

Google Cloud SQL

# オンデマンドバックアップ
gcloud sql backups create \
  --instance=mydb \
  --description="Manual backup $(date +%Y%m%d)"

# バックアップ一覧
gcloud sql backups list --instance=mydb

バックアップの検証

#!/bin/bash
# verify-backup.sh

# テスト用データベースにリストア
createdb -h localhost -U postgres testdb
pg_restore -h localhost -U postgres -d testdb backup.dump

# データ検証
psql -h localhost -U postgres -d testdb -c "SELECT COUNT(*) FROM users"

# テスト用データベース削除
dropdb -h localhost -U postgres testdb

echo "Backup verification completed"

関連記事

まとめ

データベースバックアップは、自動化と定期的な検証が重要です。クラウドサービスの自動バックアップと、カスタムスクリプトを組み合わせて、堅牢なバックアップ体制を構築しましょう。

← 一覧に戻る