huruyosi’s blog

プログラミングとかインフラとかのメモです。

MySQLのダンプファイルを圧縮しながら書き出す

100Gを超えるログテーブルをmysqldump でダンプする時に、名前つきパイプを使うことで圧縮しながらファイルに保存することができます。こうする事で、圧縮前のダンプファイルを保存するためのディスク領域を確保する必要がないので、ディスクの空き領域が少ない時でも大きなテーブルのダンプファイルを作成できます。

名前付きパイプ - Wikipedia

ダンプする時

$ mkfifo dmp.pipe
$ cat dmp.pipe | gzip -c  > xxtable.dmp.gzip &
$ mysqldump -u hoge -p dbname -r dmp.pipe

mkfifoで名前つきパイプをあらかじめ作成しておき、catの出力をgzipの圧縮をバックグランドプロセスで行います。catは名前つきパイプdmp.pipeに書き込まれるのを待っています。

その状態でmysqldumpを行い -rオプションで書き込み先のファイルに名前つきパイプを指定します。mysqldumpは名前つきパイプに書き込みを行い、バックグラウンドで実行しているcatがmysqldumpが書き込んだ結果を読み込み、無名パイプを使ってgzipに送ります。gzipcatが送ったmysqldumpの書き込み結果を圧縮し、リダイレクト先のファイルに書き込みます。

mysqldumpが終了するときに名前つきパイプへの書き込みがクローズされ、catコマンドが終了し、それを受けてgzipが終了します。

インポートする時

$ gzcat xxtable.dmp.gzip >> dmp.pipe &
$ mysql -u hoge -p dbname < dmp.pipe 

ダンプ作成とは逆のことを行います。 gzcatが名前つきパイプに展開結果を書き込む処理をバックグラウンドで行います。

mysqlの入力のリダイレクトに名前つきパイプを指定することで、gzcatが展開した結果をmysqlに送ります。