Ubuntu 20.04でMongoDBデータベースをバックアップ、リストア、移行する方法

著者は、寄付のための書き込みプログラムの一環として、COVID-19救済基金に寄付を行うことを選択しました。

はじめに

MongoDBは、最も人気のあるNoSQLデータベースエンジンの1つです。スケーラブルで堅牢で信頼性が高く、使いやすいことで有名です。この記事では、サンプルのMongoDBデータベースをバックアップ、リストア、および移行します。

データベースのインポートとエクスポートは、他のソフトウェア製品と互換性のある人間が読める形式でデータを扱うことを意味します。対照的に、MongoDBのバックアップとリストア操作は、MongoDB固有のバイナリデータを作成または使用し、データの整合性と完全性だけでなく、特定のMongoDB属性も保持します。したがって、移行に関しては、ソースとターゲットのシステムが互換性がある限り、通常はバックアップとリストアを使用することが好ましいです。

前提条件

このチュートリアルを進める前に、次の前提条件をすべて満たしていることを確認してください:

このチュートリアルで特に指定されていない限り、root権限が必要なすべてのコマンドは、sudo権限を持つ非ルートユーザーとして実行する必要があります。

ステップ1 — MongoDBでJSONとBSONを使用する

この記事をさらに読む前に、問題に関する基本的な理解が必要です。Redisなどの他のNoSQLデータベースシステムの経験がある場合、MongoDBを使用する際に類似点がいくつか見つかるかもしれません。

MongoDBは、情報を保存するためにJSONおよびBSON(バイナリJSON)形式を使用しています。JSONは人間が読みやすい形式であり、データのエクスポートおよび最終的にはインポートに適しています。JSONをサポートする任意のツール、単純なテキストエディタを含む、任意のツールでエクスポートされたデータをさらに管理できます。

次のような例の.jsonドキュメントがあります:

Example of JSON Format
{"address":[
    {"building":"1007", "street":"Park Ave"},
    {"building":"1008", "street":"New Ave"},
]}

JSONは操作が簡単ですが、BSONで利用可能なすべてのデータ型をサポートしているわけではありません。これは、JSONを使用すると情報の「信頼性の低下」と呼ばれることがあることを意味します。バックアップと復元には、バイナリBSONを使用する方が良いでしょう。

第二に、MongoDBでは、明示的にMongoDBデータベースを作成する必要はありません。インポート用に指定したデータベースが存在しない場合、自動的に作成されます。さらに優れているのは、コレクション(データベースのテーブル)の構造です。MongoDBでは、他のデータベースエンジンとは異なり、構造は再度、最初のドキュメント(データベースの行)の挿入時に自動的に作成されます。

第三に、MongoDBでは、この記事のタスクのような大量のデータの読み取りや挿入は、CPU、メモリ、およびディスクスペースを多く消費する場合があります。これは、MongoDBが大規模なデータベースやビッグデータに頻繁に使用されることを考慮すると、重要です。この問題の最も簡単な解決策は、夜間または非ピーク時にエクスポートとバックアップを実行することです。

第四に、データの一貫性は、情報がデータベースのエクスポートやバックアッププロセス中に変更される忙しいMongoDBサーバーで問題になる可能性があります。この問題の1つの可能な解決策は、MongoDBのトピックを深く理解した際に考慮すべきレプリケーションです。

データのバックアップとリストアには、インポートとエクスポート機能を使用できますが、MongoDBデータベースの完全性を確保するためのより良い方法があります。データをバックアップするには、mongodumpコマンドを使用します。リストアには、mongorestoreを使用します。それでは、これらがどのように機能するか見てみましょう。

ステップ2 — mongodumpを使用してMongoDBデータベースをバックアップする

まず、MongoDBデータベースのバックアップについて説明します。

の必須の引数は--dbであり、これはバックアップを取得したいデータベースの名前を指定します。データベース名を指定しない場合、はすべてのデータベースをバックアップします。2番目の重要な引数は--outで、データをダンプするディレクトリを定義します。例えば、newdbデータベースをバックアップし、/var/backups/mongobackupsディレクトリに保存します。理想的には、現在の日付のディレクトリごとにバックアップを取得します。例えば、/var/backups/mongobackups/10-29-20

まず、そのディレクトリ/var/backups/mongobackupsを作成します:

  1. sudo mkdir /var/backups/mongobackups

次に、mongodumpを実行します:

  1. sudo mongodump --db newdb --out /var/backups/mongobackups/$(date +'%m-%d-%y')

次のような出力が表示されます:

Output
2020-10-29T19:22:36.886+0000 writing newdb.restaurants to 2020-10-29T19:22:36.969+0000 done dumping newdb.restaurants (25359 documents)

上記のディレクトリパスでは、現在の日付を自動的に取得するためにdate +'%m-%d-%y'を使用していることに注意してください。これにより、/var/backups/10-29-20/のようにディレクトリ内にバックアップを配置でき、バックアップの自動化が特に便利になります。

この時点で、/var/backups/mongobackups/10-29-20/newdb/ディレクトリにnewdbデータベースの完全なバックアップがあります。このバックアップには、newdbを正しく復元し、その「忠実度」を保持するために必要なすべてが含まれています。

