Ubuntu 14.04でMongoDBデータベースをバックアップ、復元、および移行する方法

MongoDBは、最も人気のあるNoSQLデータベースエンジンの1つです。 拡張性があり、強力で、信頼性が高く、使いやすいことで有名です。 この記事では、MongoDBデータベースをバックアップ、復元、移行する方法を示します。

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

前提条件

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

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

基本を理解する

この記事をさらに続ける前に、この問題に関する基本的な理解が必要です。 MySQLなどの一般的なリレーショナルデータベースシステムの経験がある場合は、MongoDBを使用するときにいくつかの類似点が見つかることがあります。

最初に知っておくべきことは、MongoDBは情報を格納するためにhttp://json.org/[json]およびbson(バイナリjson)形式を使用することです。 Jsonは人間が読める形式であり、データのエクスポート、最終的にはインポートに最適です。 エクスポートされたデータは、シンプルなテキストエディターなど、jsonをサポートするツールでさらに管理できます。

JSONドキュメントの例は次のようになります。

JSON形式の例

{"address":[
   {"building":"1007", "street":"Park Ave"},
   {"building":"1008", "street":"New Ave"},
]}

Jsonは非常に便利ですが、bsonで使用できるすべてのデータ型をサポートしているわけではありません。 これは、jsonを使用する場合、情報のいわゆる「忠実性の喪失」があることを意味します。 バックアップと復元には、バイナリbsonを使用することをお勧めします。

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

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

第4に、データベースのエクスポートまたはバックアッププロセス中に情報が変化する忙しいMongoDBサーバーがある場合、情報の一貫性に問題が生じる可能性があります。 この問題に対する簡単な解決策はありませんが、この記事の最後に、レプリケーションについてさらに読むための推奨事項があります。

https://www.digitalocean.com/community/tutorials/how-to-import-and-export-a-mongodb-database-on-ubuntu-14-04 [インポートおよびエクスポート機能]を使用してバックアップすることができますがデータを復元する場合、MongoDBデータベースの完全な整合性を確保するためのより良い方法があります。 データをバックアップするには、コマンド「+ mongodump 」を使用する必要があります。 復元するには、「 mongorestore +」を使用します。 それらがどのように機能するかを見てみましょう。

MongoDBデータベースのバックアップ

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

+ mongodump +`の重要な引数は `+-db +`です。これは、バックアップするデータベースの名前を指定します。 データベース名を指定しない場合、「+ mongodump +」はすべてのデータベースをバックアップします。 2番目の重要な引数は、データがダンプされるディレクトリを指定する「+-out +」です。 `+ newdb +`データベースをバックアップし、それを `+ / var / backups / mongobackups +`ディレクトリに保存する例を見てみましょう。 理想的には、 `+ / var / backups / mongobackups / 01-20-16 +(2016年1月20日)のような現在の日付のディレクトリに各バックアップを作成します。 まず、次のコマンドを使用して、そのディレクトリ `+ / var / backups / mongobackups +`を作成します。

sudo mkdir /var/backups/mongobackups

次に、バックアップコマンドは次のようになります。

sudo mongodump --db newdb --out /var/backups/mongobackups/`date +"%m-%d-%y"`

正常に実行されたバックアップには、次のような出力が含まれます。

mongodumpの出力

2016-01-20T10:11:57.685-0500    writing newdb.restaurants to /var/backups/mongobackups/01-20-16/newdb/restaurants.bson
2016-01-20T10:11:57.907-0500    writing newdb.restaurants metadata to /var/backups/mongobackups/01-20-16/newdb/restaurants.metadata.json
2016-01-20T10:11:57.911-0500    done dumping newdb.restaurants (25359 documents)
2016-01-20T10:11:57.911-0500    writing newdb.system.indexes to /var/backups/mongobackups/01-20-16/newdb/system.indexes.bson

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

この時点で、ディレクトリ `+ / var / backups / mongobackups // newdb / `に ` newdb `データベースの完全なバックアップがあります。 このバックアップには、「 newdb +」を適切に復元し、いわゆる「忠実度」を維持するためのすべてが含まれています。

一般的なルールとして、毎日など、定期的にバックアップを作成する必要があります。サーバーの負荷が最も少ない時間に行うことが望ましいです。 したがって、 `+ mongodump +`コマンドをcronジョブとして設定すると、定期的に実行できます。 毎日午前3時3分。 このcrontabを開くには、cronのエディターは次のようになります。

