`

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

 

 

 

参考链接:

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

http://www.mysqlinfo.com/2011/11/15/expire_logs_days%E8%AF%A5%E5%8F%82%E6%95%B0%E7%9A%84%E7%90%86%E8%A7%A3/

 

 

 

 

分享到:
评论

相关推荐

    MySQL bin-log 日志清理方式

    自动清理方法可以通过修改配置文件和在 MySQL 内设置参数来实现,例如设置 expire_logs_days 参数来指定日志保留的天数。手动清理方法可以通过执行 PURGE 命令来清理指定的bin-log 文件或清理某个时间点之前的所有...

    mysql删除日志方法.docx

    可以在 MySQL 的配置文件 `my.cnf` 或 `my.ini` 中设置 `expire_logs_days` 参数,从而实现自动清理日志文件的功能。 ```ini [mysqld] expire_logs_days = 60 ``` **总结**: 以上四种方法都可以有效地帮助清理 ...

    mysql 正确清理binlog日志的两种方法.docx

    - 重新启动MySQL服务后,需再次检查并设置`expire_logs_days`参数,以确保设置生效。 #### 结论 通过以上两种方法,我们可以有效地管理MySQL中的Binlog日志文件,既保持了必要的日志数据以备不时之需,又避免了...

    mysql binlog日志恢复【亲测有效,有例子实测】

    server_id配置用于区分不同服务器,log_bin参数定义了binlog的开启与文件名,expire_logs_days设置binlog文件的自动清理策略,max_binlog_size则是单个binlog文件的最大大小。 2. **数据恢复**:当发生数据丢失或...

    MySQL – binlog日志简介及设置

    expire_logs_days = 7 max_binlog_size = 100m binlog_cache_size = 4m max_binlog_cache_size = 512m ``` 这些配置分别设置了日志格式、日志路径、日志清理时间、单个日志文件的最大大小、binlog缓存大小和最大...

    mysql日志清理手册

    - **2.2.2 通过脚本定时清理**:除了设置自动过期,还可以编写定时任务脚本来定期清理binlog,这在某些不支持`expire_logs_days`或需要更灵活清理策略的旧版本MySQL中是必要的。 3. **Relaylog 日志清理** - **...

    mysql 数据库双机热备

    - **expire_logs_days**:设置二进制日志的过期时间。 - **slave_skip_errors**:设置在复制过程中遇到错误时的处理方式。 - **relay_log**:中继日志文件名。 - **log_slave_updates**:启用此选项可使从服务器在...

    MySQL启用二进制日志

    1、创建存储mysql二进制日志目录 mysql&gt; system mkdir -p /app/mysql/log/binary_log mysql&gt; system chown -...expire_logs_days=10 重启mysql systemctl restart mysqld 3、查看mysql是否设置成功 [root@kkk log]# ls

    py-mysql-es:mysql binlog到es

    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

    mysql-redis-sync-utility:MySQL 到 Redis 缓存同步实用程序

    安装 $ sudo apt-get install python-...expire_logs_days = 10 max_binlog_size = 100M binlog-format = row #例子 mysql &gt; create database contact ; mysql &gt; use contact ; mysql &gt; create table contacti

    mysql主从配置.docx

    3. **日志清理**:配置`expire_logs_days=7`,自动清理7天前的日志,以控制磁盘空间的使用。 4. **验证配置**:重启MySQL服务(`service mysqld restart`)后,使用`show variables like '%server_id%'`和`show ...

    mysql 增量备份/全量备份脚本

    expire_logs_days = 10 ``` 然后,你可以使用mysqlbinlog工具来获取增量数据,并将其合并到全量备份中。在Windows中,可以创建一个名为"增量备份.bat"的批处理文件: ```batch @echo off set MYSQL_USER=root set ...

    mysql性能调优参数

    1. Expire_logs_days:这个参数确定超过 30 天的 binlog 删除。 2. Binlog_cache_size:这个参数确定一个事务,在没有提交的时候,产生的日志,记录到 Cache 中,默认 binlog_cache_size 大小 32K。 其他参数 1. ...

    Debian系统下MySQL主从同步复制

    expire_logs_days = 10 max_binlog_size = 100M binlog_do_db = testdb #需要同步的数据库 binlog_ignore_db = mysql #不需同步的数据库 ``` - **重启MySQL服务**:使配置生效。 ```bash # /etc/init.d/mysql ...

    windows下mysql双机热备.doc

    * 在服务器A和服务器B上分别修改配置文件my.ini,添加server-id、log-bin、sync_binlog、binlog_format、auto_increment_increment、auto_increment_offset、max_binlog_size、expire_logs_days、binlog_do_db、...

    CentOS5.5_MySql_5.1.49的安装、优化及安全设置

    - `expire_logs_days`:过期日志天数。 - **性能监控**: - `slow_query_log`:开启慢查询日志。 - `long_query_time`:慢查询时间阈值。 - `general_log`:通用日志记录。 ##### 2. 安全设置 - **更改 root ...

    mysql根据日志恢复数据详细步骤

    - `expire_logs_days`:设置日志的过期天数,超过该天数的日志会被自动删除。 ```ini expire_logs_days=3 ``` - 这意味着系统只会保留最近3天的日志文件。 #### 三、案例分析:数据丢失后的恢复流程 假设在7月...

    linux-MySQL安装

    5. `expire_logs_days`: 设置二进制日志的保留天数,避免日志文件占用过多磁盘空间。 编辑`my.cnf`文件后,需要重启MySQL服务使更改生效: ```bash sudo systemctl restart mysqld ``` 除了基本安装和配置外,还...

    MySQL错误日志:数据库故障诊断的指南针

    expire_logs_days = 7 max_binlog_size = 100M ``` 5. **监控和分析日志**:一旦配置好错误日志,就需要定期检查和分析日志文件,以确保数据库的正常运行。可以利用专门的工具如 Logstash、Elasticsearch 和 ...

Global site tag (gtag.js) - Google Analytics