写点什么

分析与解决:MySQL 分区表复制 bug 导致的主从延迟

  • 2019-11-06
  • 本文字数:1792 字

    阅读完需:约 6 分钟

分析与解决:MySQL分区表复制bug导致的主从延迟

本文将以数据库实际使用中的某典型案例来分析造成主从延迟的原因。

主从延迟的原因

1、某用户在使用数据库过程中,出现主从延迟很大的情况,show slave status\G,已经差了 60 多个 binlog 了。



2、观察发现,应该是卡在一个大事物上面(Retrieved_Gtid_Set 一直在上升,但是 Executed_Gtid_Set 卡在一个点不动了),通过分析 relay_log 找到这个大事物:是对表 A 进行删除操作的一个事物。


Relay_Log_File: relay-bin.000010Relay_Log_Pos: 95133771
复制代码



看到这里,感觉又是一例在 ROW 模式下表没有主键,引起的主从延迟。看看表结构确认一下,发现这张表不小,字段有上百个,有主键,且是一张分区表,分区很多。这就有意思了!并不是我们碰到过多次的由于 ROW 模式下没有主键,DML 引起的主从延迟(PS:为什么这种情况下会引起延迟?而是有主键,且走了二级索引,那为什么回放还会这么慢呢?)。



后来了解到用户是在存储过程里面调用 detele 语句来进行归档数据清理,看了一下存储过程,现在的问题就可以简化为:在存储过程中调用 delete 语句,走了二级索引删除有主键的分区表,从机回放延迟



这个时候,我们需要拆解一下问题,控制好变量,一个一个的查:


1、直接执行 delete,SQL 会以 statement 的格式出现,且不会产生主从延迟。




2、调用 procedure,该 delete 语句在 procedure 中执行的时候会变成 ROW 格式,且会导致延迟。


OK,有以上两个测试,我们的问题可以聚焦为:


1、为什么同样 delete 语句,直接执行和在 procedure 里面执行记录的 binlog 格式不一样(ROW 格式的 binlog 导致回放慢,全局设置在 mixed 模式下,这条 SQL 应该走的是 statement 格式,为什么在 procedure 里执行就变成了 ROW 格式,怎么样才能让这条 SQL 再 procedure 里执行变成 statement 记录到 binlog 里面)。


delete from xxxxxwhere update_datetime < DATE_ADD(B_DATE,INTERVAL -1 day)and DATE_FORMAT(update_datetime,'%i') not in ('00','05','10','15','20','25','30');
复制代码



通过 show processlist,可以看到这条 delete 在 procedure 内部执行的时候,被 MySQL 自动加上了 NAME_CONST 函数,所以导致了以 ROW 模式记录 binlog 格式。那为什么在 procedure 中会被改写成这样的 SQL 呢?怎么样才能让这条 SQL 记录为 statement 的格式呢?



看了 MySQL 官方在 procedure 里面的限制描述,MySQL 会自动加上 NAME_CONST 主要是为了从机可以识别到 B_DATE 这个 SP 的 Local vairable,不至于从机回放的时候报错


2、为什么 ROW 模式的 binlog 在从库回放的时候,即使 delete 的这张表有主键也很慢。


我们先看一下 SQL 线程回放是卡在哪里了?为什么会慢?


通过 pstack 抓取堆栈,找到 SQL_thread 线程对应的 thread 15,再结合 perf 信息,可以看到从机回放慢是卡在了 bitmap_get_next_set()。




看一下 bitmap_get_next_set()的代码。


bitmap_get_next_set()都是一些位运算,速度按理来说应该很快。所以不应该是程序卡在了这个函数中,大概率是因为多次调用了这个函数。所以我们再往上层继续看代码。



get_next_used_partition(uint part_id) 直接调用了 bitmap_get_next_set(),继续往上看。



try_semi_consistent_read() 这个函数中出现了可疑的循环,这里会调用 m_tot_parts 次 get_next_used_partition。看了一下定义 m_tot_parts 是分区表的总分区数!!!


看到这里,就真相大白了。


这个 delele 的 SQL 变更的行数大约在 300W 行左右,总共的分区表数是 7200 个。那么这里调用 bitmap_get_next_set 的次数就被放大成了 216 亿次!




对比以 statement 格式回放,从机的堆栈信息,并不会进入 bitmap_get_next_set。


解决方案

分析了这么久,怎么处理这么问题呢?


  • 方案 1:我们最后在 SP 中强制制定了 session 的 binlog_format=statement,让这条 delete 在从机以 statement 的模式回放,这样就避免触发 MySQL 中的这个 bug。

  • 方案 2:修复内核。

  • 方案 3:在 shell 里面去调度,而不使用存储过程。


作者介绍


