🐬

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

2021/08/18に公開

はじめに

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

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

リモート側の操作

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

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

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

Console
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 のようなダンプファイルが生成される。

mysqldump: Error 2020: Got packet bigger than 'max_allowed_packet' bytes と表示された場合

mysqldump コマンドのオプションとして --max_allowed_packet=1G を追加する。

Diff
-cmd = "mysqldump -u #{configuration['username']} -p#{configuration['password']} -h #{configuration['host']} -P #{configuration['port']} #{configuration['database']} > db/#{Date.today}.dump"
+cmd = "mysqldump --max_allowed_packet=1G -u #{configuration['username']} -p#{configuration['password']} -h #{configuration['host']} -P #{configuration['port']} #{configuration['database']} > db/#{Date.today}.dump"

参考: mysqldumpでmax_allowed_packetが最大値にもかかわらずエラー

ローカル側の操作

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

Shell
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 を実行する。

Console
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

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

ERROR 1153 (08S01) at line 824: Got a packet bigger than 'max_allowed_packet' bytes と表示された場合

MySQL にログインし、max_allowed_packet=1000000000 を実行する。

Shell
mysql
MySQL
SET GLOBAL max_allowed_packet=1000000000;
\q

そして上記の操作をもう一度繰り返す。

参考: 【MySQL】ERROR 1153 (08S01) at line 58: Got a packet bigger than ‘max_allowed_packet’ bytes

後片付け

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

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

注意点

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

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

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

補足

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

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

参考サイト

GitHubで編集を提案

Discussion