はじめに
[フレームワーク:Rails (6.1.7.2) , データベース:Mongo DB (mongosh 2.2.10)]
業務システムを開発している中で、リリース後の本番環境のデータを手元(ローカル環境)で扱う必要があった時、本番DBのダンプファイルを取得してローカルにリストアしました。ダンプファイル入手後の手順を以下に記します。
現在のDBのバックアップ
まず、コンテナ内で現在のDBをダンプ(バックアップ)し、それをコンテナ外へも反映させるためにコンテナ内からコンテナ外へファイルをコピーします。(コンテナ内だけの出来事だと、コンテナを落とした時に消えてしまうため。)
コンテナ内の操作
コマンドラインにて、
①コンテナを起動
➁コマンドでdb操作(exitで退出可能)
docker compose up d
docker compose exec mongo bash
③現在のDBのダンプ
mongodump <認証情報> --db <現在のデータベース名> --out <バックアップを保存するディレクトリ>
上記が現在のDBのダンプ(バックアップ)を行う基本的なコマンドです。
今回は、backups/dumpというディレクトリを作成し、その中に現db(sample)を入れます。
認証情報の○○部分は伏せていますが、認証情報が設定されている場合は環境に応じて記載してください。
mkdir backups
cd backups/
mkdir dump
cd ../
mongodump --authenticationDatabase=○○ --username ○○ --password ○○ --db sample --out ./backups/dump/
ダンプできていれば、/backups/dump/sampleに入っているはずです。
コンテナ外の操作
docker compose cp <コンテナ内の移動元パス> <コンテナ外の移動先パス>
上記は基本的なコピーのコマンドです。
コンテナ内から外へファイルをコピーするために、コンテナ外から操作します。あらかじめ、バックアップファイルを移動する先のフォルダを作成しておきます。(今回はbackupsフォルダを「docker compose up -d」を行っているディレクトリの一つ上に作成)
④db操作から退出します。
⑤コンテナ内からコンテナ外へバックアップファイルをコピーします。
exit
docker compose cp mongo:/backups/dump/sample ../backups
移動先フォルダにバックアップファイルが入っていれば成功です。
本番環境ファイルの配置
⑥本番環境のダンプファイル(当記事では入手方法までは記載していません。)を配置します。
今回はバックアップファイルと同じ場所、/backups/dumpに配置します。これはコマンド等ではなく、普通のコピペでいけます。
⑦コンテナ内へコピー
先ほど配置した本番ダンプファイルを、以下のようにコマンドでコピーします。cp等で行わないとymlファイルが自動で書き換えられず、自力で書き換えないといけなくなります。
「../backups/dump/sample2」が移動前で、sample2が本番環境のダンプファイルです。
「mongo:/backups/dump」が移動先です。
docker compose cp ../backups/dump/sample2 mongo:/backups/dump
リストア
dbの参照先を、もってきた本番環境のDBにします。
次のコマンドが基本的なリストアコマンドです。--dropをつけると、現在のdbが削除されます。削除しない場合、キー重複エラーが起きる可能性があります。<データベース名>はリストアするDB名です。存在しないdb名にすると、新規作成されます。<パス>はダンプしたファイルが配置されているパスです。
mongorestore --drop <認証> --db <データベース名> <パス>
⑧コマンドでdb操作
⑨リストア
docker compose exec mongo bash
mongorestore --drop --authenticationDatabase=○○ --username ○○ --password ○○ --db sample2 /backups/dump/sample2
config/mongoid.yml
の編集
参照するデータベースを変更し、再起動。
database: sample → database: sample2
あとがき
元々のdbに戻す場合は、リストア以降の操作のみでdbを変更できます。