MongoDBでゆるふわDB体験

第11回MongoDBのバックアップ

はじめに

本連載ではこれまでMongoDBの機能面に着目してきましたが、今回から数回に分けてMongoDBの非機能面を紹介します。非機能面の中でも、今回はMongoDBの運用に欠かせないバックアップについて説明します。なお、MongoDBは最新バージョンの2.4を対象としています。

コマンド表記について

$ : コマンドラインで実行するコマンド

MongoDBのバックアップの概要

MongoDBをバックアップするには、データそのもののバックアップと、コンフィグオプションのバックアップが必要です。

コンフィグオプションは、mongodの起動引数かコンフィグファイルで指定します。どちらの場合も、mongod起動シェルやコンフィグファイルなどのファイルをコピーするだけでバックアップ可能ですので、今回の記事では割愛します。

データのバックアップには一般的にフルバックアップと差分バックアップを組み合わせて使用しますが、MongoDBに差分バックアップの機能はありません。したがって、今回はフルバックアップとリストアの方法について紹介します。

[参考]

差分バックアップはヒューマンエラーによるデータ障害から復旧する目的でとられることがありますが、その目的にはMongoDBの遅延レプリケーションという機能が該当します。遅延レプリケーションについては、公式サイトを参照してください。

MongoDBでフルバックアップを行うには、以下の2通りの方法があります。

  1. データファイルをコピーする方法
  2. mongodumpを利用する方法

データファイルをコピーする方法

データファイルをコピーする方法は、データの変換が無いためとても手軽で高速ですが、その間データベースを停止するか、ロックしておく必要があります。多くの場合は、レプリカセットのセカンダリに対してこの方法でバックアップを取ります。もちろん、その際はOplogの溢れが発生しないように注意しなければなりません。Oplogのサイズを変更する方法は、公式サイトを参照してください。

mongodumpを利用する方法

mongodumpを利用する方法では、オンラインバックアップが可能です。また、データをバイナリ(BSON)形式でダンプするため、データの変換に時間がかかる代わりに、ファイルサイズを比較的小さく抑えられる利点があります。ただし、インデックスはダンプされずにリストア時に再構築されるため、大きなインデックスがある場合にはリストアに時間がかかることに注意してください。

データファイルをコピーする方法を試してみよう

まずは、データファイルをコピーする方法でフルバックアップとリストアを試してみましょう。データディレクトリへのパスは、デフォルトで/data/dbです。コンフィグオプションでdbpathを指定している場合は、それがデータディレクトリへのパスです。今回はデータディレクトリがデフォルトのまま/data/dbであるとして進めます。

バックアップ

mongodを停止し、データファイルをディレクトリごとコピーします。

$ cp -rp /data/db /path/to/backup/mongobackup1-2013-4-24

これでフルバックアップが完了しました。何の問題も無くmongodを再開することができます。

$ mongod

それでは、データベースを停止せずに、ロックを使ってバックアップする方法も試してみましょう。

> use admin
> db.fsyncLock()

これでデータベースをロックしました。次に、データファイルをディレクトリごとコピーします。

$ cp -rp /data/db /path/to/backup/mongobackup2-2013-4-24

最後にロックを解除します。

> db.fsyncUnlock()

これでデータベースを停止せずにバックアップを取得することができました。

リストア

まず、mongodを停止して古いデータディレクトリを削除します。

$ rm -rf /data/db

リストアするには、コピーしておいたデータディレクトリを再配置するだけでOKです。

$ cp -rp /path/to/backup/mongobackup1-2013-4-24 /data/db

これでリストアが完了しました。mongodを起動しましょう。以下のような表示が出て起動できない場合、古いロックファイルを削除してください。

$ mongod
old lock file: /data/db/mongod.lock.
$ rm /data/db/mongod.lock
$ mongod

これでリストアが完了しました。

mongodumpを利用する方法を試してみよう

では次に、mongodumpでのフルバックアップとリストアを試してみましょう。

バックアップ

mongodを起動したままの状態で、mongodumpを実行します。

$ mongodump

すると、カレントディレクトリにdumpディレクトリが作成され、その中にデータベースごとのダンプファイルが保存されます。

$ ls dump/test/
customers.bson   ← customersコレクションの全バイナリデータ
customers.metadata.json   ← customersコレクションのメタデータ
system.indexes.bson   ← testデータベースのシステムインデックス

[参考]

--outオプションを指定することで、ダンプファイルの保存先を変更することができます。

$ mongodump --out /opt/backup/mongodump-2013-4-24

リストア

mongodumpを使ってバックアップした場合は、mongorestoreを使ってリストアします。ただし、mongorestoreはデータのinsertしか行いませんので、注意が必要です。すなわち、データベースを完全にリストアしたい場合は、一度mongodを停止して古いデータディレクトリを削除するか、mongodを起動したまま全てのデータベースを削除してからmongorestoreを実行する必要があります。

今回は、一度mongodを停止して古いデータディレクトリを削除してからmongorestoreを実行する方法を試してみます。mongodを停止し、以下のコマンドを実行してください。

$ rm -rf /data/db

/data/dbディレクトリを作成して、mongodを起動します。

$ mkdir /data/db
$ mongod

mongodを起動したままの状態で、mongorestoreを実行します。引数には、ダンプファイルへのパスを指定します。

$ mongorestore ./dump

これでリストアが完了しました。

mongodumpのオプション

mongodumpには複数のオプションがあります。ここでは、代表的なものをとりあげて紹介します。

コレクション単位でのバックアップ

--dbオプションでバックアップ対象のデータベースを指定し、さらに--collectionオプションで、バックアップ対象をコレクション単位で絞り込むことができます。

$ mongodump --db test --collection customers

クエリ指定でのバックアップ

-qオプションで、バックアップ対象のデータをクエリで指定することができます。

$ mongodump --db test --collection customers -q "{'rank':'Special member'}"

リモートバックアップ

mongodumpを使用して、リモートマシン上で稼働しているMongoDBのバックアップをとることが可能です。実際の運用では、ハードウェア障害に備えて、ダンプファイルは別のマシン上に置いておく方が良いでしょう。

たとえば、ホスト名mongo.example.comの37017ポートで動作している認証有りのmongodのダンプファイルを取得するには、以下のように指定します。

$ mongodump --host mongo.example.com --port 37017 --username user --password pass

これ以外のオプションについては、公式サイトのmongodumpのページをご参照ください。mongorestoreにも、リモートリストアやコレクション単位でのリストアなど、多くのオプションがあります。詳しくは公式サイトのmongorestoreのページをご参照ください。

まとめと次回のテーマ

今回はMongoDBのバックアップについて紹介しました。システムに障害はつきものです。いざという時に大切なデータをロストして泣かないためにも、きちんとバックアップ運用について設計しておきましょう。

次回はMongoDBの監視について紹介する予定です。お楽しみに!

おすすめ記事

記事・ニュース一覧