一般的なルールとして、サーバーの負荷が最も少ない時に定期的にバックアップを取るべきです。したがって、コマンドをcronジョブとして定期的に実行するように設定できます。例えば、毎日03:03 AMに実行します。

これを行うには、cronのエディタであるcrontabを開きます。

  1. sudo crontab -e

sudo crontabを実行すると、rootユーザーのクーロンジョブを編集します。これはお勧めです。なぜなら、ユーザーのクーロンを設定すると、特にsudoプロファイルがパスワードの確認を必要とする場合、正しく実行されない可能性があるからです。

クーロンタブプロンプト内に、次のmongodumpコマンドを挿入します:

crontab
  1. 3 3 * * * mongodump --out /var/backups/mongobackups/$(date +'\%m-\%d-\%y')

上記のコマンドでは、通常、すべてのデータベースをバックアップしたいため、わざと--db引数を省略しています。また、特殊文字%は、クーロン構文に準拠するためにエスケープする必要があります。

MongoDBデータベースのサイズに応じて、バックアップが多すぎてディスクスペースがすぐに不足する可能性があります。そのため、古いバックアップを定期的に削除するか、圧縮することもお勧めです。

たとえば、7日より古いすべてのバックアップを削除するには、次のbashコマンドを使用できます:

  1. find /var/backups/mongobackups/ -mtime +7 -exec rm -rf {} \;

前述のmongodumpコマンドと同様に、これもクーロンジョブとして追加できます。次のバックアップを開始する直前に実行する必要があります。03:03 AMのジョブの場合、この削除は03:01 AMに実行されます。再びcrontabを開きます:

  1. sudo crontab -e

次の行を挿入します:

crontab
  1. 1 3 * * * find /var/backups/mongobackups/ -mtime +7 -exec rm -rf {} \;

ファイルを保存して閉じます。

このステップでのすべてのタスクを完了すると、MongoDBデータベースの適切なバックアップソリューションが確立されます。次に、データベースを復元します。

ステップ3 — MongoDBデータベースの復元と移行にmongorestoreを使用する

以前のバックアップからMongoDBデータベースを復元すると、特定の時点で取得したMongoDB情報の完全なコピーが得られます。これにはすべてのインデックスとデータ型も含まれます。これはMongoDBデータベースを移行する際に特に便利です。MongoDBを復元するためには、mongodumpが生成するバイナリバックアップと共に動作するmongorestoreコマンドを使用します。

前に取得したバックアップからnewdbデータベースを復元する方法を見てみましょう。まず、--nsInclude引数でデータベースの名前を指定します。newdb.*を使用してすべてのコレクションを復元します。 restaurantsのような単一のコレクションを復元する場合は、代わりにnewdb.restaurantsを使用します。

次に、--dropを使用して、対象のデータベースが最初に削除されるようにします。バックアップがクリーンなデータベースに復元されます。 最後の引数として、最後のバックアップのディレクトリを指定します。これは次のようになります:/var/backups/mongobackups/10-29-20/newdb/

タイムスタンプ付きのバックアップがある場合は、次のコマンドを使用して復元できます(日付を自分のものに合わせて更新します):

  1. sudo mongorestore --db newdb --drop /var/backups/mongobackups/10-29-20/newdb/

次のような出力が表示されます:

Output
2020-10-29T19:25:45.825+0000 the --db and --collection args should only be used when restoring from a BSON file. Other uses are deprecated and will not exist in the future; use --nsInclude instead 2020-10-29T19:25:45.826+0000 building a list of collections to restore from /var/backups/mongobackups/10-29-20/newdb dir 2020-10-29T19:25:45.829+0000 reading metadata for newdb.restaurants from /var/backups/mongobackups/10-29-20/newdb/restaurants.metadata.json 2020-10-29T19:25:45.834+0000 restoring newdb.restaurants from /var/backups/mongobackups/10-29-20/newdb/restaurants.bson 2020-10-29T19:25:46.130+0000 no indexes to restore 2020-10-29T19:25:46.130+0000 finished restoring newdb.restaurants (25359 documents) 2020-10-29T19:25:46.130+0000 done

上記の場合、バックアップを作成したサーバーと同じサーバーにデータを復元しています。データを別のサーバーに移行して同じ手法を使用したい場合は、バックアップディレクトリをコピーする必要があります。この場合、バックアップディレクトリは/var/backups/mongobackups/10-29-20/newdb/です。

結論

これで、MongoDBデータベースのバックアップ、復元、および移行に関連するいくつかの重要なタスクを実行しました。ここで説明されているような信頼性の高いバックアップ戦略なしで、本番のMongoDBサーバーを実行するべきではありません。

これらの<DigitalOceanコミュニティ記事でMongoDBの構成と使用方法に関するさらなるチュートリアルを見つけることができます。また、MongoDBが提供する可能性に関する優れたリソースである公式の<MongoDBドキュメントもご参照ください。

Source:
https://www.digitalocean.com/community/tutorials/how-to-back-up-restore-and-migrate-a-mongodb-database-on-ubuntu-20-04