概要
データベースの破損やハードウェア障害、人為的ミスに備えて、全てのデータを定期的にバックアップすることが重要である。
MongoDBでは、バックアップ方法として主に以下の2種類が存在する。
- 論理バックアップ
- mongodumpコマンドを使用して、データをBSON形式でエクスポートする方法である。
- 移植性が高く、異なるMongoDBバージョン間での復元や、特定のデータベース・コレクションのみの復元が可能である。
- 物理バックアップ
- ファイルシステムのスナップショットや、MongoDBのデータファイルを直接コピーする方法である。
- 大規模なデータセットでは高速だが、同一バージョンのMongoDBにのみ復元可能である。
mongodumpは、MongoDBの標準的な論理バックアップツールであり、MongoDB Database Toolsパッケージに含まれている。
mongodumpはBSON (Binary JSON) 形式でデータをエクスポートする。
BSON形式は、MongoDBの内部データ形式であり、ObjectId、Date、Binary等のMongoDBの固有データ型を正確に保持することができる。
mongodumpで作成したバックアップは、mongorestoreコマンドを使用して復元する。
mongorestoreは、mongodumpが作成したBSONファイルを読み込み、MongoDBインスタンスにデータを挿入する。
また、MongoDB Compassを使用してJSONまたはCSV形式でエクスポート・インポートすることも可能である。
ただし、CSV形式はMongoDBの固有データ型を保持できないため、完全なバックアップには適していない。
バックアップ
1つのデータベースをバックアップする。
mongodump --db <データベース名> --out <保存するディレクトリ> # ホスト名またはIPアドレスを指定する場合 mongodump --host <ホスト名またはIPアドレス> --port 27017 --db <データベース名> --out <保存するディレクトリ> # 認証が必要な場合 mongodump --host <ホスト名またはIPアドレス> --port 27017 --username <ユーザ名> --password <パスワード> --authenticationDatabase admin --db <データベース名> --out <保存するディレクトリ> # URI形式で接続する場合 mongodump --uri "mongodb://<ユーザ名>:<パスワード>@<ホスト名>:27017/<データベース名>" --out <保存するディレクトリ>
MongoDBに存在する全てのデータベースをバックアップする。
mongodump --out <保存するディレクトリ> # ホスト名またはIPアドレスを指定する場合 mongodump --host <ホスト名またはIPアドレス> --port 27017 --out <保存するディレクトリ> # 認証が必要な場合 mongodump --host <ホスト名またはIPアドレス> --port 27017 --username <ユーザ名> --password <パスワード> --authenticationDatabase admin --out <保存するディレクトリ> # gzip圧縮を使用する場合 mongodump --host <ホスト名またはIPアドレス> --port 27017 --username <ユーザ名> --password <パスワード> --authenticationDatabase admin --gzip --out <保存するディレクトリ> # アーカイブファイルとして出力する場合 mongodump --host <ホスト名またはIPアドレス> --port 27017 --username <ユーザ名> --password <パスワード> --authenticationDatabase admin --archive=<保存するファイル名>.archive --gzip
バックアップファイルの構造は以下の通りである。
dump/
├── database1/
│ ├── collection1.bson
│ ├── collection1.metadata.json
│ └── collection2.bson
└── database2/
└── collection1.bson
※注意
- レプリカセット環境では、セカンダリノードからバックアップを実行することを推奨する。
- プライマリノードへの負荷を軽減し、本番環境への影響を最小限にすることができる。
- 大規模なデータセットのバックアップでは、
--gzipオプションを使用してストレージ容量を節約することを推奨する。 - mongodumpは増分バックアップに対応していないため、毎回フルバックアップが作成される。
- 頻繁なバックアップが必要な場合は、MongoDB Ops ManagerやMongoDB Atlasの使用を検討すること。
- mongodumpはインデックス定義を
.metadata.jsonファイルに保存するが、インデックス自体はバックアップされない。- 復元時にmongorestoreがインデックスを再構築する。
復元
mongodumpを使用してダンプしたデータベースを、既存のMongoDBに復元する。
mongorestore <ダンプしたディレクトリ> # ホスト名またはIPアドレスを指定する場合 mongorestore --host <ホスト名またはIPアドレス> --port 27017 <ダンプしたディレクトリ> # 認証が必要な場合 mongorestore --host <ホスト名またはIPアドレス> --port 27017 --username <ユーザ名> --password <パスワード> --authenticationDatabase admin <ダンプしたディレクトリ> # 既存データを削除してから復元する場合 (--dropオプション) mongorestore --host <ホスト名またはIPアドレス> --port 27017 --username <ユーザ名> --password <パスワード> --authenticationDatabase admin --drop <ダンプしたディレクトリ>
特定のデータベースのみを復元する。
mongorestore --db <データベース名> <ダンプしたディレクトリ>/<データベース名> # 既存データを削除してから復元する場合 mongorestore --db <データベース名> --drop <ダンプしたディレクトリ>/<データベース名>
gzip圧縮されたアーカイブファイルから復元する。
mongorestore --gzip --archive=<アーカイブファイル名>.archive
※注意
- mongorestoreはINSERT操作のみを使用するため、同一の
_idフィールドを持つドキュメントが既に存在する場合は重複キーエラーが発生する。- 既存データを置き換える場合は、
--dropオプションを使用すること。
- 既存データを置き換える場合は、
- 復元先のディスク容量が十分であることを確認すること。(バックアップサイズの1.5倍以上を推奨)
- 本番環境への復元前に、テスト環境で復元を検証することを強く推奨する。
- mongodumpコマンド と mongorestoreコマンドは、対応するバージョンを使用すること。
- 異なるバージョン間での復元は、互換性の問題が発生する可能性がある。
MongoDB Compassを使用したバックアップと復元
MongoDB Compassを使用している場合、MongoDBのデータベースのバックアップと復元は簡単にできる。
バックアップにはエクスポート機能、復元にはインポート機能を使用する。
バックアップ
- MongoDB Compassを起動して、対象のMongoDBインスタンスに接続する。
- 画面左のナビゲーションペインから、エクスポートするデータベースとコレクションを選択する。
- 画面上部のツールバーから、[Collection] - [Export Collection]を選択する。
- エクスポートするドキュメントを選択する。
全てのドキュメントをエクスポートする場合は[Export Full Collection]、フィルタを適用する場合は[Export query results]を選択する。 - 出力フォーマットを選択する。(JSON または CSV)
- [Export]ボタンを押下して、保存先を指定する。
復元する前に
バックアップを復元する前に、古いデータを消去しておくことが重要である。
古いデータが存在する場合、同一の_idを持つドキュメントは重複キーエラーになる。
mongorestoreコマンドの--dropオプションを使用すると、自動的に既存データを削除してから復元することができる。
MongoDB Compassでインポートする場合は、必要に応じて、既存のコレクションを削除してから新規コレクションを作成してインポートすることを推奨する。
復元
MongoDB Compassでは、データベースの復元には、Import Data機能を使用する。
- MongoDB Compassを起動して、対象のMongoDBインスタンスに接続する。
- 画面左のナビゲーションペインから、インポート先のデータベースとコレクションを選択する。
新規コレクションの場合は、データベースを右クリックして[Create Collection]を選択して作成する。 - 画面上部のツールバーから、[Collection] - [Import Data]を選択する。
- インポートするファイルを選択する。(JSON または CSV)
- CSVファイルの場合は、フィールドのデータ型を確認して、必要に応じて設定を変更する。
- [Import]ボタンを押下する。
主要なオプション
mongodumpコマンド および mongorestoreコマンド で使用できる主要なオプションを以下に示す。
接続オプション
| オプション | 説明 |
|---|---|
--host |
接続先のホスト名またはIPアドレスを指定する。 デフォルト: localhost |
--port |
接続先のポート番号を指定する。 デフォルト: 27017 |
--uri |
MongoDB接続URIを指定する。 例: mongodb://<ユーザ名>:<パスワード>@<ホスト名 または IPアドレス>:27017/db |
認証オプション
| オプション | 説明 |
|---|---|
--username |
認証に使用するユーザ名を指定する。 |
--password |
認証に使用するパスワードを指定する。 |
--authenticationDatabase |
認証に使用するデータベースを指定する。 デフォルト: admin |
mongodump固有のオプション
| オプション | 説明 |
|---|---|
--db |
バックアップするデータベースを指定する。 省略すると全データベースをバックアップする。 |
--collection |
バックアップするコレクションを指定する。 |
--out |
出力先ディレクトリを指定する。 デフォルト: ./dump |
--archive |
出力をアーカイブファイルとして保存する。 |
--gzip |
出力をgzip圧縮する。 |
--oplog |
バックアップ中のオペログを含める。 (ポイントインタイムリカバリに使用) |
--query |
指定したクエリに一致するドキュメントのみをバックアップする。 |
mongorestore固有のオプション
| オプション | 説明 |
|---|---|
--db |
復元先のデータベースを指定する。 |
--collection |
復元先のコレクションを指定する。 |
--drop |
復元前に既存のコレクションを削除する。 |
--gzip |
gzip圧縮されたファイルから復元する。 |
--archive |
アーカイブファイルから復元する。 |
--oplogReplay |
オペログを再生する。 (ポイントインタイムリカバリに使用) |
--nsInclude |
復元するネームスペースを指定する。 例: mydb.* |
--nsExclude |
復元から除外するネームスペースを指定する。 |
トラブルシューティング
mongodumpが失敗する
- 認証エラーが発生する場合
--username、--password、--authenticationDatabaseオプションが正しく指定されているかどうかを確認する。- 認証データベース名は、一般的には admin である。
- 接続がタイムアウトする場合
--hostと--portが正しいかどうかを確認する。- ファイアウォールやセキュリティグループで27017番ポートが開放されているか確認する。
- ディスク容量不足のエラーが発生する場合
- 出力先ディレクトリのディスク容量を確認する。
--gzipオプションを使用して圧縮することを検討する。
mongorestoreが失敗する
- 重複キーエラー (duplicate key error) が発生する場合
- 同一の
_idを持つドキュメントが既に存在している。 --dropオプションを使用して、既存のコレクションを削除してから復元する。
- 同一の
- 認証エラーが発生する場合
- 復元先のMongoDBインスタンスに対する認証情報が正しいか確認する。
- 復元に必要な権限 (readWrite または restore ロール) が付与されているか確認する。
- BSONファイルが見つからないエラーが発生する場合
- バックアップディレクトリのパスが正しいか確認する。
- ディレクトリ構造が dump/データベース名/コレクション名.bson になっているか確認する。
MongoDB Compassでインポートが失敗する
- JSONファイルのパースエラーが発生する場合
- JSONファイルの形式が正しいか確認する。
- MongoDB Compassは、1行に1つのJSONドキュメントを記述するJSONL形式、または配列形式のJSONに対応している。
- CSVファイルのインポートでデータ型が正しくない場合
- インポート時のフィールド設定画面で、各フィールドのデータ型を手動で指定する。
- 数値型、日付型、ブール型等を適切に設定すること。
- ファイルサイズが大きすぎてインポートできない場合
- 大規模なデータのインポートには、
mongoimportコマンドの使用を推奨する。
- 大規模なデータのインポートには、