序章

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

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

前提条件

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

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

基本を理解する

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

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

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

json形式の例
{"address":[
    {"building":"1007", "street":"Park Ave"},
    {"building":"1008", "street":"New Ave"},
]}

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

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

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

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

インポートおよびエクスポート機能を使用してデータをバックアップおよび復元できますが、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 コマンドで:

  1. sudo mkdir /var/backups/mongobackups

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

  1. 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/01-20-16/. これは、バックアップを自動化するときに特に便利です。

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

原則として、毎日など、定期的にバックアップを作成する必要があります。できれば、サーバーの負荷が最も少ない時間帯にバックアップを作成することをお勧めします。 したがって、を設定することができます mongodump 定期的に実行されるようにcronジョブとしてコマンドを実行します。例: 毎日午前3時3分。 この開いたcrontabを実行するには、次のようなcronのエディターを使用します。

  1. sudo crontab -e

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

crontabプロンプト内に以下を挿入します mongodump 指図:

crontabウィンドウ
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 コマンド、これはcronジョブとして追加することもできます。 次のバックアップを開始する直前に実行する必要があります。例: 午前3時1分。 この目的のために、crontabを再度開きます。

  1. sudo crontab -e

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

crontabウィンドウ
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/01-20-16/newdb/. したがって、コマンド全体は次のようになります(復元するバックアップの日付に置き換えます)。

  1. sudo mongorestore --db newdb --drop /var/backups/mongobackups/01-20-16/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/01-20-16/newdb/ 私たちの場合、他のサーバーに。

結論

この記事では、データベースのバックアップ、復元、移行の観点から、MongoDBデータを管理するための基本事項を紹介しました。 スケーラブルなMongoDBデータベースをセットアップする方法については、MongoDBレプリケーションについて説明されています。

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