FabricでリモートのMySQLのDBデータをローカルマシンから乗せ替える
Webの開発環境がローカルのPCにあって、
例えば、リモートサーバーにあるMySQLのDBの内容を、そっくりそのまま、ローカルPC内のDBの内容で定期的に乗せ替えたい場合に便利な小技ですが、
Python 製のデプロイ管理ツールFabricを使って、タスクを自動化。
以下は、dbnameというDBに4つのテーブルTABLE1、TABLE2、TABLE3、TABLE4というテーブルがあるとして、その内容を、ローカルPCのmySQLからエクスポートして、リモートのmySQLにインポートする例。
以下内容のテキストファイルをabfile.pyという名前で用意しておくと「fab musicLoad」とコマンドを打つだけで、ローカルDBのエクスポートから、リモートへのファイル転送、リモートDBへのインポートまで、一連でやってくれます。
from fabric.api import run, sudo, local, cd, lcd, put, env env.hosts = 'hoge.com' env.port = 12345 env.user = 'hoge' env.password = 'xxxxxxxx' def musicLoad(): with lcd('upload_data'): local('mysqldump -uroot music -pパスワード --tables TABLE1 > TABLE1.sql') local('mysqldump -uroot music -pパスワード --tables TABLE2 > TABLE2.sql') local('mysqldump -uroot music -pパスワード --tables TABLE3 > TABLE3.sql') local('mysqldump -uroot music -pパスワード --tables TABLE4 > TABLE4.sql') local('tar cvzf uodataSql.sql.tgz TABLE*.sql') put('uodataSql.tgz', '/var/www/xxxx/sql/uodataSql.tgz') with cd('/var/www/xxxx/sql'): run('tar xvaf uodataSql.tgz') run('mysql -u root -pパスワード -e "DROP DATABASE dbname2"', warn_only=True) run('mysql -u root -pパスワード -e "CREATE DATABASE dbname2"') run('mysql -u root -pパスワード dbname2 < TABLE1.sql') run('mysql -u root -pパスワード dbname2 < TABLE2.sql') run('mysql -u root -pパスワード dbname2 < TABLE3.sql') run('mysql -u root -pパスワード dbname2 < TABLE4.sql') with cd('/var/lib/mysql/'): run('mysql -u root -pパスワード -e "DROP DATABASE dbname_bakup"', warn_only=True) sudo('/etc/init.d/mysqld stop') sudo('mv dbname dbname_bakup') sudo('mv dbname2 dbname') sudo('/etc/init.d/mysqld start')