MySQL加个索引都可能丢数据,这个坑你知道吗?

前言

近期,我们收到一位数据库运维小伙伴的咨询,他们有一个MySQL 5.6的数据库,需要对核心支付表做DDL加索引,咨询我们如何加索引更优雅。基于DBA经验,给表添加索引主要有以下几种方式:

  • 用MySQL原生的DDL语句(包括OnlineDDL)

  • 用pt-osc,新建临时表+触发器来实现

  • 用gh-ost,新建临时表+基于binlog来实现

  • Session级别关闭Binlog,备库先加索引,然后做主备切换

具体选择那种方式需要综合考虑表结构、主备延时、业务写入负载、磁盘IO、是否影响业务、使用习惯等多方面因素。经过我们综合评估该支付场景使用原生的OnlineDDL更佳,但该小伙伴反馈他们的运维流程要求DDL变更必须使用pt-osc,迫于流程最终还是使用pt-osc添加索引。然而接下来运维小伙伴的操作差点让公司发生巨大损失,幸好使用了DBdoctor性能洞察功能提前发现问题并及时止损。

pt-osc原理,有坑吗

1)pt-osc原理

图片

pt-osc的大致方式是通过创建一个临时表,然后按照主键chunk分批方式,拷贝源表中数据,同时通过三个写相关触发器来控制增量数据实时写入到临时表中,达到与源表最终的数据一致,最终rename交换。从原理上来看,实现逻辑比较简单。那么该原理对业务有损吗?

2)运维评估pt-osc是否符合要求

在从pt-osc的实现,我们能直接看出有以下问题:

  • 创建临时表,会导致空间翻倍,需要预留足够空间

  • 触发器的存在,会导致写入翻倍,需要确保磁盘IO能支撑

  • 写入增加会导致主备存在延时

  • 存在死锁导致业务事务回滚

经过运维同学人员的详细评估,基于当前业务量,前三点不会有问题,第四点当前MySQL的innodb_autoinc_lock_mode参数为2,不会产生自增锁导致的死锁问题。所以运维同学评估是可以直接在线上通过pt-osc来添加索引。

3)线上变更,踩坑死锁了

在线上进行变更过程中,发现业务发生了死锁,下面是业务的详细死锁日志:

