MySQL8.0でバイナリログを無効化する

IT

MySQLは8.0からデフォルトでバイナリログが有効になっています。
バイナリログを必要としない環境下(レプリケーションを使わない等)で
明示的にバイナリログを出力しない設定にしていない場合、意図しないバイナリログが生成され、

  • ストレージ容量を圧迫
  • ストレージI/O性能の低下

のような問題が出てしまいます。
今回はMySQL5.7から8.0に変更して明示的にバイナリログを出力しない設定をせず、バイナリログが肥大化してしまったサーバのバイナリログ消去+無効化をやってみます。

サーバリプレース後の異常

サーバのリプレース後、短い期間でストレージ使用量が異常に増えているものがあると相談を受け確認してみました。
ディレクトリ毎のファイルサイズを確認して行った結果、MySQLデータディレクトリのサイズが非常に大きくなっていました。

バイナリログが大量にある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;
MySQLバイナリログをクエリで確認

バイナリログの一括削除を行うクエリは以下になります。

PURGE MASTER LOGS before now();
MySQLバイナリログをクエリで削除

my.cnfを編集して適用

my.cnfを編集してバイナリログを出さないようにします。
エディタでmy.cnfに以下の行を追記します。

# バイナリログを出力しない(出力する場合はコメントアウトする)
disable-log-bin

追記後はMySQLが停止しても大丈夫なタイミングでMySQLを再起動してmy.cnfの設定を適用させます。以下はCentOS7の例です。

systemctl restart mysqld

これでバイナリログの出力は停止できました。

バイナリログを削除した結果

バイナリログを消す前のストレージ容量
バイナリログ削除前のストレージ
バイナリログを消した後のストレージ容量
バイナリログ削除後のストレージ

ストレージの容量が劇的に回復しました。
データベース負荷が高いサーバでは特に注意が必要ですね・・・

タイトルとURLをコピーしました