MySQLのバイナリログをpurgeしてexpire_logs_daysを30日から40日にした

  • MySQL
  • Replication

この記事は、構成と文章の整理に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: 0

Read_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.cnf

diffは以下の通り。

$ diff /etc/my.cnf.bak_20151101 /etc/my.cnf
46c46
< expire_logs_days = 30
---
> expire_logs_days = 40

my.cnfの変更は再起動しないと反映されないので、稼働中の値も合わせてconsoleから変更。

mysql> set global expire_logs_days = 40;

分かったこと

  • レプリケーションが追いついている状態を確認してからpurgeすれば安全
  • expire_logs_daysはグローバル変数なのでset globalで即時変更できる
  • my.cnfの変更だけでは即時反映されないので、稼働中の値を変えたい場合はconsole側の変更も忘れずに