このトピックでは、ローカルディスクを使用する MongoDB インスタンスのダウンロード済みバックアップから、シングルノードまたはレプリカセットとして構成された自主管理 MongoDB データベースにデータを復元する方法について説明します。
ローカルディスクの論理バックアップからデータを復元する
注意事項
MongoDB は常に更新されており、古いバージョンの mongorestore は新しいバージョンの MongoDB と互換性がない場合があります。MongoDB のバージョンと互換性のある mongorestore のバージョンを選択する必要があります。詳細については、「mongorestore」をご参照ください。
自主管理データベースがシャードクラスターの場合、データインポートコマンドの
<hostname>パラメーターを、自主管理データベースの Mongos コンポーネントのアドレスに設定します。自主管理データベースがシャードクラスターの場合、データインポートコマンドに
--nsExclude="config.*"を追加する必要があります。そうしないと、データ復元中にエラーが発生する可能性があります。シャードクラスターインスタンスから自主管理データベースにデータを復元する場合、各シャードコンポーネントのバックアップデータをダウンロードし、そのデータを自主管理データベースにインポートする必要があります。シャードクラスターインスタンスに孤立したドキュメントが含まれている場合、ダーティデータが自主管理データベースに導入される可能性があります。複数のシャードのバックアップを同じシャードクラスターに復元する場合、最初のシャードのバックアップを復元するときにのみ drop パラメーターを使用します。
準備
ソース ApsaraDB for MongoDB インスタンスと同じバージョンの MongoDB をクライアント (ローカルサーバーまたは ECS インスタンス) にダウンロードしてインストールします。詳細については、「MongoDB のインストール」をご参照ください。
論理バックアップファイルをダウンロード済みであること。まだダウンロードしていない場合は、「バックアップファイルのダウンロード」をご参照ください。
手順
ダウンロードしたバックアップファイルを、自主管理 MongoDB データベースがあるクライアントにコピーします。このクライアントには mongorestore ツールがインストールされている必要があります。
次のコマンドを実行して、バックアップファイルから自主管理 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 データベースへのログインに使用するユーザー名。ユーザーがすべてのデータベースに対する権限を持っていることを確認してください。root アカウントを使用することをお勧めします。
<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 ツールをサポートしていないため、xbstream 形式は Linux でのみ解凍できます。 |
環境
次の手順では、64 ビットの Ubuntu 16.04 イメージを実行する Alibaba Cloud ECS インスタンスを使用します。ECS インスタンスの作成方法の詳細については、「ECS インスタンスの作成」をご参照ください。
必要なバージョンの MongoDB が ECS インスタンスにインストールされていること。詳細については、MongoDB の公式ドキュメントをご参照ください。
MongoDB の環境変数が ECS インスタンスに設定されていること。これにより、実行可能ファイルの完全なパスを入力せずにコマンドを実行できます。
/test/mongo/data ディレクトリが MongoDB の物理復元用のデータベースディレクトリとして使用されます。
/test/mongo/data1 および /test/mongo/data2 ディレクトリがレプリカセットノードのデータベースディレクトリとして使用されます。
ステップ 1: 環境変数の設定
自主管理データベース環境で MongoDB の環境変数を設定します。これにより、完全なパスを入力せずにコマンドを実行できます。このステップを実行する前に、MongoDB がインストールされていることを確認してください。
MongoDB の環境変数をすでに設定している場合は、このステップをスキップして「ステップ 2: 物理バックアップファイルのダウンロードと解凍」に進むことができます。
次のコマンドを実行して、Linux の
profile環境変数ファイルを開きます。sudo vi /etc/profileiキーを押して編集モードに入ります。次に、最後の行に次の内容を追加します:export PATH=$PATH:/<Path to the MongoDB server>/bin説明この例では、MongoDB サーバーへのパスは /test/mongo/bin です。要件に応じてパスを変更できます。
例:
export PATH=$PATH:/test/mongo/binEsc キーを押して編集モードを終了します。次に、
:wqと入力してファイルを保存し、終了します。次のコマンドを実行して、環境変数ファイルへの変更を適用します:
source /etc/profile
ステップ 2: 物理バックアップファイルのダウンロードと解凍
MongoDB インスタンスの物理バックアップファイルをダウンロードします。次のコマンドを実行してファイルをダウンロードできます。
wget -c '<External download URL of the data backup file>' -O <Custom_file_name>.<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 が正しく解析されるように、ダウンロード URL を一重引用符 (') で囲みます。
次のコマンドを実行して、/test/mongo/ ディレクトリに
dataディレクトリを作成し、ダウンロードした物理バックアップファイルを /test/mongo/data/ ディレクトリに移動します。mkdir -p /test/mongo/data && mv <Physical_backup_file_name.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 の公式 Web サイトの「インストール手順」をご参照ください。
物理バックアップファイルを解凍します。たとえば、データベースバックアップファイルの名前が hins20190412_qp.xb の場合:
# ファイルが配置されているディレクトリに移動します。 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と入力してファイルを保存し、終了します。新しい mongod.conf 構成ファイルを使用して MongoDB を起動します。
mongod -f /test/mongo/mongod.conf起動が完了したら、次のコマンドを実行して MongoDB データベースにログインし、mongo シェルに入ります。
mongo --host 127.0.0.1 -u <username> -p <password> --authenticationDatabase admin<username>: MongoDB インスタンスのデータベースアカウント。デフォルトは root です。
<password>: データベースアカウントのパスワード。
説明パスワードに特殊文字が含まれている場合は、パスワードを一重引用符 (') で囲みます。例: 'test123!@#'。そうしないと、ログインに失敗する可能性があります。
mongo シェルで
show dbsを実行して、ローカル MongoDB インスタンス内のすべてのデータベースをクエリし、復元が成功したことを確認します。これで復元は完了です。mongo シェルで
exitコマンドを実行して終了できます。
これらのステップを完了すると、MongoDB データベースはシングルノードモードで起動します。データベースをレプリカセットモードで起動するには、ステップ 4 に進みます。
ステップ 4: レプリカセットモードで MongoDB データベースを起動する
デフォルトでは、ApsaraDB for MongoDB インスタンスの物理バックアップには、元のインスタンスのレプリカセット構成が含まれています。データベースをレプリカセットモードで起動するには、この構成を削除する必要があります。そのためには、次のステップを実行します:
コマンドラインで、mongo シェルを使用して test ユーザーとして MongoDB データベースにログインします。
mongo --host 127.0.0.1 -u test -p <password_of_the_test_user> --authenticationDatabase admin説明パスワードに特殊文字が含まれている場合は、パスワードを一重引用符 (') で囲みます。例: 'test123!@#'。そうしないと、ログインに失敗する可能性があります。
ログイン後、次のコードブロックのコマンドを実行して、以下のアクションを実行します:
admin データベースに一時ユーザーを作成し、そのユーザーにローカルデータベースに対する一時的な読み取りおよび書き込み権限を付与します。
一時ユーザーに切り替えて、ローカルデータベースから元のレプリカセット構成を削除します。
test ユーザーに切り替えて、一時ユーザーとその権限を削除します。
説明コマンドを実行する前に、次のコードの
<password_of_the_test_user>を 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','<password_of_the_test_user>') 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.keyvi /test/mongo/keyFile/mongodb.keyを実行して mongodb.key ファイルを開きます。iキーを押して編集モードに入り、暗号化コンテンツを入力します。例:MongoDB Encrypting File説明暗号化コンテンツには次の制限があります:
長さは 6 文字から 1,024 文字の間でなければなりません。
Base64 文字セットの文字のみを含めることができます。
等号 (=) を含めることはできません。
Esc キーを押して編集モードを終了します。次に、
:wqと入力してファイルを保存し、終了します。コマンドラインで次のコマンドを実行して、認証ファイルの権限を
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: 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"
以下に主要なパラメーターを説明します:
path (systemLog 配下): 現在のノードの MongoDB ログファイルのパス。
dbpath: 現在のノードの MongoDB データファイルのパス。
pidFilePath: 現在のノードの MongoDB PID ファイル (プロセス ID を記録するファイル) のパス。
keyFile: レプリカセット認証ファイルのパス。すべてのノードが同じ認証ファイルを使用する必要があります。
bindIp: 現在のノードの IP アドレス。レプリカセットが同じサーバーにデプロイされている場合、すべてのノードが同じ IP アドレスを使用できます。
port: 現在のノードのポート番号。レプリカセットが同じサーバーにデプロイされている場合、すべてのノードが異なるポート番号を使用する必要があります。
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 <password_of_the_test_account> --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()コマンドを使用します。このコマンドの詳細については、MongoDB の公式ドキュメントの「rs.initiate()」をご参照ください。コマンドが正常に実行されると、2 つの新しいノードがプライマリノードとのデータ同期を開始します。このプロセスに必要な時間は、バックアップファイルのサイズによって異なります。データ同期が完了すると、レプリカセットモードでの起動は完了です。
起動が成功したことを確認します。
exitを実行して mongo シェルを終了します。次のコマンドを実行して、再度 MongoDB データベースにログインします。
mongo -u <username> -p <password> --authenticationDatabase admin<username>: MongoDB インスタンスのデータベースアカウント。デフォルトは root です。
<password>: データベースアカウントのパスワード。
説明パスワードに特殊文字が含まれている場合は、パスワードを一重引用符 (') で囲みます。例: 'test123!@#'。そうしないと、ログインに失敗する可能性があります。
mongo シェルのコマンドラインの左側を観察します。
<Replica_set_name>:PRIMARY>が表示されている場合、レプリカセットモードでの起動は成功です。