mysql创建索引导致死锁,数据库崩溃,完美解决方案
文章目录
- 写在前面
- 一、短事务场景下,执行DDL语句场景分析
- 1、短事务场景下,执行表字段添加操作
- 2、短事务场景下,执行表字段修改操作
- 3、短事务场景下,执行表字段删除操作
- (1)往里添加一条数据试试
- 4、短事务场景下,添加索引操作
- 5、总结
- 二、完美解决方案
- 三、原因分析
- 写在后面
写在前面
DDL语句,就是对数据库对象(数据库、表、列、索引等)进行创建、删除、修改等。
之前分享过一篇mysql创建索引导致死锁,数据库崩溃,mysql的表级锁之【元数据锁(meta data lock,MDL)】全解
通过上一篇文章我们了解到,MySQL有一种表锁叫做元数据锁(meta data lock,MDL)元数据锁,执行DDL时会检查元数据锁并尝试获取。
之前一直以为,只要保证MySQL数据库当前没有长事务,就可以安枕无忧地执行DDL语句,我们天真的认为短事务场景中,DDL语句总是会在上一个事务结束后,获取到元数据锁,并不会有死锁的危险。
但是最近发现!事情并没有想象中的那么简单!就算是没有长事务,MySQL8.0在创建索引的时候,仍然有可能会导致死锁的发生!
我们一起来分析一下。
注!本文操作都是基于mysql 8.0.21
,InnoDB
引擎,可重复读事务隔离级别
下来完成的。
一、短事务场景下,执行DDL语句场景分析
先创建一个表:
CREATE TABLE `lock_test` (`id` int NOT NULL,`name` varchar(20) DEFAULT NULL,`age` int DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB;
1、短事务场景下,执行表字段添加操作
我们发现,当事务A尚未提交时,事务B、事务C都会处于等待状态。
当事务A一经发起commit命令,事务B紧跟着会进行执行,并执行成功,事务C在事务B之后也会执行成功。
整个过程只有正常的事务等待,并不会发生死锁。
2、短事务场景下,执行表字段修改操作
我们发现,修改字段的场景下和添加字段场景下的结果是一样的。
3、短事务场景下,执行表字段删除操作
当该表无数据时,我们会发现,当事务A执行提交之后,事务B和事务C进入死锁,此时该表的任何SQL语句都无法执行!
此时导致数据库表死锁,数据库SQL堆积越来越多,导致数据库崩溃!
(1)往里添加一条数据试试
INSERT INTO `ourea`.`lock_test`(`id`, `name`, `age`, `column_name`) VALUES (1, '1', 1, '1');
有数据的情况和没有数据的情况,是不一样的!
有数据时,当事务A提交之后,事务C会执行成功,当事务C提交之后,事务B才是最终执行成功。
4、短事务场景下,添加索引操作
还是保持数据库中有数据。
INSERT INTO `ourea`.`lock_test`(`id`, `name`, `age`, `column_name`) VALUES (1, '1', 1, '1');
我们发现,当事务A执行提交之后,事务B和事务C进入死锁,此时该表的任何SQL语句都无法执行!
此时导致数据库表死锁,数据库SQL堆积越来越多,导致数据库崩溃!
5、总结
用事实说话。
通过实例,我们可以看出,即使没有长事务,执行DDL语句仍会导致表死锁。
尤其是对索引的操作,非常危险!
二、完美解决方案
在执行DDL语句之前,通过以下SQL,首先要确保没有长事务:
SELECT * FROM information_schema.INNODB_TRX;
然后,再执行DDL语句之前,先将整表锁住,然后执行DDL语句:
使用如下操作,完美解决死锁问题!
-- 锁整表,加上写锁
lock table lock_test write;
-- 添加索引
CREATE INDEX index_tb ON lock_test(column_name);
-- 解锁
unlock table;
三、原因分析
当对非主键字段更改索引时,其实并不是一个原子操作,会先更新非主键字段索引,然后再更新主键索引。
当我们把主键删掉之后:
这种情况,和当表中有数据,执行表字段删除操作的场景一模一样。
原因是MySQL5.6引入的OnLine-DDL,一个DDL语句其实包含着两个等待操作:
- prepare阶段:尝试获取MDL排他锁,禁止其他线程读写;
- ddl执行阶段:降级成MDL共享锁,允许其他线程读取;
- commit阶段:升级成MDL排他锁,禁止其他线程读写;
- finish阶段:释放MDL锁;
1、3、4如果没有锁冲突,执行时间非常短。第2步占用了DDL绝大部分时间,这期间这个表可以正常读写数据,是因此称为“online ”。
如果第3步升级为MDL写锁的时候,这个表的MDL锁有其他事务占着,那么这个事务会阻塞,等到可以拿到MDL写锁,而且如果不幸一直拿不到,最后锁超时了,就只好回滚这个DDL操作。
所以,DDL语句只有才开始和结束的时候,才会禁止读和写,在语句执行的时候是可以进行读的。
写在后面
如果本文对你有帮助,请点赞收藏关注一下吧 ~
相关文章:
mysql创建索引导致死锁,数据库崩溃,完美解决方案
文章目录写在前面一、短事务场景下,执行DDL语句场景分析1、短事务场景下,执行表字段添加操作2、短事务场景下,执行表字段修改操作3、短事务场景下,执行表字段删除操作(1)往里添加一条数据试试4、短事务场景…...
c++11 标准模板(STL)(std::unordered_map)(八)
定义于头文件 <unordered_map> template< class Key, class T, class Hash std::hash<Key>, class KeyEqual std::equal_to<Key>, class Allocator std::allocator< std::pair<const Key, T> > > class unordered…...
企业ISO体系认证办理,可以自行申请吗?为什么都要找咨询公司?
企业ISO体系认证办理,可以自行申请吗?为什么都要找咨询公司? 很多人认为ISO咨询公司为中介机构,希望直接找认证公司进行认证。其实认证机构担任的是认证审核职责,咨询机构担任的是咨询职责。按中国国家任可监委员会的…...
二、Neo4j源码研究系列 - 单步调试
二、Neo4j源码研究系列 - 单步调试 一、背景介绍 上一篇我们已经把了neo4j的源码准备以及打包流程完成了,本篇将讲解如何对neo4j进行单步调试。对于不了解如何编译打包neo4j的读者,请阅读《一、Neo4j源码研究系列 - 源代码准备》。 大纲: …...
基于Qt WebEngine 的Web仪器面板GUI程控技术
随着IIoT的发展,很多工业仪器也具备了远程管理的GUI。与早期使用串口进行命令交互不同,这些GUI可以直接在远程呈现数据。 作为希望对仪器、软件进行二次开发的小公司来说,会遇到GUI人工操作转自动化的需求。在无法通过串口等传统接口进行自动…...
海康摄像头使用RTSP
1.协议格式。海康威视IP摄像头rtsp协议地址如下:rtsp://[username]:[passwd][ip]:[port]/[codec]/[channel]/[subtype]/av_stream主码流:rtsp://admin:12345192.168.1.64:554/h264/ch1/main/av_streamrtsp://admin:12345192.168.1.64:554/MPEG-4/ch1/mai…...
编程语言分类
目录 ❤ 机器语言 机器语言的编程 ❤ 汇编语言 ❤ 高级语言(编程语言) 编译型 解释型 ❤ 动态语言和静态语言 ❤ 强类型定义语言和弱类型定义语言 ❤ 主流语言介绍 C语言 C java python JavaScript SQL PHP python从小白到总裁完整教程目录:https://blog…...
[nodejs开发] typescript引入js模块或文件
首先更改tsconfig.json 中的compilerOptions属性:"moduleResolution": "Node"假设有一个abc.js其内容如下:var Circle (function () {function Circle() {}Circle.prototype.draw function () {console.log("Cirlce is drawn…...
小帮软件机器人应用于通信集团财务数据填报、编制、稽核、银企对账
某大型通信集团是国有控股通信运营服务提供商,主要从事国内外通信设施服务业务、固定通信业务、移动通信业务、数据通信业务、网络接入业务、卫星国际专线业务和通信业务相关系统集成业务,管辖20多家子(分)公司、服务运营和支持网…...
37. CF-Weights Distributing
链接 这是一个比较经典的题目。容易想到求出两段路径重合的部分,然后贪心的放权值。那么跑三次最短路,枚举重合部分的端点即可。 正解没什么好说的。这题有趣的地方在于,如果数据比较弱,可能会把一些错误做法放过去。 一种错误…...
百丽时尚×优维科技×道客战略启动「云原生一体化项目」
3月7日,由百丽时尚集团(以下简称:百丽时尚)联合优维科技、道客共同举办的「云原生一体化项目启动会」在深圳百丽国际大厦圆满落幕,项目合作三方齐聚一堂,就云原生一体化建设战略方案达成合作共识࿰…...
小诺开源技术
小诺开源技术 文章目录小诺开源技术前言页面演示介绍文档学习建议登录地址下载地址前言 近期接触了小诺开源技术的一个前端框架,底层是蚂蚁框架,感觉很好用,不过需要稍微学习并适应一下,推荐给大家,本篇仅用于学习&am…...
AidLux AI应用案例悬赏选题 | 纺织品表面瑕疵检测
AidLux AI 应用案例悬赏征集活动 AidLux AI 应用案例悬赏征集活动是AidLux推出的AI应用案例项目合作模式,悬赏选题将会持续更新。目前上新的选题涉及泛边缘、机器人、工业检测、车载等领域,内容涵盖智慧零售、智慧社区、智慧交通、智慧农业、智能家居等…...
UE官方教程笔记02-实时渲染基础下
对官方教程视频[官方培训]02-实时渲染基础下 | 陈拓 Epic的笔记没听懂的地方就瞎写反射实时渲染中反射是一个非常有挑战的特性UE中有多种不同的方案,各有各的优势和缺点反射捕获屏幕空间反射平面反射LumenRT Reflection反射捕获在指定位置捕获一张Cube Map需要预计算…...
grep命令——在文件中搜索指定的文本模式
grep是英文词组“global search regular expression and print out the line”的缩写,意思是全局搜索正则表达式,并将结果输出。 通常将grep命令与正则表达式搭配使用,命令选项作为搜索过程中的补充或对输出结果的筛选,命令模式十…...
数据结构刷题(二十二):90子集II、491递增子序列、46全排列
1.子集II题目链接思路:这是一道标准的组合问题数组排序去重。依然是使用回溯。注意:去重代码只需要判断同一树层上是否有重复,同组合总和II(https://blog.csdn.net/xiaomingming99/article/details/129396344)解法&…...
AI+人类,实现高效网络安全
导语 聊天机器人和生成式人工智能(如 ChatGPT)突然成为主流让很多人感到担忧。很多人开始担忧,人工智能取代人的时代已经到来。 幸运的是,事实并非如此。 更有可能的情况是,人类将与 AI 合作创建工作角色的混合模型。…...
牛客小白月赛68【A-E】
文章目录A.Tokitsukaze and New Operation【模拟】B.Tokitsukaze and Order Food Delivery【模拟、特判】C.Tokitsukaze and Average of Substring【暴力、前缀】D.Tokitsukaze and Development Task【记忆化搜索】E.Tokitsukaze and Colorful Chessboard【预处理,二…...
WIFI P2P架构
WI-FI P2P定义架构3个组件组织结构技术标准P2P DiscoveryDevice Discovery(扫描)流程p2p probe 管理帧Group Formation(组网)GO Negotiation(GON)流程P2P Public Action管理帧Provision Discoveryÿ…...
架构师之中台思维_系统发展之路_结果和抽象之间平衡的艺术
父文章 如何成为一名架构师,架构师成长之路_golang架构师成长之路_个人渣记录仅为自己搜索用的博客-CSDN博客 任何系统的发展都是如此. 1. 业务增长 2. 烟囱增长 _ 结果优先 _ 太快去抽象抽象不好 3. 太多的烟囱, 3.1 抽象复用为平台 3.2 面对更多新的业务,提供不同的枚举值…...
23届非科班选手秋招转码指南
1.秋招情况介绍 1.1自我介绍 我是一名23届非科班转码选手,本硕均就读于某211院校机械专业,秋招共计拿下12份offer,包括大疆创新、海康威视、联发科技、理想汽车、中电28、阳光电源等各行业、各种性质企业的意向。主要的投递岗位为嵌入式软件…...
《传感器技术》考试学习笔记
文章目录一、选择题二、简答题1.什么是传感器?传感器的共性是哪些?2.差动变气隙式传感器电感传感器的灵敏度推导过程是什么(推导公式)?与单极性进行比较它们的优缺点是哪些?3.霍尔传感器如何进行微位移测量…...
第十五章 opengl之高级OpenGL(模板测试)
OpenGL模板测试模板函数物体轮廓模板测试 当片段着色器处理完一个片段后,模板测试就会开始执行。类似于深度测试,模板测试也可能会丢弃片段。被保留的片段会进入深度测试,可能会丢弃更多的片段。 模板测试是根据模板缓冲来进行的。一个模板缓…...
【C语言蓝桥杯每日一题】—— 单词分析
【C语言蓝桥杯每日一题】—— 单词分析😎前言🙌单词分析🙌总结撒花💞😎博客昵称:博客小梦 😊最喜欢的座右铭:全神贯注的上吧!!! 😊作者…...
Web2:Tomcat
二.Web2:Tomcat 1.Tomcat的配置 2.Tomcat的工作方式 3.Tomcat服务器的虚拟映射 4.Tomcat部署到IDEA中使用 二.Web2:Tomcat 1.Tomcat的配置 ①安装下载Tomcat 配置好JAVA_HOME启动时保证端口号8080不被占用 ②下载后的目录结构 bin 启动或关闭to…...
C++语法规则2(C++面向对象)
继承 面向对象程序设计中最重要的一个概念是继承。继承允许我们依据另一个类来定义一个类,这使得创建和维护一个应用程序变得更容易。这样做,也达到了重用代码功能和提高执行效率的效果。 当创建一个类时,您不需要重新编写新的数据成员和成…...
第八批国家药品集中采购-(附药品集采目录明细下载)
2023年3月2日,‘国家组织药品联合采购办公室’发出了《全国药品集中采购文件》,宣告了第八批国家组织药品集中采购工作正式开展,其公告中还包含三个附表分别为‘采购品种目录’、‘各地区首年约定采购量’、‘各采购品种首年约定采购量’&…...
政府工作报告连提9年科技创新 企业研发如何“又快又好”
今年的政府工作报告, “科技创新” 这一描述连续出现7次,这也是自2015年开始, “科技创新” 这一概念在全国“两会”政府工作报告中连续九年被提到。政府工作报告指出,科技政策要聚焦自立自强,完善新型举国体制&#x…...
GM8773C 是一款 1:2 DSI 桥接芯片,可实现 4 路进 8 路出转换器功能、视频分离器功能。
GM8773C 是一款 1:2 DSI 桥接芯片,可实现 4 路进 8 路出转换器功能、视频分离器功能。芯片内集成了一个 4 路单一链路的 MIPI DSI 接收器和 8 路双链路 MIPI DSI 发送器。 接 收 器 每 路 可 以 支 持 到 2.0Gbps/lane , 可 以 最 高 支 持 到…...
Java常用包名和说明
包名主要功能java.applet提供了创建applet需要的所有类java.awt.*提供了创建用户界面以及绘制和管理图形、图像的类java.beans.*提供了开发Java Beans需要的所有类java.io提供了通过数据流、对象序列以及文件系统实现的系统输入、输出java.lang.*Java编程语言的基本类库java.ma…...
凯里网站开发gzklyy/谷歌google
类型: 定制服务 软件包:integrated industry solution collateral联系服务商产品详情 解决方案 概要 业务背景 "客户目前无法获得及时、完整的经营数据和信息; 客户不能将现有的数据做有效整合,不能为业务决策提供依据 IT天…...
哪家做网站公司/营销文案
AFNetworking了解 AFNetworking是一个讨人喜欢的网络库,适用于iOS以及Mac OS X. 它构建于在NSURLConnection, NSOperation, 以及其他熟悉的Foundation技术之上. 它拥有良好的架构,丰富的api,以及模块化构建方式,使得使用起来非常轻松.例如,他可以使用很轻松的方式从一个url来得…...
网站底部横条导航代码/焦作整站优化
进程管理相关命令 pstree: 命令以树状图的方式展现进程之间的派生关系,显示效果比较直观。 选项:-a:显示每个程序的完整指令,包含路径,参数或是常驻服务的标示;-c:不使用精简标示法…...
搜索引擎中 哪些网站可以获得更好的排名/制作网站的软件叫什么
项目截图群聊:私聊:项目技术栈可以看到项目中用到的都是技术都是很常用技术,同时也是我们需要掌握的能力。而且 crossoverJie 大佬的代码写的也相当漂亮,非常值得学习一波。先来简单看一下系统整体架构!系统架构下面我…...
泉州住房和城乡建设局网站/网站要怎么创建
在学习selenium自动化测试中,遇到文件上传,书的作者轻轻跳过,回避了实际工作要求。本着从实际出发的想法,在网上查了些资料,最终使用win32库完成文件上传。安装pypiwin32库: pip install pypiwin32参考http…...
网络设计目标及设计思想/搜索引擎优化的名词解释
Ⅰ 与后端交互 - ajax版本1 - 出现了跨域问题前端:index.html<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Vue与后端交互 - 出现了跨域问题</title><script src"https://…...