MySQLの本番DB、ステージングDBをローカルへ自動でコピーするスクリプト
こんにちは、@s_tsukaです。
今回はMySQLを使って開発をするときに、本番DB(ステージングDB)のデータをローカルDBへ持ってくる話です。(半)自動で行えるスクリプトも用意したので、良かったら使ってください。
概要
- shell script用意する
- mysqldump使う
- 多分portforward必要でしょうし、それ使う
スクリプト
概要で大体察しが付く人もいるかと思うので、あれこれ解説する前に早速スクリプトを貼っておきますね。
#!/bin/bash
# Settings
db_sync_id=${RANDOM}
dump_file=dump_${db_sync_id}.sql
db_src_host=instancename.xxxxxxxxxx.ap-northeast-1.rds.amazonaws.com
db_src_port=3306
db_user=root
db_password=password
ssh_key_file=~/.ssh/mykey.pem
ssh_user=ec2-user
ssh_host=52.69.1.1
ssh_mapping_port=3307
# Args
db_name=$1
echo "Start sync DB!(db_sync_id=${db_sync_id})"
if [ "${db_name}" = "" ]; then
echo "[ERROR] Please input database name."
exit 1
fi
# Port forward
ssh -f -N -L ${ssh_mapping_port}:${db_src_host}:${db_src_port} -i ${ssh_key_file} ${ssh_user}@${ssh_host}
# Dump
mysqldump -u ${db_user} -p${db_password} -h 127.0.0.1 -P ${ssh_mapping_port} ${db_name} > ${dump_file}
# Restore
mysql -u root ${db_name} < ${dump_file}
# Terminate
rm ${dump_file}
kill `lsof -ti tcp:${ssh_mapping_port}`
echo "End sync DB!(db_sync_id=${db_sync_id})"
使い方は以下の通りです。
- 上記のスクリプトをコピペする(sync_prod_to_local.shとか適当に)
- #Settingの部分にある設定を変える。ポートフォワード前提で作られてるので、不要な人は色々消してください。自分の場合は適当なEC2インスタンスにsshでトンネル作って、EC2経由でRDSを見るようにしました。
- chmod +x ./sync_prod_to_local.sh
- ./sync_prod_to_local.sh dbname dbnameはコピーしたいDBの名前です。(予めlocal DBでcreate database dbnameしておいてください。)
解説
まずPort forwardでSSHトンネルを作っています。これは大抵の本番環境やステージング環境のDBはセキュリティ上、local環境から接続できないようになっていると思われるためです。もし接続できるなら直接mysqldumpで良いですね。
SSHトンネルについては以前に記事を書いているので、そちらをご覧下さい。
次にmysqldumpコマンドを実行しています。これはおなじみの方法ですね。指定したDBのデータを丸ごと取ってきています。ですので、本番やステージングのDBに当然負荷がかかりますし、データが多いと転送料金や時間の問題が出てきます。ご注意ください。
そしてmysqlコマンドでそのdumpファイルを取り込んでいます。
最後にTerminateのところで作成したdumpファイルを消したり、SSHトンネルのプロセスを殺したりして綺麗にしています。
まとめ
SSHトンネルやdumpコマンドを使って本番DBのデータをlocalへ持ってくる方法を解説しました。
クックパッドなどはもっと拘っています。
ここまで労力さけない、という人・チームも多いと思いますが、今回のdumpでコピる方法くらいならお手軽なので、1エンジニアのスキルとして持っておくと良いかと思います。
dumpとか既に出尽くしたネタではありますが、RDSのポートフォワードとか絡むと若干面倒だったので、良かったらスクリプト参考にしてみてくださいー。
本番(STG)データを使って、良い開発ライフを!