MongoDBサーバの基本的なバックアップ操作とリストア操作をまとめます。なお、このページは基本的な操作にとどめ、バックアップ時に考慮が必要な静止点問題やシャーディング構成のバランシングなどは考慮対象外とします。
前提
公式ドキュメント
参考になる公式ドキュメントを以下に示します。
動作確認済環境
- Rocky Linux 8.6
- MongoDB Server 6.0.2
mongosh test << EOF
db.inventory.insertMany( [
{ item: "canvas", qty: 100, size: { h: 28, w: 35.5, uom: "cm" }, status: "A" },
{ item: "journal", qty: 25, size: { h: 14, w: 21, uom: "cm" }, status: "A" },
{ item: "mat", qty: 85, size: { h: 27.9, w: 35.5, uom: "cm" }, status: "A" },
{ item: "mousepad", qty: 25, size: { h: 19, w: 22.85, uom: "cm" }, status: "P" },
{ item: "notebook", qty: 50, size: { h: 8.5, w: 11, uom: "in" }, status: "P" },
{ item: "paper", qty: 100, size: { h: 8.5, w: 11, uom: "in" }, status: "D" },
{ item: "planner", qty: 75, size: { h: 22.85, w: 30, uom: "cm" }, status: "D" },
{ item: "postcard", qty: 45, size: { h: 10, w: 15.25, uom: "cm" }, status: "A" },
{ item: "sketchbook", qty: 80, size: { h: 14, w: 21, uom: "cm" }, status: "A" },
{ item: "sketch pad", qty: 95, size: { h: 22.85, w: 30.5, uom: "cm" }, status: "A" }
] );
EOF
バックアップ操作
mongodump
論理的なバックアップを取得するにはmongodumpコマンドを実行します。mongodumpコマンドに指定可能なオプションは以下の通りです。
| オプション | 意味 |
|---|---|
| –host | バックアップ対象となるMongoDBサーバのIPアドレス |
| –port | バックアップ対象となるMongoDBサーバのポート番号 |
| –username | MongoDB接続時のユーザ名 |
| –password | MongoDB接続時のパスワード |
| –db | バックアップ対象のデータベース(省略時は全データベースがバックアップ対象) |
| –collection | バックアップ対象のコレクション(省略時は全データベースがコレクション対象) |
| –query | クエリによりバックアップ対象を絞り込む事ができる |
| –out | バックアップ出力先のディレクトリ(省略時はdumpディレクトリ) |
| –archive | 圧縮した状態でバックアップを取得する。ただし、tar.gzやzipのような一般的な圧縮形式ではない事に注意 |
| –numParallelCollections | 指定した並列数でバックアップを取得する |
オプションの指定例は以下のようになります。
mongodump \ --host=127.0.0.1 \ --port=27017 \ --out=dump 操作例は以下の通りです。確かに、BSON形式のファイルがバックアップされている事が分かります。 [root@linux010 ~]# mongodump \ > --host=127.0.0.1 \ > --port=27017 \ > --out=dump 2022-10-28T18:38:08.766+0900 writing admin.system.version to dump/admin/system.version.bson 2022-10-28T18:38:08.768+0900 done dumping admin.system.version (1 document) 2022-10-28T18:38:08.769+0900 writing test.inventory to dump/test/inventory.bson 2022-10-28T18:38:08.770+0900 done dumping test.inventory (10 documents) [root@linux010 ~]# ls -l dump/ 合計 0 drwxr-xr-x 2 root root 69 10月 28 18:38 admin drwxr-xr-x 2 root root 59 10月 28 18:38 test [root@linux010 ~]# ls -l dump/test/ 合計 8 -rw-r--r-- 1 root root 1042 10月 28 18:38 inventory.bson -rw-r--r-- 1 root root 176 10月 28 18:38 inventory.metadata.json [root@linux010 ~]#
もし、BSONの中身が想定通りかを確認したい方は、bsondumpコマンドを使用します。bsondumpはbson形式をjson形式に変換できます。
[root@linux010 ~]# bsondump dump/test/inventory.bson
{"_id":{"$oid":"635ba14e6fdf4d3060540f21"},"item":"canvas","qty":{"$numberInt":"100"},"size":{"h":{"$numberInt":"28"},"w":{"$numberDouble":"35.5"},"uom":"cm"},"status":"A"}
{"_id":{"$oid":"635ba14e6fdf4d3060540f22"},"item":"journal","qty":{"$numberInt":"25"},"size":{"h":{"$numberInt":"14"},"w":{"$numberInt":"21"},"uom":"cm"},"status":"A"}
{"_id":{"$oid":"635ba14e6fdf4d3060540f23"},"item":"mat","qty":{"$numberInt":"85"},"size":{"h":{"$numberDouble":"27.9"},"w":{"$numberDouble":"35.5"},"uom":"cm"},"status":"A"}
{"_id":{"$oid":"635ba14e6fdf4d3060540f24"},"item":"mousepad","qty":{"$numberInt":"25"},"size":{"h":{"$numberInt":"19"},"w":{"$numberDouble":"22.85"},"uom":"cm"},"status":"P"}
{"_id":{"$oid":"635ba14e6fdf4d3060540f25"},"item":"notebook","qty":{"$numberInt":"50"},"size":{"h":{"$numberDouble":"8.5"},"w":{"$numberInt":"11"},"uom":"in"},"status":"P"}
{"_id":{"$oid":"635ba14e6fdf4d3060540f26"},"item":"paper","qty":{"$numberInt":"100"},"size":{"h":{"$numberDouble":"8.5"},"w":{"$numberInt":"11"},"uom":"in"},"status":"D"}
{"_id":{"$oid":"635ba14e6fdf4d3060540f27"},"item":"planner","qty":{"$numberInt":"75"},"size":{"h":{"$numberDouble":"22.85"},"w":{"$numberInt":"30"},"uom":"cm"},"status":"D"}
{"_id":{"$oid":"635ba14e6fdf4d3060540f28"},"item":"postcard","qty":{"$numberInt":"45"},"size":{"h":{"$numberInt":"10"},"w":{"$numberDouble":"15.25"},"uom":"cm"},"status":"A"}
{"_id":{"$oid":"635ba14e6fdf4d3060540f29"},"item":"sketchbook","qty":{"$numberInt":"80"},"size":{"h":{"$numberInt":"14"},"w":{"$numberInt":"21"},"uom":"cm"},"status":"A"}
{"_id":{"$oid":"635ba14e6fdf4d3060540f2a"},"item":"sketch pad","qty":{"$numberInt":"95"},"size":{"h":{"$numberDouble":"22.85"},"w":{"$numberDouble":"30.5"},"uom":"cm"},"status":"A"}
2022-10-28T18:38:42.430+0900 10 objects found
[root@linux010 ~]#
ここまでの操作が完了したら、後は適当にアーカイブして、バックアップ保管先へ転送しましょう。
tar cvzf backup_from_dump.tar.gz dump/* rsync -av backup_from_dump.tar.gz <ユーザ名>@<バックアップ保管先>:<ディレクトリ>
ファイルバックアップ
mongodbを完全に停止できるならば(もしくはスナップショット機能で静止点を担保できるならば)、データベースのファイルそのものを保管するバックアップも可能です。
まずはmongodbを停止させます。
systemctl stop mongod.service
デフォルト設定の場合、/var/lib/mongo配下にデータが格納されますので、これをバックアップします。操作例は以下の通りです。
この操作はpermissionが変わる可能性があり、一定のオペミスリスクを背負います。もし、permissionに関する考慮点を減らしたいならば、rsyncコマンドによる転送を行った方が無難です。
tar cvzf backup_from_file.tar.gz /var/lib/mongo/* scp backup_from_file.tar.gz <ユーザ名>@<バックアップ保管先>:<ディレクトリ>
リストア操作
mongorestore
あらかじめ、リストア対象となる機器の特定ディレクトリ(例:dump)配下にバックアップのファイル群が格納されている事を確認します。
[root@linux020 ~]# ls -l dump/ 合計 0 drwxr-xr-x 2 root root 69 10月 28 18:38 admin drwxr-xr-x 2 root root 59 10月 28 18:38 test [root@linux020 ~]#
mongodumpによって取得したバックアップをリストアするには、mongorestoreコマンドを使用します。mongorestoreコマンドに指定可能なオプションは以下の通りです。
| オプション | 意味 |
|---|---|
| --host | バックアップ対象となるMongoDBサーバのIPアドレス |
| --port | バックアップ対象となるMongoDBサーバのポート番号 |
| --username | MongoDB接続時のユーザ名 |
| --password | MongoDB接続時のパスワード |
| --db | バックアップ対象のデータベース(省略時は全データベースがバックアップ対象) |
| --collection | バックアップ対象のコレクション(省略時は全データベースがコレクション対象) |
| --query | クエリによりバックアップ対象を絞り込む事ができる |
| --out | バックアップ出力先のディレクトリ(省略時はdumpディレクトリ) |
| --archive | 圧縮した状態でバックアップを取得する。ただし、tar.gzやzipのような一般的な圧縮形式ではない事に注意 |
| --numParallelCollections | 指定した並列数でバックアップを取得する |
| --host | リストア対象となるMongoDBサーバのIPアドレス |
| --port | リストア対象となるMongoDBサーバのポート番号 |
| --username | MongoDB接続時のユーザ名 |
| --password | MongoDB接続時のパスワード |
| --db | リストア対象のデータベース(省略時は全データベースがバックアップ対象) |
| --collection | リストア対象のコレクション(省略時は全データベースがコレクション対象) |
| --dir | リストアのデータが格納されるディレクトリを指定する |
| --archive | mongodumpにarchiveオプションを指定した場合に出力されるarchiveファイルのパスを指定する |
| --drop | リストア対象機にデータが存在する場合は、リストア前に既存データを削除する |
| --dryRun | Dry Run |
| --numParallelCollections | 指定した並列数でリストアを実行する |
オプションの指定例は以下のようになります。
mongorestore \
--host=127.0.0.1 \
--port=27017 \
--dir=dump
操作例は以下の通りです。確かに、MongoDBへリストアされた事が分かります。
[root@linux020 ~]# mongorestore \
> --host=127.0.0.1 \
> --port=27017 \
> --dir=dump
2022-10-28T18:40:13.884+0900 preparing collections to restore from
2022-10-28T18:40:13.884+0900 reading metadata for test.inventory from dump/test/inventory.metadata.json
2022-10-28T18:40:13.896+0900 restoring test.inventory from dump/test/inventory.bson
2022-10-28T18:40:13.908+0900 finished restoring test.inventory (10 documents, 0 failures)
2022-10-28T18:40:13.909+0900 no indexes to restore for collection test.inventory
2022-10-28T18:40:13.909+0900 10 document(s) restored successfully. 0 document(s) failed to restore.
[root@linux020 ~]# mongosh --quiet --eval 'db.inventory.find().limit(3)'
[
{
_id: ObjectId("635ba14e6fdf4d3060540f21"),
item: 'canvas',
qty: 100,
size: { h: 28, w: 35.5, uom: 'cm' },
status: 'A'
},
{
_id: ObjectId("635ba14e6fdf4d3060540f22"),
item: 'journal',
qty: 25,
size: { h: 14, w: 21, uom: 'cm' },
status: 'A'
},
{
_id: ObjectId("635ba14e6fdf4d3060540f23"),
item: 'mat',
qty: 85,
size: { h: 27.9, w: 35.5, uom: 'cm' },
status: 'A'
}
]
[root@linux020 ~]# mongosh --quiet --eval 'db.inventory.find().count()'
10
[root@linux020 ~]#
ファイルバックアップ
リストア先のサーバのバックアップのファイルを転送します。以下ファイルパスにバックアップのファイルが格納されているものとします。
[root@linux020 ~]# ls -l /root/ 合計 784 -rw-------. 1 root root 1388 6月 22 2021 anaconda-ks.cfg -rw-r--r-- 1 root root 798094 10月 28 18:15 backup_from_file.tar.gz [root@linux020 ~]#
リストア先のmongodを停止されます。
systemctl stop mongod.service
リストアファイルを展開し、/var/lib/mongo配下に格納します。この時、permissionはバックアップ元とリストア先で完全に一致させるように注意してください。
rm -rf /var/lib/mongo tar xvzf backup_from_file.tar.gz --directory / chown mongod:mongod /var/lib/mongo
mongodを起動します。
systemctl start mongod.service
想定通りのデータが格納されている事を確認します。
[root@linux020 ~]# mongosh --quiet --eval 'db.inventory.find().limit(3)'
[
{
_id: ObjectId("635b74f258d58424b079c5ae"),
item: 'canvas',
qty: 100,
size: { h: 28, w: 35.5, uom: 'cm' },
status: 'A'
},
{
_id: ObjectId("635b74f258d58424b079c5af"),
item: 'journal',
qty: 25,
size: { h: 14, w: 21, uom: 'cm' },
status: 'A'
},
{
_id: ObjectId("635b74f258d58424b079c5b0"),
item: 'mat',
qty: 85,
size: { h: 27.9, w: 35.5, uom: 'cm' },
status: 'A'
}
]
[root@linux020 ~]# mongosh --quiet --eval 'db.inventory.find().count()'
10
[root@linux020 ~]#
