MySQLのダンプファイルを圧縮しながら書き出す
100Gを超えるログテーブルをmysqldump でダンプする時に、名前つきパイプを使うことで圧縮しながらファイルに保存することができます。こうする事で、圧縮前のダンプファイルを保存するためのディスク領域を確保する必要がないので、ディスクの空き領域が少ない時でも大きなテーブルのダンプファイルを作成できます。
ダンプする時
$ 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
に送ります。gzip
はcat
が送ったmysqldumpの書き込み結果を圧縮し、リダイレクト先のファイルに書き込みます。
mysqldumpが終了するときに名前つきパイプへの書き込みがクローズされ、cat
コマンドが終了し、それを受けてgzip
が終了します。
インポートする時
$ gzcat xxtable.dmp.gzip >> dmp.pipe & $ mysql -u hoge -p dbname < dmp.pipe
ダンプ作成とは逆のことを行います。
gzcat
が名前つきパイプに展開結果を書き込む処理をバックグラウンドで行います。
mysql
の入力のリダイレクトに名前つきパイプを指定することで、gzcat
が展開した結果をmysqlに送ります。