mysql expire_mysql expire_logs_days是怎么生效的
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是怎么生效的相关推荐
- mysql expire_mysql expire_logs_days是怎么生效和计算出来的
mysql主备复制是通过binlog完成的.在开启binlog的情况下,expire_logs_days参数可以让mysql自动清理若干天前的binlog. 那么expire_logs_days是在什 ...
- mysql字段默认值不生效的问题解决(上)
mysql字段默认值不生效的问题解决(上) 参考文章: (1)mysql字段默认值不生效的问题解决(上) (2)https://www.cnblogs.com/yuhuameng/p/10703931 ...
- mysql 8 expire_logs_days 废弃 启用binlog_expire_logs_seconds设置binlog自动清除日志时间 阿里云RDS暂时不支持
查看binlog日志相关配置信息 -- 查看binlog日志 show binary logs; -- mysql系统配置中查找 时效 相关配置 show variables like '%expi ...
- mysql通过参数文件启动_mysql启动的时参数文件中的[mysql]下的参数没有生效
my.cnf下的参数如下 [mysqld] 此处省略..... [mysql] #no-auto-rehash prompt='\u@\h:\p\d mysql>' #max_allowed_p ...
- mysql 多列索引的生效规则
mysql中 myisam,innodb默认使用的是 Btree索引,至于btree的数据结构是怎样的都不重要, 只需要知道结果,既然是索引那这个数据结构最后是排好序:就像新华字典他的目录就是按照a, ...
- swoole mysql 无法查询_swoole websocket服务进行mysql断线重连不生效的问题
代码结构大致是这样的: class server { private $server; private $conn = null; public function __construct() { if ...
- linux mysql 数据目录迁移后不生效_mysql 本地数据目录迁移
需求:mysql的原目录没空间了,需要在本机中迁移mysql目录 mkdir -p /home/mysql3306/data mkdir -p /home/mysql3306/log mkdir -p ...
- mysql多列索引不全用,MySQL多列索引的生效规则
(0) select * from mytable where a=3 and b=5 and c=4; abc三个索引都在where条件里面用到了,而且都发挥了作用 (1) select * fro ...
- mysql测试spring事务是否生效
同时对三张表进行插入操作,事务保证完整性.下面进行简单测试: 1. 锁定表 锁定用户表 LOCK TABLES user WRITE; 查看表是否锁定: show OPEN TABLES where ...
最新文章
- 极客Web前端开发资源大荟萃#007
- opencv 计时 帧率
- mysql workbench入门_5分钟入门MySQL Workbench
- Linux下做一个arp欺骗程序6,LINUX下防ARP欺骗攻击
- java实现时钟方法汇总
- 万年历c语言设计报告,C语言实训题目设计报告 万年历
- WordPress内核站群全自动新闻采集发布源码,单站专用
- c 判断文件是否存在_C++基础:判断文件是否存在的方法
- 四轮驱动机器人(SSMR)的运动规律
- apache poi excel显示 base64 图片_java操作Excel一:POI
- MS CRM 2011汇总更新5发布
- 第三天 二列和三列布局
- php往pdf模板添加数据,php实现往pdf中加数字签名操作示例【附源码下载】
- 大数据培训(第一季) java基础-徐培成-专题视频课程
- Android手机打开开发者模式调试App
- 2023齐齐哈尔大学计算机考研信息汇总
- [5] Word 手把手教你写毕业论文-2
- STM32CubeMX学习笔记(38)——FSMC接口使用(TFT-LCD屏显示)
- [021] Android应用“易查查”上线推广,请同行多多指教、多多支持
- Unix/Linux下的Curses库开发指南——第一章 Curses库开发简介