patternsqlCritical
Is it safe to delete mysql-bin files?
Viewed 0 times
bindeletemysqlfilessafe
Problem
I have MM Replication in mysql, and I want to squeeze some free space in the box be deleting unnecessary files, I came across these
If it is safe to delete, then is there anything I could do to automatically delete those files once they are not in use ?
mysql-bin files inside /var/db/mysql/ There are hundreds of those files like mysql-bin.000123, mysql-bin.000223 etc. I have checked the mysql replication by doing show master status and show slave status they are using some mysql-bin files at certain positions, but I guess all the other bin files are leftovers which will not be used anymore. In this case is it safe to delete all those mysql-bin files except the ones that replication is currently pointing at ?If it is safe to delete, then is there anything I could do to automatically delete those files once they are not in use ?
Solution
Please do not just delete them in the OS.
You need to let mysqld do that for you. Here is how mysqld manages it:
The file
These will clear all binary logs before the binlog or timestamp you just specified.
For example, if you run
this will erase all binary logs before
If you run
this will erase all binary logs before midnight 3 days ago.
If you want to have binlog rotated away automatically and keep 3 days woth, simply set this:
then add this to
and mysqld will delete them logs for you
SHOW SLAVE STATUS\G
This is critical. When you run
When replication has little or no lag these are usually the same value. When there is a lot of replication lag, these values are different. Just to make it simple, choose whatever
That way, replication is not interrupted.
You need to let mysqld do that for you. Here is how mysqld manages it:
The file
mysql-bin.[index] keeps a list of all binary logs mysqld has generated and auto-rotated. The mechanisms for cleaning out the binlogs in conjunction with mysql-bin.[index] are:PURGE BINARY LOGS TO 'binlogname';
PURGE BINARY LOGS BEFORE 'datetimestamp';These will clear all binary logs before the binlog or timestamp you just specified.
For example, if you run
PURGE BINARY LOGS TO 'mysql-bin.000223';this will erase all binary logs before
mysql-bin.000223.If you run
PURGE BINARY LOGS BEFORE DATE(NOW() - INTERVAL 3 DAY) + INTERVAL 0 SECOND;this will erase all binary logs before midnight 3 days ago.
If you want to have binlog rotated away automatically and keep 3 days woth, simply set this:
mysql> SET GLOBAL expire_logs_days = 3;then add this to
/etc/my.cnf[mysqld]
expire_logs_days=3and mysqld will delete them logs for you
SHOW SLAVE STATUS\G
This is critical. When you run
SHOW SLAVE STATUS\G, you will see two binary logs from the Master:Master_Log_File
Relay_Master_Log_File
When replication has little or no lag these are usually the same value. When there is a lot of replication lag, these values are different. Just to make it simple, choose whatever
Relay_Master_Log_File is, and go back to the Master and runPURGE BINARY LOGS TO 'Whatever Relay_Master_Log_File Is';That way, replication is not interrupted.
Code Snippets
PURGE BINARY LOGS TO 'binlogname';
PURGE BINARY LOGS BEFORE 'datetimestamp';PURGE BINARY LOGS TO 'mysql-bin.000223';PURGE BINARY LOGS BEFORE DATE(NOW() - INTERVAL 3 DAY) + INTERVAL 0 SECOND;mysql> SET GLOBAL expire_logs_days = 3;[mysqld]
expire_logs_days=3Context
StackExchange Database Administrators Q#41050, answer score: 224
Revisions (0)
No revisions yet.