LATEST DETECTED DEADLOCK-----------------------2024-06-26 02:25:20 7fe147aa4700*** (1) TRANSACTION:TRANSACTION 2653761553, ACTIVE 0 sec insertingmysql tables in use 2, locked 2LOCK WAIT 7 lock struct(s), heap size 1184, 5 row lock(s), undo log entries 3MySQL thread id 143920619, OS thread handle 0x7fe146cad700, query id 7056859581 updateREPLACE INTO `pay`.`_pay_info_new` (`pay_info_id`, `at_date`, `at_progress`, `ag_no`, `bs_status`, `buyer_id`, `contract_code`, `contract_id`...*** (1) WAITING FOR THIS LOCK TO BE GRANTED:RECORD LOCKS space id 169 page no 507288 n bits 288 index `Record lock, heap no 214 PHYSICAL RECORD: n_fields 2; compact format; info bits 32 0: len 8; hex 80000000096dd335; asc      m 5;; 1: len 8; hex 800000000009edf2; asc         ;;
*** (2) TRANSACTION:TRANSACTION 2653761554, ACTIVE 0 sec insertingmysql tables in use 2, locked 26 lock struct(s), heap size 1184, 4 row lock(s), undo log entries 3MySQL thread id 144763335, OS thread handle 0x7fe147aa4700, query id 7056859583 updateREPLACE INTO `pay`.`_pay_info_new` (`pay_info_id`, `at_date`, `at_progress`, `ag_no`, `bs_status`, `buyer_id`, `contract_code`, `contract_id`...*** (2) HOLDS THE LOCK(S):RECORD LOCKS space id 169 page no 507288 n bits 288 index `pay_info_id` of table `pay`.`_pay_info_new` trx id 2653761554 lock_mode X locks rec but not gapRecord lock, heap no 214 PHYSICAL RECORD: n_fields 2; compact format; info bits 32 0: len 8; hex 80000000096dd335; asc      m 5;; 1: len 8; hex 800000000009edf2; asc         ;;
*** (2) WAITING FOR THIS LOCK TO BE GRANTED:RECORD LOCKS space id 169 page no 507288 n bits 288 index `pay_info_id` of table `pay`.`_pay_info_new` trx id 2653761554 lock_mode X waitingRecord lock, heap no 214 PHYSICAL RECORD: n_fields 2; compact format; info bits 32 0: len 8; hex 80000000096dd335; asc      m 5;; 1: len 8; hex 800000000009edf2; asc         ;;
*** WE ROLL BACK TRANSACTION (2)------------

从上面的日志中我们能看到trigger对应的临时表操作发生了回滚,相当于正常业务针对源表的操作也回滚了,影响到业务。

pt-osc紧急回滚,会丢数据?

1)紧急回滚

运维紧急进行回滚,按下面步骤进行操作:

  • 首先kill掉pt-osc的脚本进程

  • 删除线上pt-osc的三个触发器

最终,运维确认已经回滚完成,待第二天分析完原因再变更。

2)发现大坑,pt-osc没处理干净

业务开发同学使用DBdoctor的性能洞察进行问题分析时,发现业务当前还有临时表的insert语句,认为是运维又开始进行加索引变更了,找运维确认。

图片

运维反馈变更已经停止,经过执行检查发现kill pt-osc脚本的时候只kill了shell脚本的进程,子进程没有kill,运维同学再次进行了kill,经过无触发器状态跑了8个多小时,pt-osc进程最终停止了。

3)如果pt-osc在无触发器状态,进程最终完成了,会丢数据吗?

从上面pt-osc的原理上来看,全量chunk拷贝都是按照主键递增的方式去做chunk切分并处理,不会对已经处理过的chunk再拷贝。所以会有以下两种问题:

  • 如果该变更的表只有按照主键自增id进行写入数据,那么最终全量拷贝的最后一个chunk就是最新的数据,能保证数据一致,不会丢数据

  • 对已经全量拷贝后的chunk再发生数据变更,由于触发器没有了,相当于增量丢失,insert/delete/update变更的数据存在丢失

这么大的坑,庆幸pt-osc的进程没有执行完。经过检查,8个小时内业务发生了9千多条支付数据更新,如果不是DBdoctor发现,将有9千多条支付数据丢失,对公司来说简直要命。

pt-osc不是万能药,大家做变更一定要仔细,稍微不慎,可能引发很严重的故障。

4)最终原生的OnlineDDL变更完成

图片

最终,该运维小伙伴接受了我们的建议,使用原生OnlineDDL进行核心支付表OnlineDDL变更,最终变更成功。从上图中可以看到实际变更的详细进展情况,对变更可回溯可追踪。

总结

各位研发或者DBA小伙伴们,你们是否也会经常遇到类似数据库DDL变更导致的故障吗?可以用DBdoctor进行数据库性能评估是否能做DDL,执行DDL的过程全程可见,大家可以试试~

图片

图片

DBdoctor推出长久免费版

DBdoctor是一款企业级数据库全方位性能监控与诊断平台,致力于解决一切数据库性能问题。可以对商业数据库、开源数据库、国产数据库进行统一性能诊断。

图片具备:SQL审核巡检报表监控告警存储诊断审计日志权限管理等免费功能,不限实例个数,可基于长久免费版快速搭建企业级数据库监控诊断平台。

图片​​​​​​​同时拥有:性能洞察、锁分析、根因诊断、索引推荐、SQL发布前性能评估等高阶功能,官网可快速下载,零依赖,一分钟快速一键部署。

如果您想要试用全部功能可添加公众号自助申请专业版license。成为企业用户可获得产品定制、OpenAPI集成、一对一专家等高阶服务。欢迎添加小助手微信了解详细信息!

1️⃣ 产品介绍:

内核级数据库性能诊断工具DBdoctor

2️⃣免费下载/在线试用:

https://dbdoctor.hisensecloud.com/col.jsp?id=126

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/768080.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

BeautifulSoup 类通过查找方法选取节点

BeautifulSoup 类提供了一些基于 HTML 或 XML 节点树选取节点的方法,其中比较主流 的两个方法是 find() 方法和 find_all() 方法。 find() 方法用于查找符合条件的第一个节点; find_all() 方法用于查找所有符合条件的节点,并以列表的…

分页导航DOM更新实践:JavaScript与jQuery的结合使用

分页导航DOM更新实践:JavaScript与jQuery的结合使用 在Web开发中,分页导航是展示大量数据时不可或缺的UI组件。合理的分页不仅可以提高应用性能,还能优化用户体验。本博客将通过一个实际的DOM结构和模拟数据,讲解如何使用JavaScr…

计算机网络部分知识点整理

停止等待协议的窗口尺寸为 1。 √以太网标准是IEEE802.3TCP/IP四层,OSI模型有7层,地址解析协议 ARP 在 OSI 参考七层协议属于数据链路层,在TCP/IP 协议属于网络层,ARP作用:将 IP 地址映射到第二层地址,交换…

Zabbix 配置PING监控

Zabbix PING监控介绍 如果需要判断机房的网络或者主机是否正常,这就需要使用zabbix ping,Zabbix使用外部命令fping处理ICMP ping的请求,在基于ubuntu APT方式安装zabbix后默认已存在fping程序。另外zabinx_server配置文件参数FpingLocation默…

VTK- 可视化过程 四种坐标系统

可视化工具包 VTK(Visualization Toolkit),是一种开源的可视化软件系统,主要实现计算机图形学、图像分析、渲染、图像处理等功能。VTK 包含一个 C类库和多个不同语言调用接口层,主要针对2D、3D 图像和可视化用图设计。 VTK设计作为一个工具包,不依赖于特…

【Android】构建 Android Automotive OS:适合初学者的指南

人不走空 🌈个人主页:人不走空 💖系列专栏:算法专题 ⏰诗词歌赋:斯是陋室,惟吾德馨 目录 🌈个人主页:人不走空 💖系列专栏:算法专题 ⏰诗词歌…

基于星火大模型的群聊对话分角色要素提取挑战赛|#AI夏令营#Datawhale#夏令营-Lora微调与prompt构造

赛题连接 https://challenge.xfyun.cn/topic/info?typerole-element-extraction&optionphb Datawhale Al夏令营 零基础入门大模型技术竞赛 数据集预处理 由于赛题官方限定使用了星火大模型,所以只能调用星火大模型的API或者使用零代码微调 首先训练数据很少…

windows电脑蓝屏解决方法(亲测有效)

如果不是硬件问题,打开终端尝试以下命令 sfc /scannow DISM /Online /Cleanup-Image /RestoreHealth

昇思25天学习打卡营第7天|Pix2Pix实现图像转换

文章目录 昇思MindSpore应用实践基于MindSpore的Pix2Pix图像转换1、Pix2Pix 概述2、U-Net架构定义UNet Skip Connection Block 2、生成器部分3、基于PatchGAN的判别器4、Pix2Pix的生成器和判别器初始化5、模型训练6、模型推理 Reference 昇思MindSpore应用实践 本系列文章主要…

远程登录WINDOWS10,提示你的凭据不工作

1:想通过远程桌面登录WINDOWS10输入用户名和密码后,出现下面的提示。 2:登录WINDOWS10,在运行中输入gpedit.msc 3:本地组策略编辑器窗口中,依次展开,计算机配置 ---> 管理模版---> 系统--…

Python容器 之 字典--字典的遍历

字典存在 键(key), 值(value) , 遍历分为三种情况 1.遍历字典的键 循环拿到字典中的每个键名 # 方式一 for 变量 in 字典: print(变量) # 方式二 for 变量 in 字典.keys(): # 字典.keys() 可以获取字典所有的键 print(变量) my_dict {name: 小明, age: 18, sex: 男}…

CVE-2024-6387漏洞预警:尽快升级OpenSSH

OpenSSH维护者发布了安全更新,其中包含一个严重的安全漏洞,该漏洞可能导致在基于glibc的Linux系统中使用root权限执行未经身份验证的远程代码。该漏洞的代号为regreSSHion,CVE标识符为CVE-2024-6387。它驻留在OpenSSH服务器组件(也…

2.(vue3.x+vite)调用iframe的方法(vue编码)

1、效果预览 2.编写代码 (1)主页面 <template><div><button @click="sendMessage">调用iframe,并发送信息

什么是带有 API 网关的代理?

带有 API 网关的代理服务显著提升了用户体验和性能。特别是对于那些使用需要频繁创建和轮换代理的工具的用户来说&#xff0c;使用 API 可以节省大量时间并提高效率。 了解 API API&#xff0c;即应用程序编程接口&#xff0c;是服务提供商和用户之间的连接网关。通过 API 连接…

JDK1.8下载、安装与配置完整图文2024最新教程

一、报错 运行Pycharm时&#xff0c;报错No JVM installation found. Please install a JDK.If you already have a JDK installed, define a JAVA_HOME variable in Computer >System Properties > System Settings > Environment Variables. 首先可以检查是否已安装…

UiPath+Appium实现app自动化测试

一、环境准备工作 1.1 完成appium环境的搭建 参考&#xff1a;pythonappiumpytestallure模拟器(MuMu)自动化测试环境搭建_appium mumu模拟器-CSDN博客 1.2 完成uipath的安装 登录官网&#xff0c;完成注册与软件下载安装。 UiPath业务自动化平台&#xff1a;先进的RPA及自动…

昇思25天学习打卡营第十五天|基于MobileNetv2的垃圾分类

基于MobileNetv2的垃圾分类 MobileNetv2模型原理介绍 MobileNet网络是由Google团队于2017年提出的专注于移动端、嵌入式或IoT设备的轻量级CNN网络&#xff0c;相比于传统的卷积神经网络&#xff0c;MobileNet网络使用深度可分离卷积&#xff08;Depthwise Separable Convolut…

全网最全的TTS模型汇总,电商人、自媒体人狂喜

近日TTS语音模型在AI圈内热度不小&#xff0c;今天小编就来给大家做了个TTS模型汇总&#xff01; GPT-SoVITS&#xff08;AI 卖货主播大模型Streamer-Sales销冠用的TTS模型&#xff09; 模型简介&#xff1a;支持英语、日语和中文&#xff0c;零样本文本到语音&#xff08;TT…

搜索旋转数组

题目链接 搜索旋转数组 题目描述 注意点 数组已被旋转过很多次数组元素原先是按升序排列的若有多个相同元素&#xff0c;返回索引值最小的一个 解答思路 首先需要知道的是&#xff0c;本题数组中的旋转多次只是将头部的某些元素移动到尾部&#xff0c;所以不论怎么旋转&am…

ctfshow sql注入 web234--web241

web234 $sql "update ctfshow_user set pass {$password} where username {$username};";这里被过滤了&#xff0c;所以我们用\转义使得变为普通字符 $sql "update ctfshow_user set pass \ where username {$username};";那么这里的话 pass\ where…