背景

线上有一套数据库业务迁移走一段时间,过了一周业务又接入进来,运行几分钟后突然出现数据库10秒左右无法写入,上去排查发现此时出现了几百G binlog的过期删除

线上环境

mysql_version:oracle mysql-5.7.17

expire_logs_days = 5

max_binlog_size = 1G

疑问

1.binlog在什么时候会进行过期清理清理

2.为什么删除大量binlog期间会出现夯死数据库

3.如何避免binlog突然大量过期,在清理时影响线上业务

疑问1分析(binlog在什么时候会进行过期清理清理)

1.重启数据库实例

2.flush binary logs或者flush logs

3.组提交过程中检查binlog文件大小是否 >= 设置的max_binlog_size

疑问2分析(为什么binlog过期期间会夯死数据库)

以下为简化版代码:

MYSQL_BIN_LOG::rotate_and_purge

mysql_mutex_lock(&LOCK_log); /*持锁期间不可写入*/

error= rotate(force_rotate, &check_purge);

mysql_mutex_unlock(&LOCK_log);

purge(); /*如果需要则执行purge*/

if (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, true);

mysql_mutex_lock(&LOCK_index);

while (strcmp(log_file_name, log_info.log_file_name))

if (stat_area.st_mtime < purge_time) /*stat_area.st_mtime为文件mtime*/

no_of_log_files_purged++ /*获取需要purged的所有log*/

purge_logs

error=remove_logs_from_index(&log_info, need_update_threads) /*先将要删除的binlog从binlogindex中删除*/

global_sid_lock->wrlock(); /*持锁期间不可写入*/

error= init_gtid_sets(xxxx /*收集gtid,更新gtid_purged*/

global_sid_lock->unlock();

error_index= purge_index_entry(thd, decrease_log_space, false/*need_lock_index=false*/))

for (;;)

if (!mysql_file_delete(key_file_binlog, log_info.log_file_name, MYF(0))) /*删除binlogfile,如果积累很多binlog很容会占用大量的磁盘io,虽然此时可以写入但是也会影响业务*/

mysql_mutex_unlock(&LOCK_index);

概括:

1)在日志切换期间需要获取全局mutex,此时数据库无法写入

2)收集所有要清理binlog文件中的gtid,并维护到gtid_purged,期间无法写入

3)删除binlog文件操作涉及到剧烈io波动,如果文件数很多,需要花费较长的时间,此时会影响业务的响应时间

疑问3分析(如何避免binlog突然大量过期,在清理时影响线上业务)

思路:从疑问1了解binlog过期删除必须满足这三个触发点的任意一个,否则不会进行过期清理,MySQL这种实现方式有待于优化,对于目前这种情况可以通过以下2种方式实现:

1.DBA手动检查过期binlog,如果过期就删除(flush/purge)

2.更改mysql代码,增加其定时器实现检查binlog expire逻辑及使用

if (DBUG_EVALUATE_IF("force_rotate", 1, 0) || (do_rotate && thd->commit_error == THD::CE_NONE))

{

DEBUG_SYNC(thd, "ready_to_do_rotation");

bool check_purge= false;

mysql_mutex_lock(&LOCK_log);

int error= rotate(false, &check_purge);

mysql_mutex_unlock(&LOCK_log);

if (error)

thd->commit_error= THD::CE_COMMIT_ERROR;

else if (check_purge)

purge();

} else{

/*add gaochao all else,only check purge not rotate; */

if (((my_time(0) - gaochao_expire_binlog_reset_check_time) > opt_nucc_binlog_expire_check_interval) && (opt_nucc_binlog_expire_check_interval != 0)){

purge();

gaochao_expire_binlog_reset_check_time= my_time(0);

}

}

# nucc_binlog_expire_check_interval为0表示不启用该功能,否则为间隔检查时间

mysql> show variables like '%nucc%';

+-----------------------------------+-------+

| Variable_name | Value |

+-----------------------------------+-------+

| nucc_binlog_expire_check_interval | 0 |

+-----------------------------------+-------+

mysql> set global nucc_binlog_expire_check_interval=600;

Query OK, 0 rows affected (0.00 sec)

mysql> show global variables like '%nucc%';

+-----------------------------------+-------+

| Variable_name | Value |

+-----------------------------------+-------+

| nucc_binlog_expire_check_interval | 600 |

+-----------------------------------+-------+

1 row in set (0.01 sec)

mysql>

