バックアップの重要性
データベースバックアップは、データ損失からの復旧に不可欠です。定期的なバックアップと、リストア手順のテストが重要です。
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"
関連記事
- データベースマイグレーション - スキーマ管理
- データモデリング - 設計手法
- CI/CDパイプライン - 自動化
まとめ
データベースバックアップは、自動化と定期的な検証が重要です。クラウドサービスの自動バックアップと、カスタムスクリプトを組み合わせて、堅牢なバックアップ体制を構築しましょう。
← 一覧に戻る