MySQLは8.0からデフォルトでバイナリログが有効になっています。
バイナリログを必要としない環境下(レプリケーションを使わない等)で
明示的にバイナリログを出力しない設定にしていない場合、意図しないバイナリログが生成され、
- ストレージ容量を圧迫
- ストレージI/O性能の低下
のような問題が出てしまいます。
今回はMySQL5.7から8.0に変更して明示的にバイナリログを出力しない設定をせず、バイナリログが肥大化してしまったサーバのバイナリログ消去+無効化をやってみます。
サーバリプレース後の異常
サーバのリプレース後、短い期間でストレージ使用量が異常に増えているものがあると相談を受け確認してみました。
ディレクトリ毎のファイルサイズを確認して行った結果、MySQLデータディレクトリのサイズが非常に大きくなっていました。
binlog.003591~binlog.5184の1593ファイル、約1.6TB程度のバイナリログが生成されています。
タイムスタンプを見るとデフォルトでは1ヶ月分のバイナリログを残す設定になっているようです。
このサーバはバイナリログを出力する必要のないサーバですので、無駄にストレージを圧迫している状態です。
バイナリログが出力された原因
サーバリプレース時の変更点としてMySQLバージョンを5.7から8.0にアップデート、my.cnfは5.7と同じ設定を使っているということでした。
MySQL5.7の場合、my.cnfに
log-bin = mysql-bin
のようにバイナリログを有効にする行を書かない限りバイナリログは出力されませんが、MySQL8.0はlog-binの行が無い場合でもデフォルトでバイナリログが出力されます。
log-binが有効になっているかはMySQLにログインして以下のクエリで確認出来ます。
SHOW GLOBAL VARIABLES LIKE 'log_bin';
バイナリログ削除
手動でrmコマンドを使ってバイナリログを消したくなりますが、トラブル防止のためMySQLにログインしてバイナリログを削除します。
バイナリログの一覧表示をするクエリは以下になります。
SHOW MASTER LOGS;
バイナリログの一括削除を行うクエリは以下になります。
PURGE MASTER LOGS before now();
my.cnfを編集して適用
my.cnfを編集してバイナリログを出さないようにします。
エディタでmy.cnfに以下の行を追記します。
# バイナリログを出力しない(出力する場合はコメントアウトする) disable-log-bin
追記後はMySQLが停止しても大丈夫なタイミングでMySQLを再起動してmy.cnfの設定を適用させます。以下はCentOS7の例です。
systemctl restart mysqld
これでバイナリログの出力は停止できました。
バイナリログを削除した結果
ストレージの容量が劇的に回復しました。
データベース負荷が高いサーバでは特に注意が必要ですね・・・