mysql binlog 过期_mysql清理过期binlog堵塞数据库相关推荐

  1. mysql bin-log作用_MySQL中的binlog的作用是什么?

    前言 MySQL中有六种日志文件,其中二进制日志也与事务操作有一定的关系,对理解MySQL中的事务操作有着重要的意义. 二进制日志(binlog): 作用: 1,用于复制,在主从复制中,从库利用主库上 ...

  2. mysql binlog 权限_MySQL如何开启binlog?binlog三种模式的分析

    前提,创建表t,并插入数据,语句如下: CREATE TABLE `t` ( `id` int(11) NOT NULL, `a` int(11) DEFAULT NULL, `t_modified` ...

  3. mysql public权限_MySQL · 引擎特性 · Binlog encryption 浅析

    背景介绍 为了保障数据安全,MySQL 在 5.7 版本就支持了 InnoDB 表空间加密,之前写了一篇月报介绍过,参考InnoDB 表空间加密.文章开头也提到过,MariaDB 除了对表空间加密,也 ...

  4. mysql修改binlog 位置_mysql修改/切换binlog存储位置以及重置mysql-bin的index

    修改mysql中binlog的位置可以方便日志的管理与清除,需要修改mysql的my.cnf配置文件,不同的环境配置文件不同,我的mariadb配置文件为/etc/mysql/mariadb.conf ...

  5. binlog日志_MySQL三大日志binlog、redo log和undo log

    点击蓝色"JavaKeeper"关注我哟 加个"星标",一起成长,做牛逼闪闪的技术人 Keeper导读:日志是mysql数据库的重要组成部分,记录着数据库运行期 ...

  6. mysql 迭代更新_MySQL、MongoDB、Redis 数据库之间的区别与使用(本章迭代更新)

    MySQL.MongoDB.Redis 数据库之间的区别与使用 MySQL.MongoDB.Redis 数据库之间的区别与使用(本章迭代更新) update:2019年2月20日 15:21:19(本 ...

  7. mysql简单概述_MySQL入门很简单: 1 数据库概述

    1. 数据库概述 1.1 数据存储方式: 1)人工管理阶段 2)文件系统阶段: 文件系统通过文件的存储路径和文件名称访问文件中的数据 3)数据库系统阶段:Oracle, SQL Server, MyS ...

  8. 倒出mysql库命令行_mysql命令行导入导出数据库

    导出: 1.在命令行里,进入mysql安装根目录下的bin目录下 比如:D:\Program Files\MySQL\MySQL Server 5.0\bin 输入 mysqldump -uroot ...

  9. mysql定时导入_MySQL导入、导出、数据库定时备份

    本篇使用的MySQL版本是5.7.30,注意不同版本之间可能会有差异. 一.导出操作 1.查找mysqldump命令位置 which mysqldump 2.mysqldump导出示例 用户名和密码分 ...

最新文章

  1. 找对业务G点, 体验酸爽 - PostgreSQL内核扩展指南
  2. 百分点首席经济学家张忠解读《美国白宫大数据白皮书》
  3. 成功解决Cannot find declaration to go to
  4. rust(58)-凯撒密码
  5. junit可执行但控制层无法执行_Junit测试时ContextLoader.getCurrentWebApplicationContext()返回空值...
  6. Python全栈开发记录_第三篇(linux(ubuntu)的操作)
  7. Vue强制绑定class和style_使用字符串_对象_素组的方式实现强制绑定---vue工作笔记0007
  8. Moon一个无视Linq,无视实体类的设计思路.(不要错过,看了之后, 让我们从此以后不再羡慕linq to entiy!)...
  9. 有什么可以测试耳机性能的软件吗,什么是耳机音质测试软件?
  10. 日骗上百的淘宝网赚项目骗局
  11. 微博程序猿结婚还要加班!只因鹿晗公布恋情
  12. python对数正态分布函数_python中的对数正态分布
  13. 单细胞三大R包之Seurat
  14. Service的工作过程
  15. python实现图像识别水果_使用Python实现基于图像识别的iOS自动化测试
  16. cocos2d-之音乐背景播放
  17. 【加拿大签证】加拿大政府指定的签证办理中国体检医院一览【2019官方最新版,加拿大签证体检必看】
  18. iframe中加入html,HTML中IFRAME标签的使用
  19. 国外问卷调查详细讲解
  20. 互联网金融数据分析体系

热门文章

  1. Linux里常见术语的缩写
  2. zabbix 调用api 批量删除主机
  3. ES | CentOS下基于ElasticSearch的head插件安装
  4. “服务器发送了一个意外的数据包。received:3,expected:20“问题的解决方法
  5. 使用fail2ban防止暴力破解ssh及vsftpd密码
  6. 在Linux系统下更改或更新SSH密钥密码的方法
  7. 在ubuntu中安装PhantomJS
  8. Ubuntu16.04几分钟自动断网问题
  9. java 字节编码_java中字符与字节的编码关系
  10. 【PostgreSQL-9.6.3】创建、修改、删除PostgreSQL数据库