#dumpファイルのサイズを気にせず別サーバへデータを転送する
あるmysqlサーバから別のmysqlサーバにデータを移したい。
dumpファイルに出力後別サーバに流し込む方法だと、ディスク容量の関係で大きなデータを転送できない。
そこでmknodコマンドでFIFOスペシャルファイルを作成し、dumpの結果をそのまま別サーバへ流し込めば、ディスクの空き容量を気にせずに作業できる。
mknodでファイル作成後、別プロセスでファイルオープン、クローズするとファイルからmysqlコマンドへの入力処理が終了する。
mkfifoも同様のファイルを作成できる。
実際の処理をワンライナーにするとこんな感じ。
dump_file=/tmp/dump.sql; \
mknod ${dump_file} p; \
mysql -uuser -ppass -htohost db < ${dump_file} & \
mysqldump -uuser -ppass -hfromhost db table1 table2> ${dump_file}
シェルにするとこんな感じ。
\#! /bin/bash
TABLES="
table1
table2
"
table=($TABLES)
dump_file=/tmp/${tables[0]}.sql
mknod ${dump_file} p
mysql -uuser -ppass -htohost db < ${dump_file} &
mysqldump -uuser -ppass -hfromhost db $TABLES > ${dump_file}
rm -rf ${dump_file}
バックアップなどの用途で圧縮したい場合はこんな感じ。
\#! /bin/bash
TABLES="
table1
table2
"
table=($TABLES)
dump_file=/tmp/${tables[0]}.sql
mknod ${dump_file} p
gzip < ${dump_file} > ${dump_file}.gz &
mysqldump -uuser -ppass -hfromhost db $TABLES > ${dump_file}
rm -rf ${dump_file}
スペシャルファイルの動きについて試してみたい方はターミナルを複数立ち上げ、片方で
dump_file=/tmp/tmp.sql; \
mknod ${dump_file} p; \
mysql -uuser -ppass -htohost db < ${dump_file}
もう片方で
cat "select count(*) from table1" > /tmp/tmp.sql
とするとmknodコマンドを実行したターミナルにcountの結果が出力され、処理が完了するので試していただきたい。
mknodについてはこちらを参照
https://www.ibm.com/support/knowledgecenter/ja/SSLTBW_2.2.0/com.ibm.zos.v2r2.bpxa500/mknod.htm
mkfifoについてはこちら
http://qiita.com/richmikan@github/items/bb660a58690ac01ec295