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几秒。

参考链接:

mysql expire_mysql expire_logs_days是怎么生效的相关推荐

  1. mysql expire_mysql expire_logs_days是怎么生效和计算出来的

    mysql主备复制是通过binlog完成的.在开启binlog的情况下,expire_logs_days参数可以让mysql自动清理若干天前的binlog. 那么expire_logs_days是在什 ...

  2. mysql字段默认值不生效的问题解决(上)

    mysql字段默认值不生效的问题解决(上) 参考文章: (1)mysql字段默认值不生效的问题解决(上) (2)https://www.cnblogs.com/yuhuameng/p/10703931 ...

  3. mysql 8 expire_logs_days 废弃 启用binlog_expire_logs_seconds设置binlog自动清除日志时间 阿里云RDS暂时不支持

    查看binlog日志相关配置信息 -- 查看binlog日志 show binary logs; -- mysql系统配置中查找 时效 相关配置  show variables like '%expi ...

  4. mysql通过参数文件启动_mysql启动的时参数文件中的[mysql]下的参数没有生效

    my.cnf下的参数如下 [mysqld] 此处省略..... [mysql] #no-auto-rehash prompt='\u@\h:\p\d mysql>' #max_allowed_p ...

  5. mysql 多列索引的生效规则

    mysql中 myisam,innodb默认使用的是 Btree索引,至于btree的数据结构是怎样的都不重要, 只需要知道结果,既然是索引那这个数据结构最后是排好序:就像新华字典他的目录就是按照a, ...

  6. swoole mysql 无法查询_swoole websocket服务进行mysql断线重连不生效的问题

    代码结构大致是这样的: class server { private $server; private $conn = null; public function __construct() { if ...

  7. linux mysql 数据目录迁移后不生效_mysql 本地数据目录迁移

    需求:mysql的原目录没空间了,需要在本机中迁移mysql目录 mkdir -p /home/mysql3306/data mkdir -p /home/mysql3306/log mkdir -p ...

  8. mysql多列索引不全用,MySQL多列索引的生效规则

    (0) select * from mytable where a=3 and b=5 and c=4; abc三个索引都在where条件里面用到了,而且都发挥了作用 (1) select * fro ...

  9. mysql测试spring事务是否生效

    同时对三张表进行插入操作,事务保证完整性.下面进行简单测试: 1. 锁定表 锁定用户表 LOCK TABLES user WRITE; 查看表是否锁定: show OPEN TABLES where ...

最新文章

  1. 极客Web前端开发资源大荟萃#007
  2. opencv 计时 帧率
  3. mysql workbench入门_5分钟入门MySQL Workbench
  4. Linux下做一个arp欺骗程序6,LINUX下防ARP欺骗攻击
  5. java实现时钟方法汇总
  6. 万年历c语言设计报告,C语言实训题目设计报告 万年历
  7. WordPress内核站群全自动新闻采集发布源码,单站专用
  8. c 判断文件是否存在_C++基础:判断文件是否存在的方法
  9. 四轮驱动机器人(SSMR)的运动规律
  10. apache poi excel显示 base64 图片_java操作Excel一:POI
  11. MS CRM 2011汇总更新5发布
  12. 第三天 二列和三列布局
  13. php往pdf模板添加数据,php实现往pdf中加数字签名操作示例【附源码下载】
  14. 大数据培训(第一季) java基础-徐培成-专题视频课程
  15. Android手机打开开发者模式调试App
  16. 2023齐齐哈尔大学计算机考研信息汇总
  17. [5] Word 手把手教你写毕业论文-2
  18. STM32CubeMX学习笔记(38)——FSMC接口使用(TFT-LCD屏显示)
  19. [021] Android应用“易查查”上线推广,请同行多多指教、多多支持
  20. Unix/Linux下的Curses库开发指南——第一章 Curses库开发简介

热门文章

  1. 什么是统一身份认证?
  2. iPhone 11 Pro 的拍照好在哪?这是专业摄影师给出的答案
  3. 太阳表面的重力加速度
  4. 5分钟就能做一个Excel动态图表,你确定不学学?
  5. stm32延时us寄存器_自己写一个STM32 HAL库的US微秒延时函数
  6. matlab 工具箱 径向基,径向基(matlab工具箱)
  7. 【leetcode.179】最大数
  8. 分不清?企业征信报告Or企业信用评级报告,差别大了去了!
  9. 青梅酒太多不知该怎么选?记得你爱吃 的口味就可以
  10. 实验吧-隐写术-FIVE1