MENU

SQLダンプやログファイルを高圧縮して保管・転送コストを削減する実務手順

DBのフルダンプやアクセスログは数百MB〜数GBに膨らみやすく、ディスク逼迫や転送遅延の原因になります。bzip2形式はテキスト系ファイルへの圧縮率が高く、同じSQLダンプでもgzipより10〜20%小さくなるケースが多いです。この記事ではファイル単体の圧縮・解凍から、tarを組み合わせたディレクトリ丸ごとの圧縮、logrotateとの自動化連携まで、コピペで即使える手順を紹介します。

目次

bzip2を選ぶ場面と他の圧縮形式との使い分け

圧縮形式は用途に合わせて使い分けることが実務の基本です。代表的な形式の特徴を整理します。

形式速度圧縮率主な用途
gzip (.gz)速い標準パイプ処理・汎用圧縮
bzip2 (.bz2)やや遅い高い(テキスト系)SQLダンプ・ログの長期保管
xz (.xz)遅い最高パッケージ配布・最大圧縮
zstd (.zst)速い高い高速かつ高圧縮が必要な場面

bzip2が特に効果を発揮するのは、SQL文のようにパターンの繰り返しが多いテキストファイルです。圧縮に数十秒かかっても問題ない長期保管用バックアップや、転送先のストレージが限られている場面に向いています。リアルタイムのパイプ処理やCPU負荷を抑えたい場合はgzipzstdが適しています。なお、すでに圧縮済みのファイル(JPEGや動画、既存のアーカイブ)に対しては圧縮効果がほとんど得られず、むしろサイズが微増する場合もあるため注意が必要です。

ファイル単体をbzip2形式で圧縮する

bzip2コマンドにファイル名を渡すだけで圧縮できます。圧縮後は元ファイルが削除され、拡張子 .bz2 が付いたファイルが生成されます。

# 圧縮前のサイズを確認
ls -lh dump_20240718.sql
# -rw-r--r-- 1 ops ops 198M Jul 18 09:00 dump_20240718.sql

# bzip2 で圧縮(元ファイルは削除される)
bzip2 dump_20240718.sql

# 圧縮後のサイズを確認
ls -lh dump_20240718.sql.bz2
# -rw-r--r-- 1 ops ops 3.5M Jul 18 09:00 dump_20240718.sql.bz2

元ファイルを残したい場合は -k(keep)オプションを付けます。バックアップスクリプトなど、元ファイルをそのまま使い続ける運用では必須のオプションです。

# 元ファイルを残したまま圧縮
bzip2 -k dump_20240718.sql

# 両方のファイルが存在することを確認
ls -lh dump_20240718.sql dump_20240718.sql.bz2

圧縮効果を数値で確認したいときは -v(verbose)を追加します。実際の圧縮率がビット/バイト単位で表示されるため、対象ファイルがbzip2に向いているかどうか判断できます。

bzip2 -v dump_20240718.sql
#   dump_20240718.sql:  56.234:1,  0.142 bits/byte, 98.22% saved, 207421440 in, 3688960 out.

bzip2形式のファイルを解凍する

bunzip2コマンド、または bzip2 -d で解凍できます。いずれも動作は同一で、解凍後は元の .bz2 ファイルが削除されます。

# bunzip2 で解凍(.bz2 ファイルは削除される)
bunzip2 dump_20240718.sql.bz2

# bzip2 -d でも同じ結果
bzip2 -d dump_20240718.sql.bz2

解凍せずに内容だけ確認したいときは bzcat を使います。ディスクを消費せずにログのgrepや先頭行の確認ができるため、調査作業で重宝します。

# 解凍せずにエラー行を抽出
bzcat access.log.bz2 | grep "ERROR" | tail -20

# 先頭10行だけ確認
bzcat dump_20240718.sql.bz2 | head -10

転送後のファイル破損チェックには -t(test)オプションが便利です。実際に解凍を行わず整合性のみ検証するため、ディスク消費なしで確認できます。

# 圧縮ファイルの整合性チェック(解凍は行わない)
bzip2 -t dump_20240718.sql.bz2
# 正常なら何も表示されない。破損していればエラーメッセージが出る

tarと組み合わせてディレクトリごと圧縮する

複数ファイルやディレクトリ構造をまとめて圧縮する場合は、tar-j オプションを使って .tar.bz2 アーカイブを作成します。

# ディレクトリを .tar.bz2 に圧縮(-j で bzip2 を指定)
tar -cjvf backup_20240718.tar.bz2 /var/log/myapp/

