

MySQLのバイナリログをpurgeしてexpire_logs_daysを30日から40日にした
この記事は、構成と文章の整理にAIを使っています。
あくまで読みやすくするための補助で、内容そのものをAIにすべて任せて書いているわけではありませんが、ところどころ相談しながら整えています。
レプリケーション構成のMySQLでバイナリログが溜まってきたので整理した。
やったこと
まずレプリケーション状態を確認。
mysql> SHOW SLAVE STATUS \G Master_Host: db-master Master_Log_File: mysql-bin.000231 Read_Master_Log_Pos: 69756041 Slave_IO_Running: Yes Slave_SQL_Running: Yes Exec_Master_Log_Pos: 69756041 Seconds_Behind_Master: 0Read_Master_Log_PosとExec_Master_Log_Posが一致していてSeconds_Behind_Masterも0なので、slave側は完全に追いついている状態。これなら古いbinlogを消しても問題ない。
master側のファイル位置も確認。
mysql> show master status;+------------------+----------+| File | Position |+------------------+----------+| mysql-bin.000231 | 69781486 |+------------------+----------+5日より前のログをpurge。
mysql> purge master logs before date_sub(now(), interval 5 day);Query OK, 0 rows affected (0.40 sec)ディスク容量も確認しておく。
$ df -h/dev/mapper/vg-lv_root 36G 1.4G 33G 4% //dev/mapper/data-vg/data01 20G 4.4G 15G 24% /data余裕はあるので緊急対応というよりは定期メンテナンスの範囲。
expire_logs_daysの変更
元の設定はmy.cnfでexpire_logs_days = 30になっていた。今回purgeをすぐ効かせるために一時的にconsoleから5に変更してpurgeを実行し、その後恒久設定として40日に変更することにした。
my.cnfをバックアップしてから編集。
$ sudo cp -p /etc/my.cnf{,.bak_20151101}$ sudo vim /etc/my.cnfdiffは以下の通り。
$ diff /etc/my.cnf.bak_20151101 /etc/my.cnf46c46< expire_logs_days = 30---> expire_logs_days = 40my.cnfの変更は再起動しないと反映されないので、稼働中の値も合わせてconsoleから変更。
mysql> set global expire_logs_days = 40;分かったこと
- レプリケーションが追いついている状態を確認してからpurgeすれば安全
expire_logs_daysはグローバル変数なのでset globalで即時変更できる- my.cnfの変更だけでは即時反映されないので、稼働中の値を変えたい場合はconsole側の変更も忘れずに