このトピックでは、ローカルディスクを使用する ApsaraDB for MongoDB インスタンスからバックアップをダウンロードし、自己管理のスタンドアロンまたはレプリカセットの MongoDB データベースに復元する方法について説明します。
論理バックアップの復元
注意事項
-
MongoDB は継続的に更新されるため、古いバージョンの mongorestore は新しいバージョンの MongoDB と互換性がありません。互換性のある mongorestore のバージョンの選択については、mongorestore をご参照ください。
-
自己管理データベースがシャードクラスターの場合、
<hostname>パラメーターを自己管理データベースの mongos コンポーネントのアドレスに設定する必要があります。 -
自己管理データベースがシャードクラスターの場合、復元コマンドに
--nsExclude="config.*"パラメーターを追加する必要があります。追加しない場合、復元プロセス中にエラーが発生する可能性があります。 -
シャードクラスターインスタンスから自己管理データベースにデータを復元する場合、クラスターインスタンスの各シャードのバックアップデータをダウンロードし、自己管理データベースにインポートする必要があります。シャードクラスターインスタンスに孤立ドキュメントが含まれている場合、自己管理データベースでダーティデータが発生する可能性があります。
前提条件
-
自己管理 MongoDB データベースが配置されているクライアントに、ApsaraDB for MongoDB インスタンスのデータベースバージョンと同じバージョンの MongoDB をダウンロードしてインストールします。クライアントはローカルサーバーまたは ECS インスタンスにすることができます。インストール手順については、Install MongoDB をご参照ください。
-
論理バックアップをダウンロード済みであること。ダウンロードしていない場合は、バックアップファイルのダウンロードをご参照ください。
操作手順
-
ダウンロードしたバックアップファイルを、mongorestore ツールがインストールされている自己管理 MongoDB データベースをホストするクライアントにコピーします。
-
次のコマンドを実行して、バックアップファイルから自己管理 MongoDB データベースにデータをインポートします。
mongorestore -h <hostname> --port <server port> -u <username> -p <password> --drop --gzip --archive=<backupfile> -vvvv --stopOnError次のパラメーターを変更します。
-
<hostname>:自己管理 MongoDB データベースのサーバーアドレス。ローカルインスタンスの場合は 127.0.0.1 を使用します。
自己管理データベースがシャードクラスターの場合は、このパラメーターを mongos コンポーネントのアドレスに設定します。
-
<server port>:自己管理 MongoDB データベースのポート。
-
<username>:自己管理 MongoDB データベースにログインするためのユーザー名。ユーザーがすべてのデータベースに対する権限を持っていることを確認してください。ルートアカウントの使用を推奨します。
-
<password>:データベースユーザーのパスワード。
-
<backupfile>:ダウンロードした論理バックアップファイルの名前。
次のコマンドパラメーターは変更する必要はありません。
-
--drop:バックアップから復元する前に、ターゲットデータベースから各コレクションを削除します。
説明複数のシャードからのバックアップを同じシャードクラスターに復元する場合、最初のシャードのバックアップを復元するときにのみ、このパラメーターを使用してください。
-
--gzip:バックアップファイルは gzip で圧縮されているため、解凍します。
説明このパラメーターは MongoDB 3.1.4 以降でサポートされています。詳細については、mongo-tools をご参照ください。
-
-vvvv:出力の詳細レベルを指定します。「v」の文字が多いほど、出力が詳細になります。
-
--stopOnError:エラーが発生した場合にインポートプロセスを停止します。
-
--nsExclude:一致するコレクションを復元から除外します。例:
--nsExclude="config.*"。
例:
mongorestore -h 127.0.0.1 --port 27017 -u root -p ******** --drop --gzip --archive=hins1111_data_20190710.ar -vvvv --stopOnError -
物理バックアップの復元
前提条件
-
インスタンスがレプリカセットであること。
-
インスタンスの TDE 機能が無効になっていること。
-
インスタンスのストレージエンジンが WiredTiger または RocksDB であること。ストレージエンジンが TerarkDB の場合は、クラウドディスクバックアップからのデータ復元をご参照ください。
説明-
インスタンスのストレージエンジンは、ApsaraDB for MongoDB コンソールの 基本情報 ページで確認できます。
-
インスタンスのストレージエンジンが RocksDB の場合、RocksDB ストレージエンジンを使用して MongoDB をコンパイルしてインストールする必要があります。
-
データベースバージョンの要件
ApsaraDB for MongoDB インスタンスのバージョンは、自己管理 MongoDB データベースのバージョンと互換性がある必要があります。次の表にバージョンマッピングを示します。
|
MongoDB インスタンス |
自己管理 MongoDB |
|
バージョン 3.2 |
バージョン 3.2 または 3.4 |
|
バージョン 3.4 |
バージョン 3.4 |
|
バージョン 4.0 |
バージョン 4.0 |
|
バージョン 4.2 |
バージョン 4.2 |
物理バックアップファイルのフォーマット
|
バックアップフォーマット |
ファイル拡張子 |
説明 |
|
TAR |
.tar.gz |
2019 年 3 月 26 日より前に作成されたインスタンスの場合、物理バックアップファイルは TAR フォーマットです。 |
|
xbstream |
_qp.xb |
2019 年 3 月 26 日以降に作成されたインスタンスの場合、物理バックアップファイルは xbstream フォーマットです。 説明
Windows はこれらのファイルの解凍に必要な Percona XtraBackup ツールをサポートしていないため、Linux システムでのみ解凍できます。 |
環境
-
この例で使用するサーバーは、Ubuntu 16.04 (64 ビット) イメージを実行する Alibaba Cloud ECS インスタンスです。ECS インスタンスの作成方法の詳細については、ウィザードを使用した ECS インスタンスの作成をご参照ください。
-
対応するバージョンの MongoDB が ECS インスタンスにインストールされています。インストール手順については、MongoDB の公式ドキュメントをご参照ください。
-
MongoDB の環境変数が ECS インスタンスに 設定されています。コマンド実行時に実行可能ファイルの完全なパスを入力する必要はありません。
-
/test/mongo/data ディレクトリは、物理的な復元のためのデータベースディレクトリとして機能します。
-
/test/mongo/data1 と /test/mongo/data2 ディレクトリは、レプリカセットノードのデータベースディレクトリとして機能します。
ステップ 1:環境変数の設定
自己管理環境で MongoDB の環境変数を設定すると、コマンド実行時に完全なパスを入力する必要がなくなります。開始する前に、MongoDB がインストールされていることを確認してください。
MongoDB の環境変数をすでに設定している場合は、このステップをスキップして ステップ 2:バックアップファイルのダウンロードと解凍 に進んでください。
-
次のコマンドを実行して、Linux の
profileファイルを開きます。sudo vi /etc/profile -
iを押して挿入モードに入り、ファイルの末尾に次の行を追加します。export PATH=$PATH:/<path_to_mongodb_server>/bin説明この例では、MongoDB サーバーのパスは /test/mongo/bin です。これを実際のパスに置き換えてください。
例:
export PATH=$PATH:/test/mongo/bin -
Esc キーを押し、
:wqと入力して Enter キーを押し、保存して終了します。 -
次のコマンドを実行して変更を適用します。
source /etc/profile
ステップ 2:バックアップファイルのダウンロードと解凍
-
MongoDB の物理バックアップファイルをダウンロードします。
wget -c '<public_download_URL_of_backup_file>' -O <custom_filename>.<extension>例:
wget -c 'http://rdsbak-hz-v3.oss-cn-hangzhou-internal.aliyuncs.com/custins5475****/hins1907****_data_20210906103710_qp.xb?Expires=......' -O backupfile._qp.xb説明-
ファイルの種類に基づいて、ファイル拡張子が
.tar.gzまたは_qp.xbであることを確認してください。 -
ダウンロード URL を一重引用符 (') で囲んで、正しく解析されるようにしてください。
-
-
次のコマンドを実行して /test/mongo/ に
dataディレクトリを作成し、ダウンロードした MongoDB 物理バックアップファイルを /test/mongo/data/ ディレクトリに移動します。mkdir -p /test/mongo/data && mv <physical_backup_filename.extension> /test/mongo/data -
物理バックアップファイルを解凍します。
-
ダウンロードした物理バックアップファイルの拡張子が .tar.gz (例:hins20190412.tar.gz) の場合は、次の方法で解凍します。
cd /test/mongo/data/ && tar xzvf hins20190412.tar.gz -
ダウンロードした物理バックアップファイルの拡張子が _qp.xb (例:hins20190412_qp.xb) の場合は、次の方法で解凍します。
-
Percona XtraBackup ツールと qpress パッケージをインストールします。詳細については、Percona XtraBackup の公式ウェブサイトのインストール手順をご参照ください。
-
物理バックアップファイルを解凍します。
# ファイルが配置されているディレクトリに移動します。 cd /test/mongo/data/ # ファイルを展開します。 cat hins20190412_qp.xb | xbstream -x -v # 物理バックアップファイルを解凍します。 innobackupex --decompress --remove-original /test/mongo/data
-
-
ステップ 3:スタンドアロンモードでの復元
-
次のコマンドを実行して、/test/mongo ディレクトリに mongod.conf という名前の設定ファイルを作成します。
touch /test/mongo/mongod.conf -
vi /test/mongo/mongod.confを実行して mongod.conf ファイルを開き、iを押して挿入モードに入ります。ApsaraDB for MongoDB インスタンスのストレージエンジンに基づいて起動設定テンプレートを選択し、mongod.conf ファイルにコピーします。
説明設定ファイルは、起動モードをスタンドアロンに設定し、認証を有効にします。
-
WiredTiger ストレージエンジン
systemLog: destination: file path: /test/mongo/mongod.log logAppend: true security: authorization: enabled storage: dbPath: /test/mongo/data directoryPerDB: true net: port: 27017 unixDomainSocket: enabled: false processManagement: fork: true pidFilePath: /test/mongo/mongod.pid説明ApsaraDB for MongoDB はデフォルトで WiredTiger ストレージエンジンを使用し、directoryPerDB オプションを有効にしています。そのため、このオプションが設定に含まれています。
-
RocksDB ストレージエンジン
systemLog: destination: file path: /test/mongo/logs/mongod.log logAppend: true security: authorization: enabled storage: dbPath: /test/mongo/data engine: rocksdb net: port: 27017 unixDomainSocket: enabled: false processManagement: fork: true pidFilePath: /test/mongo/mongod.pid
-
-
Esc キーを押し、
:wqと入力して Enter キーを押し、保存して終了します。 -
新しい mongod.conf 設定ファイルで MongoDB を起動します。
mongod -f /test/mongo/mongod.conf -
起動が完了したら、次のコマンドを実行して MongoDB データベースにログインします。
mongo --host 127.0.0.1 -u <username> -p <password> --authenticationDatabase admin-
<username>:MongoDB インスタンスのデータベースアカウント。デフォルトは root です。
-
<password>:データベースユーザーのパスワード。
説明パスワードに特殊文字が含まれている場合は、一重引用符 (') で囲んでください (例:'test123!@#')。そうしないと、ログインに失敗する可能性があります。
-
-
mongo シェルで
show dbsを実行して、ローカルの MongoDB インスタンス上のすべてのデータベースを表示し、復元が成功したことを確認します。 -
これで復元プロセスは完了です。
exitコマンドを実行して mongo シェルを終了できます。
これらの手順を完了すると、MongoDB データベースをスタンドアロンモードで起動できます。データベースをレプリカセットモードで起動するには、ステップ 4 をご参照ください。
ステップ 4:レプリカセットモードでの起動
デフォルトでは、ApsaraDB for MongoDB からの物理バックアップには、元のインスタンスのレプリカセット構成が含まれています。データベースをレプリカセットモードで起動するには、まずこの構成を削除する必要があります。次の手順に従ってください。
-
コマンドラインから、mongo シェルを使用して test ユーザーとして MongoDB データベースにログインします。
mongo --host 127.0.0.1 -u test -p <test_user_password> --authenticationDatabase admin説明パスワードに特殊文字が含まれている場合は、一重引用符 (') で囲んでください (例:'test123!@#')。そうしないと、ログインに失敗する可能性があります。
-
ログイン後、以下のコードブロックのコマンドを実行して、次の操作を実行します。
-
admin データベースで、一時ユーザーを作成し、ローカルデータベースに対する一時的な読み書き権限を付与します。
-
一時ユーザーに切り替え、ローカルデータベースから元のレプリカセット構成を削除します。
-
test ユーザーに戻り、一時ユーザーとその権限を削除します。
説明次のコードを実行する前に、
<test_user_password>プレースホルダーを実際の test ユーザーのパスワードに置き換えてください。
use admin db.runCommand({ createRole: "tmprole", roles: [ { role: "test", db: "admin" } ], privileges: [ { resource: { db: 'local', collection: 'system.replset' }, actions: [ 'remove' ] } ] }) db.runCommand({ createUser: "tmpuser", pwd: "tmppwd", roles: [ 'tmprole' ] }) db.auth('tmpuser','tmppwd') use local db.system.replset.remove({}) use admin db.auth('test','<test_user_password>') db.dropRole('tmprole') db.dropUser('tmpuser') -
-
次のコマンドを実行して MongoDB サービスをシャットダウンし、mongo シェルを終了します。
use admin db.shutdownServer() exit -
レプリカセット認証ファイルを作成します。
MongoDB をレプリカセットモードで起動するには、レプリカセットのメンバーが相互認証に使用するキーファイルを作成する必要があります。
-
次のコマンドを実行して mongo ディレクトリに keyFile ディレクトリを作成し、その中にキーファイルを作成します。
mkdir -p /test/mongo/keyFile && touch /test/mongo/keyFile/mongodb.key -
vi /test/mongo/keyFile/mongodb.keyを実行してキーファイルを開きます。iを押して挿入モードに入り、キーの内容を入力します。例:MongoDB Encrypting File説明キーファイルの内容には次の制限があります。
-
長さは 6〜1024 文字である必要があります。
-
base64 文字セットの文字のみを含めることができます。
-
等号 (=) を含めることはできません。
-
-
Esc キーを押し、
:wqと入力して Enter キーを押し、保存して終了します。 -
次のコマンドを実行して、認証ファイルの権限を
400に変更します。これにより、ファイルは所有者のみが読み取り可能になります。sudo chmod 400 /test/mongo/keyFile/mongodb.key
説明この認証ファイルは、レプリカセット内のすべてのノードで使用されます。
-
-
次の手順に従って、レプリカセット用に 2 つの空のノードを準備します。
-
次のコマンドを実行して、mongod.conf ファイルを 2 回コピーし、他の 2 つのノードの起動設定ファイルとして使用します。
cp /test/mongo/mongod.conf /test/mongo/mongod1.conf && cp /test/mongo/mongod.conf /test/mongo/mongod2.conf -
次のコマンドを実行して、他の 2 つのノードのデータディレクトリを作成します。
mkdir -p /test/mongo/data1 && mkdir -p /test/mongo/data2
-
-
各ノードの設定ファイルを次のように変更します。
-
vi /test/mongo/mongod.confを実行してノード 1 の設定ファイルを開きます。ファイルに次の内容を更新し、保存して終了します。systemLog: destination: file path: /test/mongo/mongod.log logAppend: true security: authorization: enabled keyFile: /test/mongo/keyFile/mongodb.key storage: dbPath: /test/mongo/data directoryPerDB: true net: bindIp: 127.0.0.1 port: 27017 unixDomainSocket: enabled: false processManagement: fork: true pidFilePath: /test/mongo/mongod.pid replication: replSetName: "rs0" -
vi /test/mongo/mongod1.confを実行してノード 2 の設定ファイルを開きます。ファイルに次の内容を更新し、保存して終了します。systemLog: destination: file path: /test/mongo/mongod1.log logAppend: true security: authorization: enabled keyFile: /test/mongo/keyFile/mongodb.key storage: dbPath: /test/mongo/data1 directoryPerDB: true net: bindIp: 127.0.0.1 port: 27018 unixDomainSocket: enabled: false processManagement: fork: true pidFilePath: /test/mongo/mongod1.pid replication: replSetName: "rs0" -
vi /test/mongo/mongod2.confを実行してノード 3 の設定ファイルを開きます。ファイルに次の内容を更新し、保存して終了します。systemLog: destination: file path: /test/mongo/mongod2.log logAppend: true security: authorization: enabled keyFile: /test/mongo/keyFile/mongodb.key storage: dbPath: /test/mongo/data2 directoryPerDB: true net: bindIp: 127.0.0.1 port: 27019 unixDomainSocket: enabled: false processManagement: fork: true pidFilePath: /test/mongo/mongod2.pid replication: replSetName: "rs0"
主要なパラメーターの説明:
-
systemLog.path / path:現在のノードの MongoDB ログファイルへのパス。
-
storage.dbPath:現在のノードの MongoDB データファイルへのパス。
-
processManagement.pidFilePath:現在のノードの MongoDB プロセスの PID ファイル (プロセス ID を格納) へのパス。
-
security.keyFile:レプリカセット認証ファイルへのパス。すべてのノードで同じファイルを使用する必要があります。
-
net.bindIp:現在のノードの IP アドレス。すべてのノードが同じサーバーにデプロイされている場合、同じ IP アドレスを使用できます。
-
net.port:現在のノードのポート番号。すべてのノードが同じサーバーにデプロイされている場合、異なるポート番号を使用する必要があります。
-
replication:レプリカセットの構成。
-
replication.replSetName:レプリカセットの名前。
-
-
次のコマンドを実行して 3 つのノードを起動します。
mongod -f /test/mongo/mongod.conf && mongod -f /test/mongo/mongod1.conf && mongod -f /test/mongo/mongod2.conf -
ノードが起動したら、test ユーザーとして MongoDB データベースにログインします。
mongo --host 127.0.0.1 -u test -p <test_account_password> --authenticationDatabase admin説明パスワードに特殊文字が含まれている場合は、一重引用符 (') で囲んでください (例:'test123!@#')。そうしないと、ログインに失敗する可能性があります。
-
mongo シェルで、次のコマンドを実行してノードをレプリカセットに追加し、初期化します。
rs.initiate( { _id : "rs0", version : 1, members: [ { _id: 0, host: "127.0.0.1:27017" , priority : 1}, { _id: 1, host: "127.0.0.1:27018" , priority : 0}, { _id: 2, host: "127.0.0.1:27019" , priority : 0} ] })初期化成功の例:
> rs.initiate( { ... _id : "rs0", ... version : 1, ... members: [ ... { _id: 0, host: "127.0.0.1:27017" , priority : 1}, ... { _id: 1, host: "127.0.0.1:27018" , priority : 0}, ... { _id: 2, host: "127.0.0.1:27019" , priority : 0} ... ] ... }) { "ok" : 1 } rs0:SECONDARY>説明このステップでは
rs.initiate()コマンドを使用します。詳細な使用方法については、MongoDB の公式ドキュメント rs.initiate() をご参照ください。コマンドが正常に実行されると、2 つの新しいノードはプライマリノードからのデータ同期を開始します。このプロセスに必要な時間は、バックアップファイルのサイズによって異なります。データ同期が完了すると、レプリカセットは完全に動作可能になります。
-
次の手順に従って、起動が成功したことを確認します。
-
exitを実行して mongo シェルを終了します。 -
次のコマンドを実行して MongoDB データベースに再度ログインします。
mongo -u <username> -p <password> --authenticationDatabase admin-
<username>:MongoDB インスタンスのデータベースアカウント。デフォルトは root です。
-
<password>:データベースアカウントのパスワード。
説明パスワードに特殊文字が含まれている場合は、一重引用符 (') で囲んでください (例:'test123!@#')。そうしないと、ログインに失敗する可能性があります。
-
-
mongo シェルのプロンプトの左側を確認します。
<replica_set_name>:PRIMARY>と表示されていれば、レプリカセットは正常に起動しています。
-