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})"

使い方は以下の通りです。

  1. 上記のスクリプトをコピペする(sync_prod_to_local.shとか適当に)
  2. #Settingの部分にある設定を変える。ポートフォワード前提で作られてるので、不要な人は色々消してください。自分の場合は適当なEC2インスタンスにsshでトンネル作って、EC2経由でRDSを見るようにしました。
  3. chmod +x ./sync_prod_to_local.sh
  4. ./sync_prod_to_local.sh dbname dbnameはコピーしたいDBの名前です。(予めlocal DBでcreate database dbnameしておいてください。)

解説

まずPort forwardでSSHトンネルを作っています。これは大抵の本番環境やステージング環境のDBはセキュリティ上、local環境から接続できないようになっていると思われるためです。もし接続できるなら直接mysqldumpで良いですね。

SSHトンネルについては以前に記事を書いているので、そちらをご覧下さい。

MySQLにssh経由で接続する色々な方法

次にmysqldumpコマンドを実行しています。これはおなじみの方法ですね。指定したDBのデータを丸ごと取ってきています。ですので、本番やステージングのDBに当然負荷がかかりますし、データが多いと転送料金や時間の問題が出てきます。ご注意ください。

そしてmysqlコマンドでそのdumpファイルを取り込んでいます。

最後にTerminateのところで作成したdumpファイルを消したり、SSHトンネルのプロセスを殺したりして綺麗にしています。

まとめ

SSHトンネルやdumpコマンドを使って本番DBのデータをlocalへ持ってくる方法を解説しました。

クックパッドなどはもっと拘っています。

開発環境のデータをできるだけ本番に近づける

ここまで労力さけない、という人・チームも多いと思いますが、今回のdumpでコピる方法くらいならお手軽なので、1エンジニアのスキルとして持っておくと良いかと思います。

dumpとか既に出尽くしたネタではありますが、RDSのポートフォワードとか絡むと若干面倒だったので、良かったらスクリプト参考にしてみてくださいー。

本番(STG)データを使って、良い開発ライフを!