MySQL数据延迟跳动的问题解决

今天分析了另外一个关于数据库延迟跳动的问题,也算是比较典型,这个过程中也有一些分析问题的方法和技巧工参考。

首先在高可用检测中,有一套环境的检测时断时续,经过排查发现是数据库产生了延迟,在登录到从库show slave status查看,会发现Seconds_behind_master的值是不断跳动的,即从0~39~0~39这样的频率不断跳动,让人很搓火。

查看数据库的相关日志发现竟然没有任何可以参考的日志记录,怎么分析这个问题呢,我们先来复现,于是我按照节奏抓取了3次问题出现的日志,即通过show slave status连续监测,抓取show slave status输出的结果保存下来,这样我们就得到了一个问题发生过程中的偏移量变化,而这个变化则是在SQLThread在回放过程中产生的问题。

比如下面的一段输出,我截取的是Slave端的relay log进行分析,相应的字段为Relay_Log_Pos

Slave_IO_State: Waiting for master to send event
         Master_Host: xxxx
         Master_User: dba_repl
         Master_Port: 4306
        Connect_Retry: 60
       Master_Log_File: mysqlbin.000044
     Read_Master_Log_Pos: 386125369
        Relay_Log_File: slave-relay-bin.000066
        Relay_Log_Pos: 386125580
    Relay_Master_Log_File: mysqlbin.000044

所以很快得到了偏移量的变化情况:385983806 ,386062813 ,386125580

接着我使用mysqlbinlog开始分析这些日志过程中的明细,根据如下的命令可以很快得到转储的日志中相关的表有3张。

# grep INSERT relaylog_xxxx.dump |awk '{print $3 " " $4}'|sed 's/INTO//g'|sort|uniq
 act_action_exec_info
 act_join_desc
 dic_subsidy_marketing_querylog_202008

我逐步分析了每张表的数据操作情况,得到的信息还是比较有限,继续做更进一步的分析,比如我们分析一下整个日志中的事务量大小:

# mysqlbinlog slave-relay-bin.000066 | grep "GTID$(printf '\t')last_committed" -B 1 \
>                   | grep -E '^# at' | awk '{print $3}' \
>                   | awk 'NR==1 {tmp=$1} NR>1 {print ($1-tmp);tmp=$1}' \
>                   | sort -n -r | head -n 100
mysqlbinlog: [Warning] unknown variable 'loose-default-character-set=utf8'
5278
5268
5268
5268
5253
5253
5253
5253
5253

可以看到是5K左右,算是比较大了,而这些额外的信息从哪里获得呢,我在主库开启了general_log,这样就能够得到更细粒度的操作日志了。

进一步分析发现,整个业务使用了显示事务的方式:SET autocommit=0,整个事务中包含了几个大SQL,里面存储了很多操作日志明细,而且在事务操作过程中还基于Mybatis框架调用了多次select count(1) from xxx的操作。

经过和业务沟通也基本明确了以上问题。

以上就是MySQL数据延迟跳动的问题解决的详细内容,更多关于MySQL数据延迟跳动的资料请关注我们其它相关文章!

(0)

