Adachinですっ。
MySQLのDB移行したい場合って、
一番ラクなのがmysql dumpで終わりだと思いますが、
権限なくてdumpできない場合(大人の事情)、
すべてのテーブルをcsvに出力してインポートするしかありません。
あとは一日一回cronで回せば、レプリケーションぽくなります。
今回簡単なスクリプトと流れを作ったのでブログします。
■流れ
1.コピーしたいDBのテーブル一覧をメモする
2.コピーしたいテーブル情報を確認する
3.移行先(RDS)に同じテーブルを作成する
4.cronで一日一回スクリプトを叩く
※テーブル情報が間違ってるとインポートしたときに形式がずれてしまうので確認しましょう!!
■スクリプト
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# /bin/sh | |
#あってもなくても | |
#LOG=*-`date +\%Y-\%m-\%d –date "-1 days"`.log | |
#for文ですべてのテーブルを回す | |
for x in adachin01 adachin02 adachin03 adachin04; do | |
CSV=/db/$x-`date +\%Y-\%m-\%d`.csv | |
OLD_CSV=/db/$x-`date +\%Y-\%m-\%d –date "-1 days"`.csv | |
#csvにすべて出力 | |
mysql -h IP -u adachin '-passdayo' –database=adachin -e "select * from $x" | sed 's/\t/","/g;s/^/"/;s/$/"/;s/\n//g' > $CSV | |
#csvから独自DBにインポート | |
mysql -h rdsadachin -P 3306 -u root -passdayo –database=adachindb -e "LOAD DATA LOCAL INFILE '$CSV' REPLACE INTO TABLE $x FIELDS TERMINATED BY ',' ENCLOSED BY '\"' IGNORE 1 LINES;" | |
#一日前のcsvを削除 | |
rm -rf $OLD_CSV $LOG | |
done | |
— | |
・cron | |
MAILTO =adachin@~ | |
0 0 * * * (/scripts/db_csv_replication.sh 2>&1 >> /var/log/scripts.log) | tee -a /var/log/scripts.log |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
2:#テーブルの設定内容確認し下記のように作成する | |
show create table adachin01\G | |
~省略 | |
`id` int(11) NOT NULL AUTO_INCREMENT, | |
`username` varchar(50) NOT NULL, | |
`password` varchar(50) NOT NULL, | |
`authority` varchar(1000) NOT NULL, | |
`date` int(11) NOT NULL, | |
PRIMARY KEY (`id`) | |
) ENGINE=innodb AUTO_INCREMENT=46 DEFAULT CHARSET=utf8 | |
3:#テーブル作成 | |
CREATE TABLE `adachin01` ( | |
`id` int(11) NOT NULL AUTO_INCREMENT, | |
`username` varchar(50) NOT NULL, | |
`password` varchar(50) NOT NULL, | |
`authority` varchar(1000) NOT NULL, | |
`date` int(11) NOT NULL, | |
PRIMARY KEY (`id`) | |
) ENGINE=innodb AUTO_INCREMENT=46 DEFAULT CHARSET=utf8; |
インポートするときにSQL文でREPLACE INTO TABLE(上書き)、
IGNORE 1 LINES(1行目を無視)するようにしてます。
csvは実行時に今の日付を指定し、一日前のcsvは削除もしています。
・cron
ファイルに標準出力、標準エラー出力された場合、メールで飛ばすように設定してます。
■まとめ
今回SQLの知識がなかったため、先輩方にアドバイス頂き大変感謝しております!
RDSの場合、文字化けとか酷かったので次回文字化け対応についてブログします。
参考:http://d.hatena.ne.jp/fd0/20090801/p1
0件のコメント