```pukiwiki

目次

Neo4j バックアップ・復元完全ガイド

DockerコンテナでホストされているNeo4jデータベースのバックアップと復元について、実際の運用で学んだ知見をまとめました。インデックス破損からの復旧経験も踏まえ、確実で実用的な手順を紹介します。

環境情報

バックアップが重要な理由

Neo4jを運用していると、以下のような問題に遭遇することがあります:

これらの問題から迅速に復旧するため、適切なバックアップ戦略が不可欠です。

バックアップ手順

方法1: neo4j-adminによるバックアップ(推奨)

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"

方法2: ファイルレベルバックアップ(簡易版)

開発環境での簡易バックアップ用:

#!/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"

復元手順

neo4j-adminによる復元(推奨)

* 利用可能なバックアップの確認

# バックアップ一覧表示
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;"

定期バックアップの設定

Windowsタスクスケジューラーでの自動化

1. タスクスケジューラーを開く 2. 基本タスクの作成 3. 以下の設定を行う:

Linux環境でのcron設定

# 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. 段階的な検証 - 基本機能 → 高度な機能の順番で確認

運用上の推奨事項

* バックアップ頻度

* 保存期間

トラブルシューティング

バックアップ関連の問題

* "Permission denied" エラー

# 権限確認
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/

* "Disk space insufficient" エラー

# 容量確認
df -h /path/to/backups/

# 不要なファイル削除
find /path/to/backups -name "*.dump" -mtime +30 -delete

* "Database not responding" エラー

# 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日 ```

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS