LoginSignup
1
2

More than 5 years have passed since last update.

[mysql]dumpファイルのサイズを気にせずに別サーバへデータを転送する

Posted at

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

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2