MongoDB バックアップとリストアの基本操作

スポンサーリンク

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 ~]# 
タイトルとURLをコピーしました