张松坡,腾讯云数据库架构师,主要负责腾讯云数据库 MySQL、Redis 等数据库架构设计、数据库运维、运营开发等工作。曾就职于腾讯新闻、腾讯视频。


原文链接


https://mp.weixin.qq.com/s?__biz=MzI4NTA1MDEwNg==&mid=2650782428&idx=2&sn=e9c90b1eba3307a62f064c1d5967df0c&chksm=f3f90f49c48e865f138c8846f3d6cafd7a63a53ce44fc71169c1226ec5d8ed51ffaddfa2da73&scene=27#wechat_redirect


2019-11-06 08:001375

评论

发布
暂无评论
发现更多内容

搜索引擎分布式系统思考实践

得物技术

搜索引擎 分布式系统

从零开始实现一个MyBatis加解密插件

vivo互联网技术

spring mybatis

灏天农业签约旺链科技,推动中药材产业健康发展

旺链科技

区块链 产业区块链 中药材

阿里云丁宇:以领先的云原生技术,激活应用构建新范式

阿里巴巴中间件

阿里云 Serverless 容器 RocketMQ 云原生

攻击面管理:企业向主动安全转变的开始

SEAL安全

攻击技术 黑客攻击 软件供应链安全

高效的工作从取消汇报开始|敏捷实践

LigaAI

高效工作 Scrum 敏捷开发 研发团队 每日站会

面试突击76:${} 和 #{} 有什么区别?

王磊

Java 常用面试题

SpringBoot 整合 MyBatis-Plus

SpringBoot 2 Mybatis-Plus 8月月更

极盾·析策XDR,助力顶级汽车集团构建安全运营中台

极盾科技

网络安全 安全 信息安全 数据安全 xdr

【python】通用的json_diff方法

转转技术团队

测试工具

语音聊天app源码:系统功能有哪些?

开源直播系统源码

软件开发 直播系统源码 语音直播系统 语音直播

说实话,Hibernate 和 MyBatis 哪个更好用?

TimeFriends

8月月更

JS【数组合并】的性能差异对比

掘金安东尼

JavaScript 前端 8月月更

Apache顶级项目Ranger和Alluxio的最佳实践(附教程)

Alluxio

Ranger Alluxio Apache 分布式 大数据 开源 8月月更

密集计算场景下的 JNI 实战

vivo互联网技术

Java c++ 性能 JVM jni

图灵访谈 | Vue.js官方团队成员霍春阳:跨专业做程序员,是什么感受?

图灵社区

vue.js 代码人生

我想搞信息资讯聚合类产品,如何编写PHP爬虫?

智伍应用

中仑网络全站 Dubbo 2 迁移 Dubbo 3 总结

阿里巴巴中间件

阿里云 开源 云原生 dubbo

DR600VX-Atheros-QCA9880-2T2R-MIMO-802.11ac-Mini-PCIe-Wi-Fi-Module-Dual-Band-2.4GHz-5GHz

wallys-wifi6

Go-Excelize API源码阅读(十八)——GetPageMargins、SetWorkbookPrOptions、GetWorkbookPrOptions

Regan Yue

Go 开源 源码解析 8月日更 8月月更

静态IP是什么意思?和动态IP 有什么区别

郑州埃文科技

静态IP 动态IP IP地址

HMS Core Discovery第17期直播预告|音随我动,秒变音色造型师

HMS Core

藏不住了,数据分类分级利器「极盾·智辨」发布

极盾科技

网络安全 安全 数据 数据分类 数据安全

开源一夏 | 大佬,人人都说精通的单例模式,你精通了吗

知识浅谈

单例模式 8月月更

数据治理几乎所有常见问题的简答都在这里了

雨果

数据治理

使用 yo 命令行向导创建 SAP UI5 应用

Jerry Wang

前端开发 SAP SAP UI5 ui5 8月月更

DR882-Qualcomm-Atheros-QCA9882-2T2R-MIMO-802.11ac-Mini-PCIe-Wi-Fi-Module-5G-high-powe

wallys-wifi6

Kubernetes 1.25 发布!博云带你玩转新特性

BoCloud博云

容器 云平台 #k8s

RedisSyncer同步引擎的设计与实现

京东科技开发者

同步代码 key 引擎 redis 底层原理

阿里P8 架构师耗时几个月编写的这份微服务深度学习宝典,GitHub 星标10K+

了不起的程序猿

Java 阿里巴巴 微服务架构 JAVA开发 java程序员

MobTech ShareSDK Android端快速集成

MobTech袤博科技

android Android Studio SDK 教程

  • 扫码加入 InfoQ 开发者交流群
分析与解决:MySQL分区表复制bug导致的主从延迟_数据库_dbaplus社群_InfoQ精选文章