Noraworld Developers Blog
MySQL × Rails でサーバのデータベースをダンプし、ローカルにリストアする

はじめに

開発中、ローカル環境だとデータのサンプル数が少なすぎて動作確認しづらいときがある。

そこで、開発用のサーバにあるデータをローカルに移行する方法について紹介する。

リモート側の操作

SSH で開発用サーバにログインして、Rails Console を起動する。

cd /path/to/remote/app
bundle exec rails console

Rails Console 内で以下の Ruby を実行する。

environment = Rails.env
configuration = ActiveRecord::Base.configurations[environment]
cmd = "mysqldump -u #{configuration['username']} -p#{configuration['password']} -h #{configuration['host']} -P #{configuration['port']} #{configuration['database']} > db/#{Date.today}.dump"
exec cmd

Rails アプリケーションのルートディレクトリ内に db/2021-08-18.dump のようなダンプファイルが生成される。

ローカル側の操作

scp で、先ほどダンプしたファイルをローカルにダウンロードする。その後、Rails Console を起動する。

cd /path/to/local/app
scp <USERNAME>@<IP_ADDR_OR_HOSTNAME>:/path/to/remote/app/db/<YYYY-MM-DD>.dump db
bundle exec rails console

Rails Console 内で以下の Ruby を実行する。

environment = Rails.env
configuration = ActiveRecord::Base.configurations[environment]
cmd = "mysql -u #{configuration['username']} -p#{configuration['password']} -h #{configuration['host']} -P #{configuration['port']} #{configuration['database']} < db/#{Date.today}.dump"
exec cmd

これで開発用サーバのデータをローカルで使えるようになった。

後片付け

開発用サーバにダンプファイルが残ったままなので削除しに行く。SSH で開発用サーバにログインして、以下のコマンドを実行する。

cd /path/to/remote/app
rm db/<YYYY-MM-DD>.dump

注意点

この手順を試すときは、開発用サーバのデータベース内に個人情報や秘匿情報が含まれていないことを確認すること。

もしそれらの情報が含まれていた場合は、それらを含まない形でダンプするか、個人情報や秘匿情報をマスキング (別の値に変えること) した状態でローカルにリストアすること。

間違っても本番サーバのデータベースをローカルにリストアしないように!

補足

頻繁にこのオペレーションを行うなら、こちらの記事 のように Rake Task (または Rails Runner) にしても良いかも。

PostgreSQL に関しては、こちらの記事 が参考になるだろう。

参考サイト