mysql主备复制是通过binlog完成的。在开启binlog的情况下,expire_logs_days参数可以让mysql自动清理若干天前的binlog。那么expire_logs_days是在什么时候生效的呢?初步猜想实在每次产生一个新的binlog的时候去判断一次。查了一下具体的实现,确实是这样的:(5.1.58, log.cc)
int MYSQL_BIN_LOG::rotate_and_purge(uint flags) { ... if (!error && check_purge && expire_logs_days) { time_t purge_time= my_time(0) - expire_logs_days*24*60*60; if (purge_time >= 0) purge_logs_before_date(purge_time); } ... }
如果设置了expire_logs_days,每次binlog rotate的时候都去计算一下purge_time(当前时间-expire_logs_days;这个计算似乎是可以省去的: expire_logs_days是以天为单位,范围是0~99, 0表示不会清理,自然不会进入if块内:),以99来计算,my_time(0) - 99*24*60*60>=0也是恒真的了),调用purge_logs_before_date(purge_time), purge_logs_before_date会从log index文件中的第一个binlog文件开始循环: 比较文件的最后修改时间,如果小于purge_time,就放入数组to_log中。然后调用purge_logs,清理所有满足条件的binlog。
int MYSQL_BIN_LOG::purge_logs_before_date(time_t purge_time) { ... MY_STAT stat_area; ... pthread_mutex_lock(&LOCK_index); to_log[0]= 0; if ((error=find_log_pos(&log_info, NullS, 0 /*no mutex*/))) goto err; while (strcmp(log_file_name, log_info.log_file_name) && !is_active(log_info.log_file_name) && !log_in_use(log_info.log_file_name)) { ... if (stat_area.st_mtime < purge_time) strmake(to_log, log_info.log_file_name, sizeof(log_info.log_file_name) - 1); else break; ... }
下面看一下purge_logs的实现:
int MYSQL_BIN_LOG::purge_logs(const char *to_log, bool included, bool need_mutex, bool need_update_threads, ulonglong *decrease_log_space) { ... while ((strcmp(to_log,log_info.log_file_name) || (exit_loop=included)) && !is_active(log_info.log_file_name) && !log_in_use(log_info.log_file_name)) { if ((error= register_purge_index_entry(log_info.log_file_name))) ... } ... /* We know how many files to delete. Update index file. */ if ((error=update_log_index(&log_info, need_update_threads))) ... /* Read each entry from purge_index_file and delete the file. */ if (is_inited_purge_index_file() && (error= purge_index_entry(thd, decrease_log_space, FALSE))) ...
purge_logs会将需要清理的binlog文件名放入purge_index_file(IO_CACHE)中,然后更新index文件,最后再调用purge_index_entry删除binlog文件:
int MYSQL_BIN_LOG::purge_index_entry(THD *thd, ulonglong *decrease_log_space, bool need_mutex) { ... for (;;) { ... if (!my_delete(log_info.log_file_name, MYF(0))) { if (decrease_log_space) *decrease_log_space-= s.st_size; } ... }
my_delete调用unlink()删除binlog文件。至此,完成了自动清理binlog的过程。另外当mysql启动的时候,mysql也会执行purge_logs_before_date(purge_time)的过程(其它的操作,如果会引起binlog rotate,自然也会触发这个过程,如flush logs)。
梳理一下整个过程,不难发现,在压力比较大的mysql上或生产环境,我们不应该启动这个参数(my.cnf中不显式设置该参数或设置expire_logs_days=0):mysql每天产生十几个或更多的binlog文件,启用这个参数后,一次清理这么多文件,必定会导致磁盘io被占满,mysql出现抖动或hang住。因此建议自己编写脚本,每次purge完一个binlog后,sleep几秒。
参考链接:
http://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html#sysvar_expire_logs_days
http://dev.mysql.com/doc/refman/5.5/en/log-file-maintenance.html
相关推荐
1、创建存储mysql二进制日志目录 mysql> system mkdir -p /app/mysql/log/binary_log mysql> system chown -...expire_logs_days=10 重启mysql systemctl restart mysqld 3、查看mysql是否设置成功 [root@kkk log]# ls
py-mysql-es mysql binlog同步到...expire_logs_days = 10 max_binlog_size = 100M binlog-format = row MySQL用户权限 CREATE USER es IDENTIFIED BY 'es'; GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT
binlog是二进制日志文件,用于记录mysql的数据变更,数据在恢复的时候binlog日志能起到很大的作用。mysql的主从复制就是...expire_logs_days = 30 4、重启mysql服务 systemctl restart mysqld 5、再次使用命令sho
安装 $ sudo apt-get install python-...expire_logs_days = 10 max_binlog_size = 100M binlog-format = row #例子 mysql > create database contact ; mysql > use contact ; mysql > create table contacti
环境:PC:ubuntu 10.10 192.168.1.112(master) 192.168.10.245(slave) MySQL : 5.1.49-1ubuntu8.1-... #master 同步设置 server-id = 1 log_bin = /var/log/mysql/mysql-test-bin.log expire_logs_days =
现在就分享下自己的经历: 首先的问题是配置master的my.cnf,按部就班的配置 代码如下:server-id = 1 log_bin =mysql-bin #log_bin = /var/log/mysql/mysql-bin.log expire_logs_days = 10 max_binlog_size...
Minecraft Italia server-info.yml更新...您甚至可以通过写入expire_logs_days=10来指定自动到期日期。然后,您需要打开.env文件,并填写luckperms数据库信息。最后,您需要通过填写员工角色来编辑app.js文件中的groups
expire_logs_days = 30 #超过30天的binlog删除 slow_query_log = 1 long_query_time = 1 #慢查询时间 超过1秒则为慢查询 slow_query_log_file = /home/mysql/data/mysql-slow.log performance_schema = 0 explicit_...
* expire-logs-days:日志文件过期时间,以天为单位 * query-cache-size:指定MySql查询缓冲区的大小 * query-cache-type:用于控制缓存的类型,必须设置为数字,0:禁用,1:缓存所有结果,2:只缓存指定需要缓存的...
否则mysq-bin.index错乱,最终导致后期expire-log-days配置项失效。 1、查看binlog日志 mysql> show binary logs; 2、删除某个日志文件之前的所有日志文件 purge binary logs to 'mysql-bin.000035'; 3、清理...