MongoDB を バックアップ / リストア する 方法

0 件のコメント

今回は、データベースサーバー操作で基本となる バックアップ / リカバリ についてまとめます。 MongoDB 3.0.0 から サーバー を起動しておき、 MongoDB サーバー へ接続しないとバックアップが取れないように修正されました。 アクセス制御を有効化している場合は接続するユーザーのロールと対象とするデータベースに気を付けます。

バックアップ

アクセス制御がない場合

MongoDB サーバーにおいて以下のコマンドを実行すると BSON ファイル で指定した場所にバックアップが取得できます。 アクセス制御がなければすべてのデータベースを対象にバックアップ & リストアができます。

mongodump -o <PATH>

アクセス制御が有効な場合

すべてのデータベースを読み取れるユーザーが存在しない限り(←こんなユーザーがいたらアクセス制御の意味がない。。)、データベース単位での バックアップ & リストア になります。 MongoDB サーバー が認証を有効にしている場合、「認証先データベース名」、「ユーザー名」、「パスワード」、「バックアップ対象データベース名」を指定する必要があります。 また、バックアップを実行できるユーザーは「read」ロールを持っているユーザーになります。 「dbAdmin」ロールだけではバックアップできません。

構文

mongodump --authenticationDatabase <DATABASENAME> -u <USERNAME> -p <PASSWORD> -d <TARGET>

オプション

引数 説明
--authenticationDatabase <database> 認証を行うユーザーが登録されているデータベース名を指定します。 ユーザーはデータベース単位に作成されるので、アクセス制御が有効な場合は必ず指定が必要です。
--user <username>, -u <username> 認証したいユーザー名を指定します。 raed ロールがあるユーザーを指定します。
--password <password>, -p <password> 認証したいユーザーのパスワードを指定します。
--db <database>, -d <database> バックアップしたいデータベース名を指定します。 指定がなければすべてのデータベースを対象にバックアップします。 (すべてのデータベースをバックアップする場合、ユーザーがすべてのデータベースに対する read ロールを持っていないと失敗します)

サンプルコード

mongodb --authenticationDatabase test -u user1 -p user1 -d test -o "./dump/20170114"

リストア

アクセス制御がない場合

mongodump で出力先指定したパス (-o オプションで指定したパス)を指定してリストアします。 アクセス制御がなければ自由にバックアップ & リストアできるので、すべてのデータベースを対象にリストアもできます。 -d オプションを指定しなければすべてのデータベースを対象にリストアします。

mongorestore <PATH>

アクセス制御が有効な場合

バックアップと同じく基本的にはデータベース単位での作業になります。 「認証先データベース名」「ユーザー名」「パスワード」「リストア先データベース名」「リストアするBSONファイルがあるパス」を指定してリストアします。

構文

mongorestore --authenticationDatabase <DATABASENAME> -u <USERNAME> -p <PASSWORD> -d <TARGET> <PATH>

オプション

引数 説明
--authenticationDatabase <database> 認証を行うユーザーが登録されているデータベース名を指定します。 ユーザーはデータベース単位に作成されるので、アクセス制御が有効な場合は必ず指定が必要です。
--user <username>, -u <username> 認証したいユーザー名を指定します。 リストア先データベースに対する「readWrite」ロールがあるユーザーを指定します。
--password <password>, -p <password> 認証したいユーザーのパスワードを指定します。
--db <database>, -d <database> リストアしたいデータベース名を指定します。 指定がなければすべてのデータベースを対象にリストアします。 (すべてのデータベースをリストアする場合、ユーザーがすべてのデータベースに対する readWrite ロールを持っていないと失敗します)
<path> BSONファイルがあるパスを指定します。 mongodump で出力したパスの下にデータベース単位のフォルダが作成されているので、データベース単位のパスを指定します。

サンプルコード

mongodb --authenticationDatabase test -u user1 -p user1 -d test -o "./dump/20170114/test"

サンプルコード (まとめ)

基本的なことは上までに記載しましたが…、バックアップとリストアを通してどのように行うのか見えづらいので、以下にパターン別でまとめます。

アクセス制御なし MongoDB で すべてのデータベース を バックアップ・リストア

mongodump -o "./dump"
mongorestore "./dump"

アクセス制御がある MongoDB で 特定のデータベース を バックアップ・リストア

mongodump --authenticationDatabase test -u readRoleUser -p password -d test -o "./dump"
mongorestore --authenticationDatabase test -u readWriteRoleUser -p password -d test "./dump/test"

参考記事