# 圧縮後のサイズを確認
ls -lh backup_20240718.tar.bz2
# .tar.bz2 を展開(カレントディレクトリに展開される)
tar -xjvf backup_20240718.tar.bz2

# 展開先を指定する場合は -C オプション
tar -xjvf backup_20240718.tar.bz2 -C /tmp/restore/

# 展開せずに中身を一覧表示
tar -tjvf backup_20240718.tar.bz2

tar オプションの読み方は c(create)/x(extract)/t(list)+j(bzip2)+v(verbose)+f(filename)の組み合わせです。一度覚えれば迷いません。

実務でよく使うオプションと応用テクニック

圧縮レベルの調整でCPU負荷をコントロールする

-1(高速・圧縮率低め)から -9(低速・圧縮率最大)まで指定できます。デフォルトは -9 です。バッチ処理中にCPU負荷が問題になる場面では -1 から試すと良いでしょう。

# CPU負荷を抑えて速度優先で圧縮
bzip2 -1 large_dump.sql

# 最大圧縮率(デフォルトと同等)
bzip2 -9 large_dump.sql

数GBを超えるファイルは並列圧縮ツールを活用する

bzip2はシングルスレッド動作のため、数GB以上のファイルでは処理時間がボトルネックになります。pbzip2(parallel bzip2)はマルチコアを活用して大幅に高速化でき、出力フォーマットは標準のbzip2と完全互換です。

# pbzip2 のインストール(Ubuntu 22.04 / Debian 12)
sudo apt install pbzip2

# pbzip2 のインストール(RHEL 9 / Rocky / AlmaLinux)
sudo dnf install pbzip2

# 並列圧縮(コア数は自動検出)
pbzip2 -k large_dump.sql

# tar と組み合わせる場合(パイプ経由)
tar -cf - /var/log/myapp/ | pbzip2 -c > backup_20240718.tar.bz2

同名ファイルの上書きを防ぐ自動化設計

bzip2は同名の .bz2 ファイルが存在する場合、上書きを拒否してエラーになります。毎日バックアップを自動生成するスクリプトでは、ファイル名に日付を含めるか、世代管理で古いファイルを削除する設計にします。

#!/bin/bash
# 日付付きファイル名でSQLダンプを圧縮バックアップ
DATE=$(date +%Y%m%d)
DUMP_FILE="/var/backup/dump_${DATE}.sql"
mysqldump -u root mydb > "${DUMP_FILE}"
bzip2 "${DUMP_FILE}"

# 30日より古いバックアップを自動削除
find /var/backup/ -name "dump_*.sql.bz2" -mtime +30 -delete

logrotateと連携してログを自動圧縮する

運用現場でのログ圧縮は、手動で実行するよりもlogrotateに任せるのが定石です。/etc/logrotate.d/の設定ファイルにcompresscompresscmdを指定するだけで、ローテート後のログが自動的にbzip2圧縮されます。

# /etc/logrotate.d/myapp の設定例
/var/log/myapp/*.log {
    daily
    rotate 30
    compress
    compresscmd /usr/bin/bzip2
    compressext .bz2
    delaycompress
    missingok
    notifempty
    sharedscripts
    postrotate
        systemctl reload myapp.service || true
    endscript
}

delaycompressを指定すると、直前のローテートファイルは1世代分を非圧縮で保持します。障害調査で最新ログを即座に参照できるため、ある運用現場では「圧縮は必ず1世代遅延させる」をチームのルールにしているケースが多いです。設定変更後は logrotate -d /etc/logrotate.d/myapp でドライランを実行し、意図通りに動作することを確認してから本番適用します。

<PR>この記事に関連するおすすめ書籍

[試して理解]Linuxのしくみ 増補改訂版

プロセス・ファイルシステム・権限などLinuxの内部構造を図解で理解できる一冊。運用判断の勘所が腑に落ちます。

「コマンドは打てる。次は”現場で通用する型”を最短で身につけたい」——そんなあなたへ。

ネットの断片的なTipsをコピペするだけでは、体系的な運用スキルはなかなか積み上がりません。リナックスマスター.JPの無料メルマガ「リナマガ」では、現場で実際に使うLinuxサーバー運用の考え方を、順を追って実務目線でお届けしています。いま登録された方には、安全なサーバー構築の「型」をまとめた『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼント中です。

>> 図解60P『Linux入門マニュアル』を無料で受け取る
(メルマガ登録は10秒・いつでも解除OK)

※ 「独学の時間がもったいない」「プロから現場の技術を最短で学びたい」という本気の方には、2日で実務レベルが身につく初心者向けハンズオンセミナーもご用意しています。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

目次