```pukiwiki
DockerコンテナでホストされているNeo4jデータベースのバックアップと復元について、実際の運用で学んだ知見をまとめました。インデックス破損からの復旧経験も踏まえ、確実で実用的な手順を紹介します。
Neo4jを運用していると、以下のような問題に遭遇することがあります:
これらの問題から迅速に復旧するため、適切なバックアップ戦略が不可欠です。
Neo4j公式のバックアップツールを使用する最も安全で確実な方法です。
# データベースの状態確認 docker exec <container_name> cypher-shell -u <username> -p <password> "SHOW DATABASES;" # バックアップディレクトリ作成 mkdir -p /path/to/backups # Neo4jサービス停止 docker stop <container_name> # neo4j-adminでバックアップ実行 DATE=$(date +%Y%m%d_%H%M%S) docker run --rm \ -v "/path/to/neo4j-data":/data \ -v "/path/to/backups":/backups \ neo4j:5.15-community \ neo4j-admin database dump neo4j --to-path=/backups --compress # バックアップファイルのリネーム cd /path/to/backups mv neo4j.dump neo4j_backup_$DATE.dump # Neo4jサービス再起動 docker start <container_name>
#!/bin/bash
# neo4j_backup_advanced.sh
# 設定
BACKUP_DIR="/path/to/backups"
CONTAINER_NAME="your-neo4j-container"
NEO4J_USER="your_username"
NEO4J_PASSWORD="your_password"
RETENTION_DAYS=7
LOG_FILE="/path/to/backup.log"
# ログ関数
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a $LOG_FILE
}
# エラーハンドリング
error_exit() {
log "ERROR: $1"
docker start $CONTAINER_NAME
exit 1
}
# バックアップディレクトリ作成
mkdir -p $BACKUP_DIR
# 日時とタイムスタンプ
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_NAME="neo4j_backup_$DATE.dump"
log "=== Neo4j バックアップ開始: $DATE ==="
# 1. データベース状態確認
log "データベース状態確認中..."
docker exec $CONTAINER_NAME cypher-shell -u $NEO4J_USER -p $NEO4J_PASSWORD \
"CALL db.ping() RETURN 'Database is responding' as status;" || error_exit "データベースが応答しません"
# 2. ディスク容量確認
AVAILABLE_SPACE=$(df $BACKUP_DIR | tail -1 | awk '{print $4}')
DATA_SIZE=$(du -s /path/to/neo4j-data | awk '{print $1}')
if [ $AVAILABLE_SPACE -lt $((DATA_SIZE * 2)) ]; then
error_exit "ディスク容量不足"
fi
# 3. Neo4jサービス停止
log "Neo4jサービス停止中..."
docker stop $CONTAINER_NAME || error_exit "Neo4jの停止に失敗"
# 4. バックアップ実行
log "バックアップ実行中: $BACKUP_NAME"
docker run --rm \
-v "/path/to/neo4j-data":/data \
-v "$BACKUP_DIR":/backups \
neo4j:5.15-community \
neo4j-admin database dump neo4j --to-path=/backups --compress || error_exit "バックアップ実行に失敗"
# 5. バックアップファイルのリネーム
cd $BACKUP_DIR
mv neo4j.dump $BACKUP_NAME || error_exit "ファイルのリネームに失敗"
# 6. バックアップファイルの整合性確認
if [ ! -f "$BACKUP_NAME" ] || [ ! -s "$BACKUP_NAME" ]; then
error_exit "バックアップファイルが正しく作成されていません"
fi
# 7. Neo4jサービス再起動
log "Neo4jサービス再起動中..."
docker start $CONTAINER_NAME || error_exit "Neo4jの再起動に失敗"
# 8. 起動確認(最大60秒待機)
log "起動確認中..."
for i in {1..12}; do
if docker exec $CONTAINER_NAME cypher-shell -u $NEO4J_USER -p $NEO4J_PASSWORD \
"RETURN 'OK' as status;" 2>/dev/null; then
log "Neo4jが正常に起動しました"
break
fi
if [ $i -eq 12 ]; then
error_exit "Neo4jの起動確認に失敗(60秒タイムアウト)"
fi
sleep 5
done
# 9. 古いバックアップを削除
log "古いバックアップファイルを削除中..."
find $BACKUP_DIR -name "neo4j_backup_*.dump" -type f -mtime +$RETENTION_DAYS -delete
# 10. バックアップ統計
BACKUP_SIZE=$(du -h $BACKUP_DIR/$BACKUP_NAME | cut -f1)
TOTAL_BACKUPS=$(ls -1 $BACKUP_DIR/neo4j_backup_*.dump 2>/dev/null | wc -l)
log "=== バックアップ完了 ==="
log "バックアップファイル: $BACKUP_DIR/$BACKUP_NAME"
log "バックアップサイズ: $BACKUP_SIZE"
log "保存されているバックアップ数: $TOTAL_BACKUPS"
開発環境での簡易バックアップ用:
#!/bin/bash # simple_backup.sh DATE=$(date +%Y%m%d_%H%M%S) docker stop <container_name> cp -r /path/to/neo4j-data /path/to/backup_simple_$DATE docker start <container_name> echo "簡易バックアップ完了: backup_simple_$DATE"
# バックアップ一覧表示 ls -lh /path/to/backups/neo4j_backup_*.dump # バックアップファイルの詳細確認 docker run --rm \ -v "/path/to/backups":/backups \ neo4j:5.15-community \ neo4j-admin database info neo4j --from-path=/backups/neo4j_backup_YYYYMMDD_HHMMSS.dump
# 1. Neo4jサービス停止 docker stop <container_name> # 2. 現在のデータをバックアップ(安全対策) DATE=$(date +%Y%m%d_%H%M%S) cp -r /path/to/neo4j-data /path/to/neo4j-data-before-restore-$DATE # 3. 既存データベースの削除 rm -rf /path/to/neo4j-data/databases/neo4j rm -rf /path/to/neo4j-data/transactions/neo4j # 4. バックアップから復元 docker run --rm \ -v "/path/to/neo4j-data":/data \ -v "/path/to/backups":/backups \ neo4j:5.15-community \ neo4j-admin database load neo4j --from-path=/backups/neo4j_backup_20250621_100000.dump --overwrite-destination=true # 5. データディレクトリの権限設定(重要) sudo chown -R $(id -u):$(id -g) /path/to/neo4j-data sudo chmod -R 755 /path/to/neo4j-data # 6. Neo4jサービス再起動 docker start <container_name>
# 1. データベース接続テスト
docker exec <container_name> cypher-shell -u <username> -p <password> \
"CALL db.ping() RETURN 'Restore successful' as status;"
# 2. データ整合性確認
docker exec <container_name> cypher-shell -u <username> -p <password> \
"CALL db.stats.retrieve('GRAPH COUNTS');"
# 3. インデックス状態確認
docker exec <container_name> cypher-shell -u <username> -p <password> \
"SHOW INDEXES;"
1. タスクスケジューラーを開く 2. 基本タスクの作成 3. 以下の設定を行う:
# crontabを編集 crontab -e # 毎日深夜2時にバックアップ実行 0 2 * * * /path/to/neo4j_backup_advanced.sh # 毎週日曜日深夜1時に古いバックアップクリーンアップ 0 1 * * 0 find /path/to/backups -name "neo4j_backup_*.dump" -mtime +30 -delete
1. 必ずサービスを停止 - トランザクションの整合性を保つため 2. ディスク容量の事前確認 - バックアップサイズは元データの1.5-2倍必要 3. 権限設定の徹底 - ファイル所有権とアクセス権限の適切な設定 4. バックアップ後の検証 - ファイルサイズと起動確認を必ず実施
1. 現在のデータを必ずバックアップ - 復元前の安全対策 2. 権限設定は復元の最重要ポイント - 特にLinux/Docker環境では必須 3. 復元後の整合性確認 - データベース接続とクエリ実行テスト 4. 段階的な検証 - 基本機能 → 高度な機能の順番で確認
# 権限確認 ls -la /path/to/neo4j-data/ # 権限修正 sudo chown -R $(id -u):$(id -g) /path/to/neo4j-data/ sudo chmod -R 755 /path/to/neo4j-data/
# 容量確認 df -h /path/to/backups/ # 不要なファイル削除 find /path/to/backups -name "*.dump" -mtime +30 -delete
# Neo4jサービス状態確認 docker ps -a | grep neo4j # ログ確認 docker logs <container_name> # 強制再起動 docker restart <container_name>
# データディレクトリの権限確認 ls -la /path/to/neo4j-data/ # ログの詳細確認 docker logs --details <container_name> # データベース整合性チェック docker run --rm \ -v "/path/to/neo4j-data":/data \ neo4j:5.15-community \ neo4j-admin database check neo4j --verbose
#!/bin/bash # emergency_restore.sh echo "=== 緊急復旧開始 ===" # 1. コンテナ強制停止・削除 docker stop <container_name> docker rm <container_name> # 2. データディレクトリクリーンアップ rm -rf /path/to/neo4j-data/databases/* rm -rf /path/to/neo4j-data/transactions/* # 3. 最新バックアップから復元 LATEST_BACKUP=$(ls -t /path/to/backups/neo4j_backup_*.dump | head -1) echo "最新バックアップ使用: $LATEST_BACKUP" # 4. バックアップからデータ復元 docker run --rm \ -v "/path/to/neo4j-data":/data \ -v "/path/to/backups":/backups \ neo4j:5.15-community \ neo4j-admin database load neo4j --from-path="$LATEST_BACKUP" --overwrite-destination=true # 5. 権限設定 sudo chown -R $(id -u):$(id -g) /path/to/neo4j-data # 6. コンテナ再作成・起動 docker run -d \ --name <container_name> \ -p 7474:7474 -p 7687:7687 \ -v "/path/to/neo4j-data":/data \ -e NEO4J_AUTH=username/password \ neo4j:5.15-community echo "=== 緊急復旧完了 ==="
Neo4jのバックアップ・復元は、適切な手順を踏めば確実に実行できます。特に重要なのは:
1. neo4j-adminコマンドの活用 - 公式ツールによる安全なバックアップ 2. 権限設定の徹底 - 復元時の最重要ポイント 3. 自動化の実装 - 人的ミスを防ぐための仕組み作り 4. 定期的な検証 - バックアップが実際に使用可能か確認
実際の運用では、インデックス破損などの予期しない問題も発生することがありますが、適切なバックアップがあれば迅速に復旧できます。
定期バックアップの仕組みを一度構築してしまえば、安心してNeo4jを運用できるでしょう。
更新日: 2025年6月21日 ```