sudo crontab -e

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

crontabプロンプト内に、次の「+ mongodump +」コマンドを挿入します。

クロンタブウィンドウ

3 3 * * * mongodump --out /var/backups/mongobackups/`date +"%m-%d-%y"`

上記のコマンドでは、通常、すべてのデータベースをバックアップしたいので、意図的に `+-db +`引数を省略しています。

MongoDBデータベースのサイズによっては、バックアップの数が多すぎるとすぐにディスク容量が不足する場合があります。 そのため、古いバックアップを定期的にクリーニングするか、圧縮することもお勧めします。 たとえば、7日より古いすべてのバックアップを削除するには、次のbashコマンドを使用できます。

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

前の `+ mongodump +`コマンドと同様に、これはcronジョブとして追加することもできます。 次のバックアップを開始する直前に実行する必要があります。 03:01 AM この目的のために、crontabを再度開きます。

sudo crontab -e

その後、次の行を挿入します。

クロンタブウィンドウ

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

この手順のすべてのタスクを完了すると、MongoDBデータベースの適切なバックアップソリューションが確保されます。

MongoDBデータベースの復元と移行

前のバックアップ(前の手順など)からMongoDBデータベースを復元することにより、すべてのインデックスとデータ型を含む特定の時間に取得したMongoDB情報の正確なコピーを取得できます。 これは、MongoDBデータベースを移行する場合に特に便利です。 MongoDBを復元するには、コマンド「+ mongorestore 」を使用します。これは、「 mongodump +」によって作成されたバイナリバックアップで動作します。

`+ newdb `データベースを使用して例を続け、以前に取得したバックアップからデータベースを復元する方法を見てみましょう。 引数として、最初にデータベースの名前を `-db `引数で指定します。 次に、「-drop 」を使用して、ターゲットデータベースが最初に削除され、バックアップがクリーンなデータベースに復元されるようにします。 最後の引数として、最後のバックアップのディレクトリ「 / var / backups / mongobackups // newdb / +」を指定します。 したがって、コマンド全体は次のようになります(復元するバックアップの日付に置き換えてください)。

sudo mongorestore --db newdb --drop /var/backups/mongobackups//newdb/

正常に実行されると、次の出力が表示されます。

mongorestoreの出力

2016-01-20T10:44:47.876-0500    building a list of collections to restore from /var/backups/mongobackups/01-20-16/newdb/ dir
2016-01-20T10:44:47.908-0500    reading metadata file from /var/backups/mongobackups/01-20-16/newdb/restaurants.metadata.json
2016-01-20T10:44:47.909-0500    restoring newdb.restaurants from file /var/backups/mongobackups/01-20-16/newdb/restaurants.bson
2016-01-20T10:44:48.591-0500    restoring indexes for collection newdb.restaurants from metadata
2016-01-20T10:44:48.592-0500    finished restoring newdb.restaurants (25359 documents)
2016-01-20T10:44:48.592-0500    done

上記の場合、バックアップが作成された同じサーバーにデータを復元しています。 データを別のサーバーに移行し、同じ手法を使用する場合は、バックアップディレクトリ(この例では + / var / backups / mongobackups // newdb / +)を他のサーバーにコピーするだけです。

結論

この記事では、データベースのバックアップ、復元、および移行に関して、MongoDBデータを管理するための基本事項を紹介しました。 MongoDBレプリケーションが存在するhttps://www.digitalocean.com/community/tutorials/how-to-set-up-a-scalable-mongodb-database [スケーラブルMongoDBデータベースのセットアップ方法]でさらに読むことができます。説明した。

レプリケーションは、スケーラビリティに役立つだけでなく、現在のトピックにとっても重要です。 レプリケーションを使用すると、障害からマスターサーバーを復元している間、スレーブMongoDBサーバーから中断せずにMongoDBサービスを実行し続けることができます。 複製の一部はhttps://docs.mongodb.org/manual/core/replica-set-oplog/[operations log(oplog)]でもあり、これはデータを変更するすべての操作を記録します。 MySQLでバイナリログを使用するのと同じように、このログを使用して、最後のバックアップが行われた後にデータを復元できます。 通常、バックアップは夜間に行われることを思い出してください。夜間にバックアップを復元することにした場合、最後のバックアップ以降のすべての更新が失われます。

Related