ニーズと、概要
ときどき、ローカルのDBが古くなってきたせいで、サイトに表示されるコンテンツが空っぽになって寂しくなったりします。
そんなときに、僕は本番DBから該当テーブルのデータを取ってきて、ローカルにインポートをしていたりしました。
けど、その手動作業に飽きてきたので、シェルスクリプトを書いてみました。(シェルスクリプトを書いたの初めてで、少し怯えています。)
全テーブルをダンプとかすると、すごいことになりそうだったので、引数にテーブル名を一つ引数にとるスクリプトにしてみました。
使い方の前に ※ 注意事項
- pg_dumpは、いっぱいデータあると排他制御入るので、アクセスが少なく、かつそんなに大量データじゃないとき限定で使用した方がよいです!(cf. pg_dumpでサーバが停止してしまう)
- 本番のデータを引っ張ってくるので、個人情報の扱いにはお気をつけください!
使い方
シェルファイル名が update_table.sh
だとしますと以下のように使います。(postsテーブルがあったとして)
sh update_table.sh posts
このように、ローカルでコマンドを打つことで、本番環境の該当テーブルをダンプして一旦保存して、それをローカル(Vagrantの中)でImportさせます。
シェルスクリプト
PostgreSQLです。
update_table.sh
# !/bin/sh
if [ $# != 1 ]; then
echo "テーブル名をひとつ引数としてわたしてください (ex: sh update_table.sh posts)"
fi
TABLE_NAME=$1
TODAY=$(date "+%Y%m%d")
DUMP_FILE_NAME="/tmp/${TODAY}_${TABLE_NAME}.dump"
# Production config
SERVER="{SERVER}"
HOST="{HOST}"
USER_NAME="{USER}"
DATABASE="{DB}"
PASSWD="{PASSWD}"
# Local config
LOCAL="{LOCAL}"
LOCAL_USER_NAME="{LOCAL_USER}"
LOCAL_DATABASE="{LOCAL_DB}"
LOCAL_PASSWD="{LOCAL_PW}"
echo "Connect to server..."
ssh $SERVER <<HERE
pg_dump -U $USER_NAME -d $DATABASE -h $HOST -t $TABLE_NAME -c > $DUMP_FILE_NAME
$PASSWD
HERE
# できればテーブルが存在しなかった場合、コマンドを停止させたかったのですが....できてない...
echo "Connect to local..."
ssh -A $LOCAL <<HERE
scp $SERVER:$DUMP_FILE_NAME $DUMP_FILE_NAME
PGPASSWORD=${LOCAL_PASSWD} psql -U $LOCAL_USER_NAME -d $LOCAL_DATABASE < $DUMP_FILE_NAME
rm -f $DUMP_FILE_NAME
HERE
echo "Connect to server..."
ssh $SERVER <<HERE
rm -f $DUMP_FILE_NAME
HERE
以上です。