MySQL バイナリログの削除
1. 概要
MySQLでレプリケーションを行っているとMasterにバイナリログが溜っていきディスクを圧迫するので定期的に削除してやる必要がある。
2. 手順
2.1 レプリケーション状態の確認
まず、どこまでバイナリログを削除してよいかを調べる。
Slave側でSHOW SLAVE STATUSを実行し、Slaveがバイナリログをどこまで読み取っているかを調べる。「Master_Log_File」が現在参照中のバイナリログ。以下の例ではskylancer00-bin.000084を使用していることになるので、skylancer00-bin.000083まで削除してしまってよいことになる。Slaveが複数いる場合は、全Slaveについて確認を行う。
mysql> SHOW SLAVE STATUS \G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.0.100
Master_User: xxxx
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: skylancer00-bin.000084
Read_Master_Log_Pos: 65746708
Relay_Log_File: skylancer01-relay-bin.000362
Relay_Log_Pos: 65746851
Relay_Master_Log_File: skylancer00-bin.000084
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
<略>
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
1 row in set (0.00 sec)
2.2 バイナリログの削除
Master側でSHOW MASTER LOGSを実行すると、バイナリログの一覧が表示される。レプリケーションが順調に動作しているのであれば、最後のバイナリログと2.1で確認した「Master_Log_File」は同じものであるはず。
mysql> SHOW MASTER LOGS; +------------------------+------------+ | Log_name | File_size | +------------------------+------------+ | skylancer00-bin.000001 | 1074149684 | | skylancer00-bin.000002 | 1073741963 | | skylancer00-bin.000003 | 1073742026 | | skylancer00-bin.000004 | 1073741905 | : | skylancer00-bin.000083 | 1073742014 | | skylancer00-bin.000084 | 65746708 | +------------------------+------------+ 84 rows in set (0.00 sec)
ここでは、2.1で確認したskylancer00-bin.000084より前のバイナリログを削除するには、PURGE MASTER LOGS TO 'skylancer00-bin.000084'とすればよい。指定したファイルより前のログファイルが削除される。
mysql> PURGE MASTER LOGS TO 'skylancer00-bin.000084'; Query OK, 0 rows affected (2 min 8.51 sec) mysql> SHOW MASTER LOGS; +------------------------+------------+ | Log_name | File_size | +------------------------+------------+ | skylancer00-bin.000084 | 65746708 | +------------------------+------------+ 1 rows in set (0.00 sec)
3. バイナリログの自動削除
一定時間が経過したバイナリログを自動的に削除したい場合は、システム変数'expire_logs_days'を設定することで実現できる。
expire_logs_daysに日数を設定しておくと、設定された日数が経過したバイナリログは自動的に削除される。2週間で削除したい場合は以下のようにmy.cnfを書いておけばよい。デフォルト値は0でこれは削除を行わないことを意味する。expire_logs_daysを設定しておくと、Slave側がバイナリログを読み取っていなくても消されてしまうので、環境に応じて余裕を持った値を設定しておく必要がある。
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Default to using old password format for compatibility with mysql 3.x
# clients (those using the mysqlclient10 compatibility package).
old_passwords=1
default-character-set=utf8
log-bin
server-id=1
set-variable = expire_logs_days=14
<以下略>
my.cnf設定後、mysqldを再起動すれば値が反映される。再起動させたくない場合などはSET GLOBALコマンドでも設定できる。
mysql> show global variables like 'expire_logs_days'; +------------------+-------+ | Variable_name | Value | +------------------+-------+ | expire_logs_days | 14 | +------------------+-------+ 1 row in set (0.00 sec)
なお、バイナリログの削除はmysqldの起動時、バイナリログのローテーション時に行われるので、指定日数が経過してもファイルが残っている場合がある。