相关推荐

  • 如何解决mysql无法关闭的问题

    mysql关闭不了的解决办法: 右键点击电脑的任务栏,打开任务管理器 点击服务,找到mysql服务 右键点击该服务,选择停止就可以了 内容扩展: mac系统mysqld进程无法kill掉的问题 mac安装比linux恶心的太多,权限太受限制 kill -9根本无法杀死mysqld进程,查了好久原来是因为 LaunchDeamons定时任务守护mysqld进程 解决方法: sudo launchctl unload -w /Library/LaunchDaemons/com.oracle.oss.

  • 如何解决mysql insert乱码的问题

    问题介绍: 在mysql中插入中文乱码,或mysql中中文正常显示,但jsp在前台显示mysql中的中文时乱码. 解决方法: 进入mysql控制台,执行下面的命令即可: SET character_set_client='utf8'; SET character_set_connection='utf8'; SET character_set_results='utf8'; 更多解决办法: client 为客户端使用的字符集. connection 为连接数据库的字符集设置类型,如果程序没有指明

  • MySQL 5.7.30 安装与升级问题详细教程

    楔子 由于之前电脑上安装的MySQL版本是比较老的了,大概是5.1的版本,不支持JSON字段功能.而最新开发部门开发的的编辑器产品,使用到了JSON字段的功能. 因此需要升级MySQL版本,升级的目标版本是MySQL 5.7.30(虽然最新版本已经到8.x,但是5.7基本够用了). 发现在升级安装过程中,会有一些坑,所以使用本文记录一下. 卸载老版本 首先需要卸载老的版本,卸载其实也挺简单,只需要移除MySQL服务即可,首先打开CMD,然后cd到MySQL的bin目录,然后输入下面的命令移除My

  • 快速解决mysql导出scv文件乱码、蹿行的问题

    工作原因,常常不能实现完全的线上化(即,所有数据都在线上完成,不需要导入导出),而导出Excel常常比修炼成仙还慢,因此,我们将数据库文件导出到本地使用的时候,常常使用的方法的是导成CSV格式. 而csv格式的也常常出现导出的中文乱码,或者蹿行等问题,从而陷入两难境地.老板要数据,你却导不出来,急死人了. 1.问题:我们原本要把如左图所示的数据库中的数据导出成他原本的样子,无奈成了右边的乱七八糟的东西: 2.解决: a:原本怎么导出为csv的还是怎么导: b:选中你导出的csv文件,右键选择打开

  • 解决MySQL数据库意外崩溃导致表数据文件损坏无法启动的问题

    问题故障: MySQL数据库意外崩溃,一直无法启动数据库. 报错日志: 启动报错:service mysqld restart ERROR! MySQL server PID file could not be found! Starting MySQL. ERROR! The server quit without updating PID file (/www/wdlinux/mysql/var/iZ2358oz5deZ.pid). 数据库error日志: 200719 22:07:43 I

  • 浅谈mysql导出表数据到excel关于datetime的格式问题

    最近用mysql导出表数据到excel文件,mysql中的datetime类型导出到excel(excel2016)中被excel识别成它自己默认的日期格式了,在mysql中的格式形如 yyyy-mm-dd hh:mm:ss,到了excel变成了 yyyy/m/d h:mm,看起来不太习惯,当然可以通过设置excel单元格格式改成自定义格式 yyyy-mm-dd hh:mm:ss,但是这样多了一个步骤,能不能直接从mysql导出到excel的就是mysql显示的样式呢?当然可以. 开始猜想是由于

  • Docker的MySQL容器时区问题修改

    前言 阿航在开发Springboot项目时, 前端告诉验证码一直无效. 本地测试没有问题, 一看远程服务器的数据库时间, 哇塞–早了8小时. 很明显, 是MySQL的时区问题. 本篇文章就来记录下如何修改Docker 的 MySQL 容器时区. 解决方案 先来校验下数据库是否真的时区不对. 进入MySQL数据库, 运行语句: SELECT NOW(); 会返回类似这样的数据: mysql> SELECT NOW(); +---------------------+ | NOW() | +----

  • 快速解决mysql导数据时,格式不对、导入慢、丢数据的问题

    如果希望一劳永逸的解决慢的问题,不妨把你的mysql升级到mysql8.0吧,mysql8.0默认的字符集已经从latin1改为utf8mb4,因此现在UTF8的速度要快得多,在特定查询时速度提高了1800%! 但是如果时间等不及,就先用下面的办法快速解决一下. 问题一:格式不对(常出现时间格式不对的情况): 方法1:将excel文件另存为csv,再导入数据库: 方法2:导入的第一步时,默认编码方式是65001(UTF-8),可以尝试选择[10008 (MAC - Simplified Chin

  • pyMySQL SQL语句传参问题,单个参数或多个参数说明

    在用pymysql操作数据库的过程中,给sql语句传参碰到了很多问题,网上传参策略很多,这里推荐两种 单个传参用%s,写起来比较简单: field = '-' sql_talk="UPDATE cnp.Test set a='' where b='%s'" cursor.execute(sql_talk % field) db.commit() 多个传参用{0}占位符: field = '-' a = 'code' sql_talk="UPDATE cnp.Test set

  • 一文解决django 2.2与mysql兼容性问题

    Django是一个开放源代码的Web应用框架,由Python写成.采用了MTV的框架模式,即模型M,视图V和模版T.它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的,即是CMS(内容管理系统)软件.并于2005年7月在BSD许可证下发布.这套框架是以比利时的吉普赛爵士吉他手Django Reinhardt来命名的.2019年12月2日,Django 3. 0发布  . 背景 Django是一个优秀的Python web框架,在使用Django2.2版本配置MySQL数据库时

随机推荐