我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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 )))  

    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)))  

...  

  }  

...  

   

  if ((error=update_log_index(&log_info, need_update_threads)))  

...  

   

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


注意:

expire_logs_days设置之后不会立即清除,触发条件是:

binlog大小超过max_binlog_size

手动执行flush logs

重新启动时


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

win10的计算器怎么调出来

这篇“win10的计算器怎么调出来”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“win10的计算器怎么调出来”文章吧。win
2023-06-30

腾讯云服务器价格计算方法是什么呢怎么算出来的

腾讯云是中国最大的云计算服务提供商之一,提供了高性能的云计算平台和丰富的云计算解决方案,为企业和个人用户提供可靠的云计算服务。在腾讯云上,您可以轻松部署自己的应用程序,实现云端数据存储、数据迁移和应用程序运行等功能。腾讯云的价格计算方法主要包括以下几个方面:服务器配置和容量:根据您的应用程序和需要的硬件配置,腾讯云会为
腾讯云服务器价格计算方法是什么呢怎么算出来的
2023-10-28

未来车企的生存核心是什么?计算力=竞争力

随着工业4.0的到来,各大汽车厂商也面临着前所未有的挑战。面对业绩增长、成本、行业新进入者挑战的压力,各汽车制造厂商们纷纷借助CAE仿真技术提升核心竞争力,CAE仿真技术已成为汽车被动安全性研究的有利工具。这项技术不仅可以实现设计过程早期反
2023-06-04

Windows 10优秀壁纸是怎么设计出来的?

每代Windows版本都android带来了全新的默认桌面壁纸,意味着和数百万用户朝夕相对。微软素来注重图片的卓越品质,尤其是系统壁纸。编程客栈在今天Windows官方频道更新的视频中,微软带我们领略了Windows 10壁javascri
2023-06-16

云服务器税率是多少啊怎么算出来的呢

云服务器税率是指一个服务商收取的云服务器费用与其实际支付费用之间的比率。具体情况因不同的国家和地区而异,但是一般来说,税率在3.5%到15%之间。计算税率需要考虑许多因素,例如服务商的规模、收入水平、纳税义务人的税务身份、服务合同的性质以及提供服务的地理位置等。一般来说,服务商需要根据这些因素为他们的云服务器缴纳税款。需要注意的是,如果您不确定您的云服务器税率,您可以咨询您的税务顾问或者通过
2023-10-26

云服务器的租用价格是多少啊怎么算出来的

云服务器的租用价格因云计算平台和服务的不同而异,但通常包括以下几个因素:容量和可用性:容量是云计算平台提供服务和存储数据的限制条件。可用性是云计算平台能否提供稳定、可靠的服务,包括故障转移、快照和恢复等功能。价格:云服务器的价格因服务提供商的不同而异,如微软Azure和谷歌云等。服务提供商:不同云计算平台的服务提供商可能会提供不同的价格,包括但不限于机器资源、带宽、存储空间等,而且也会根
2023-10-26

计算机中输入和输出设备是用来存储程序及数据的装置吗

这篇文章主要介绍计算机中输入和输出设备是用来存储程序及数据的装置吗,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!输入和输出设备不是用来存储程序及数据的装置,存储设备才是。输入设备是向计算机输入数据和信息的设备;输出设
2023-06-14

阿里云服务器税率是多少钱啊怎么算出来的

为了计算阿里云服务器的税款,我们需要先了解一些税收方面的知识。根据我国的税收政策,税收是按照企业的销售额或收入计算的,一般来说是以企业的年收入或营业额为基础。因此,阿里云的税率就是阿里云上销售的云服务器所需缴纳的税款金额。一般来说,阿里云的税率是由多种因素影响的,例如税率的计算方法、税率的适用范围、税率的调整方式等等。
阿里云服务器税率是多少钱啊怎么算出来的
2023-10-28

云服务器的租用价格是多少钱啊怎么算出来的

云服务器的租用价格可以根据许多因素确定,以下是一个简单的计算公式:租用价格=月租费+维护费+升级费+带宽使用费+保险费用+停机费=月租费+维护费+升级费+带宽使用费+保险费用+停机费如果您提供的是虚拟主机,则还应计算带宽使用费。带宽使用费通常是指您使用专线连接互联网所需的费用。例如,如果您租用一个带宽为2M的虚拟主机,则带宽使用费为2*3=6M。如果您使用其他类型的服务,如专线连接到互联网,
2023-10-26

云服务器的租用价格是多少啊怎么算出来的呢

云服务器的租用价格可以根据您使用的虚拟主机(VPS)数量、带宽和存储等资源成本、维护费用、人力等成本以及其他运营费用等方面决定。在计算云服务器租用价格时,以下是计算公式:租用价格=租用虚拟主机(VPS)数量*每月租用虚拟主机(VPS)带宽及存储空间等资源成本(含服务器硬件成本、带宽、存储等)例如,如果您使用一个VPS,您的云服务器租用价格为:租用成本=(每个VPS的月租用成本)每月租用带
2023-10-26

阿里云服务器税率是多少钱啊怎么算出来的呢

首先,让我们了解阿里云服务器的税率是如何计算的。税率是根据阿里云服务器的平均价格和市场需求来计算的。税率的计算方式是:税率=价格/销售数量。具体来说,阿里云服务器税率的计算公式是:税率=价格/销售数量。其中,价格是指购买阿里云服务器的价格,销售数量是指使用阿里云服务器的数量。例如,如果您购买了一个阿里云服务器,价格为1
阿里云服务器税率是多少钱啊怎么算出来的呢
2023-10-28

云服务器租用价格大概是多少钱啊怎么算出来的

下面是一些常见的云服务器租用价格计算方法,您可以根据自己的需要进行计算。按照您所租用的云服务器类型分类,例如:AmazonWebServices(AWS)、MicrosoftAzure、GoogleCloudPlatform等等。按照您所租用的云服务器大小来计算。按照您所租用的云服务器所支持的网络类型(例如:NAT网络
2023-10-27

云服务器的租用价格是多少钱啊怎么算出来的价格

云服务器的租用价格是根据用户所使用的云服务器类型、大小、配置和可用性等因素而定。一般来说,云服务器的租用价格比传统的服务器租用价格要高,因为它需要更多的人力和资源来管理和维护它。云服务器的租用价格通常包括以下几个部分:云服务器的价格和大小:云服务器的价格是由其大小和配置决定的,不同的云服务器提供商的价格也有所不同。一般
云服务器的租用价格是多少钱啊怎么算出来的价格
2023-10-28

编程热搜

目录