前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >MySQL - 删库了,但是很慢

MySQL - 删库了,但是很慢

作者头像
初代庄主
发布于 2022-12-19 11:25:46
发布于 2022-12-19 11:25:46
2.6K00
代码可运行
举报
文章被收录于专栏:初代庄主初代庄主
运行总次数:0
代码可运行

mysql 上执行了一句 drop database 半天没有完成,详细的慢查询日志如下,那当时MySQL 在做什么呢?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# Time: 2022-09-29Txx:xx:xx.176770+08:00
# User@Host: supper[supper] @  [127.0.0.1]  Id: 21155
# Query_time: 1743.715215  Lock_time: 3.127027 Rows_sent: 0  Rows_examined: 0
SET timestamp=1664523652;
drop database app_db;

初步分析

对于这类要看 MySQL 在做什么的场景,最为直接就是执行 show processlist 命令,但是这个场景下只能看到语句在执行,至于执行到哪个函数了,这种更加细粒度的就回答不了了。

如果我们从 linux 内核层面看,还是可以发现 mysql 这个时候在执行哪些函数的;从而达到更加细粒度的确认 MySQL 在做什么,进而回答 drop database 为什么慢。

可以看到在删库时调用的是 mysql_rm_db 这个函数,而这个函数又调用了 mysql_rm_table_no_locks 函数,mysql_rm_table_no_locks 会去清理数据字典。

现在问题就来了,如果只是要清理数据字典!那删库为什么会慢呢?回答这个问题还需要更加深入地分析才行。


OFF-CPU

如果一个进程所依赖的所有资源都已经准备好,那它就可以被调度到 cpu 上执行。事情的一个反面是;如果一个进程在等待 IO 操作完成,那么它将处于一个阻塞状态,阻塞为 OFF-CPU 状态的一种。OFF-CPU 时间的长短将直接影响到响应的耗时。

对于这类阻塞场景的 cpu 堆栈采样我们可以通过 offcputime 这个工具来分析堆栈。


分析 OFF-CPU

我们可以通过 offcputime 把 OFF-CPU 状态时的 mysql 堆栈拿出来,我当前这个场景下画图之后看到的是这样的。

这里可以看到 drop table 要清理数据字典里面对应表的元数据,但是这个清理不只是删除一条记录这么简单,它还要把磁盘上的文件也清理掉。

我在分析清理文件的时候发现 vfs 并没有 rm_file 这样的 API ,而是采用“以写代删” 的方式来完成删除操作; 也就是说操作系统并不直接去删除文件,而是把文件系统里面对应的 inode 标记为“保留”来达到删除文件的目的。详细的可以看下面这个图。


结论

通过函数调用堆栈(火焰图)我们可以知道,删除一个库依赖于删除这个库下所有的表,删除一个表不只要清理数据字典还要删除磁盘文件。

前面的操作都还比较轻,耗时主要应该是花在了删除磁盘文件上。和当事人确认后得知他这个库里面,数据量并不大(不会超过 1GB);但是表特别多,一个逻辑表对应着 10000 个物理表,一套业务走下来,导致这个库里面有几十万个表,这个也就是 drop database 慢的原因了。


本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-10-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 初代庄主 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
聊聊 MySQL 的 Online DDL
日常开发我们对一条DML语句较为熟悉,很多开发人员都了解sql的执行过程,比较熟悉,但是DDL是如何执行的呢,大部分开发人员可能不太关心,也认为没必要了解,都交给DBA吧。其实不然,了解一些能尽量避开一些ddl的坑,那么下面带大家一起了解一下DDL执行的方式,也算抛砖引玉吧。如有错误,还请各位大佬们指正。
码猿技术专栏
2023/09/07
1.1K0
聊聊 MySQL 的 Online DDL
故障分析 | mysql 5.6 升级到 8.0 失败一例处理
现居珠海,主要负责 Oracle、MySQL、mongoDB 和 Redis 维护工作。
用户1278550
2021/10/18
1.5K0
MySQL-8.0 | 数据字典最强解读
数据字典(Data Dictionary)中存储了诸多数据库的元数据信息如图1所示,包括基本Database, table, index, column, function, trigger, procedure,privilege等;以及与存储引擎相关的元数据,如InnoDB的tablespace, table_id, index_id等。MySQL-8.0在数据字典上进行了诸多优化,本文将对其进行逐一介绍。
数据和云
2019/05/13
4.1K0
Off-CPU分析:窥见冰山下的性能瓶颈
遇到CPU性能问题时,我们常常通过perf来了解CPU上到底在执行什么,以及通过On-CPU火焰图来帮助我们寻找性能瓶颈。但是,这种方式并不能让我们知道不在CPU上运行的进程和线程到底在做什么。在一些场景中,我们会发现CPU的使用率上不去,性能表现很差,这时候我们也许就需要考虑,是不是花在应用请求、异步调用这种Off-CPU的场景上的时间太多了。
程栩的性能优化笔记
2023/11/01
8230
Off-CPU分析:窥见冰山下的性能瓶颈
MySQL内核大牛解密腾讯数据库关键技术点
本文嘉宾:赖铮,腾讯TEG基础架构部数据库团队专家工程师,负责腾讯TXSQL数据库内核的研发,数据库系统开发老将,专注数据库内核开发十余年,先后就职于达梦、Teradata、北大方正以及MySQL InnoDB存储引擎团队,是达梦数据库内核、方正XML数据库以及InnoDB的GIS支持,加密功能的主要开发者,并获得多项数据库领域的专利。 本文是腾讯TEG基础架构部数据库团队专家工程师赖铮在腾讯云与3306π联合举办的数据库技术沙龙上的演讲实录。 ---- 今天分享时长四十分钟左右,详细解释腾讯云数据库内
腾讯云数据库 TencentDB
2019/10/30
1.9K0
MySQL内核大牛解密腾讯数据库关键技术点
无备份情况下恢复MySQL误删的表
小编寄语 想必大家都知道,Oracle ACE李真旭(Roger)是国内最专业的Oracle 数据库恢复专家。但知识都是触类旁通,真正的专家,从来不会局限在一个方向上。今天分享的内容,是他在MySQL数据恢复上所做的尝试。 本文主要分享在没有备份的情况下,MySQL数据库如何恢复被删除的表。 包含两个主要的场景: 1、drop table后的恢复 2、truncate table后的恢复 正文: 我们都知道,MySQL Server都很多存储引擎,并不是每种都可以进行异常情况之下都恢复,比如drop ta
数据和云
2018/03/08
13.7K0
无备份情况下恢复MySQL误删的表
优雅的drop掉mysql库中1TB大表
要是问大家,知道怎么从mysql数据库中drop掉业务表,很多人肯定会说,so easy,用drop table t_test语句不就完事了,这是初生牛犊不怕虎,你要是如此简单,去线上业务库中drop掉一张1TB大小的表,造成长时间的业务无法访问数据库,更严重,导致数据库崩溃,宕机都是可能的。
IT大咖说
2020/09/04
2.6K0
优雅的drop掉mysql库中1TB大表
MySQL DDL发展史
- 注意: 在online ddl前,inplace的方法主要在第三步大大缩短了时间,只重构了索引,没有重新copy所有数据
划水教练
2022/05/17
1.1K0
MySQL DDL发展史
MySQL8.0新特性之原子DDL语句
MySQL 8.0开始支持原子数据定义语言(DDL)语句。此功能称为原子DDL。原子DDL语句将与DDL操作关联的数据字典更新,存储引擎操作和二进制日志写入组合到单个原子事务中。即使服务器在操作期间暂停,也会提交事务,并将适用的更改保留到数据字典,存储引擎和二进制日志,或者回滚事务。
星哥玩云
2022/08/16
8670
删库跑路救命策略
那大概是一个春暖花开的季节,我的内心是激动澎湃的,因为已经安排了休假计划。在这前几天,已经把一个新项目的数据库环境都部署好了,包括 自动化备份。
lyb-geek
2022/03/10
5450
【愚公系列】2022年02月 攻防世界-进阶题-MISC-84(mysql)
undrop是一款针对mysql innodb的数据恢复工具,通过扫描文件或磁盘设备,然后解析innodb数据页进而恢复丢失的数据,对于drop、truncate以及文件损坏都很有帮助。本文介绍drop操作后表结构的恢复过程。
愚公搬代码
2022/02/17
6320
【愚公系列】2022年02月 攻防世界-进阶题-MISC-84(mysql)
快速安全删除MySQL大表
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
用户1148526
2019/10/22
6.1K1
三歪连MySQL大表怎么DDL变更都不懂
随着业务的发展,用户对系统需求变得越来越多,这就要求系统能够快速更新迭代以满足业务需求,通常系统版本发布时,都要先执行数据库的DDL变更,包括创建表、添加字段、添加索引、修改字段属性等。
敖丙
2020/12/09
2.5K0
三歪连MySQL大表怎么DDL变更都不懂
mysql8.0原子ddl特性
MySQL8.0支持原子DDL。原子DDL将DDL操作相关联的数据字典更新、存储引擎操作和二进制日志写入合并到单个原子事务中。
卖菜小弟
2020/03/05
1K0
MySQL 8.0与MariaDB 10.4,谁更易于填坑补锅?
贺春旸,凡普金科DBA团队负责人,《MySQL管理之道:性能调优、高可用与监控》第一、二版作者,曾任职于中国移动飞信、安卓机锋网。致力于MariaDB、MongoDB等开源技术的研究,主要负责数据库性能调优、监控和架构设计。
jeanron100
2019/12/24
2.8K0
MySQL 8.0与MariaDB 10.4,谁更易于填坑补锅?
MySQL笔记汇总
官方文档:https://dev.mysql.com/doc/refman/8.0/en/
Noneplus
2020/08/13
1.1K0
MySQL笔记汇总
MySQL 8.0 数据字典表
MySQL 8.0 对数据字典进行了重构,用户表、数据字典表、MySQL 其它系统表的元数据都统一保存到 mysql 库的数据字典表中了。
csch
2022/12/20
1.8K0
MySQL 8.0 数据字典表
Innodb中MySQL如何快速删除2T的大表
这个时候所有的mysql的相关进程都会停止,直到drop结束,mysql才会恢复执行。出现这个情况的原因就是因为,在drop table的时候,innodb维护了一个全局锁,drop完毕锁就释放了。
双面人
2019/04/10
3.1K0
Innodb中MySQL如何快速删除2T的大表
【腾讯云CDB】如何快速删除InnoDB中的大表
本文介绍了MySQL DROP TABLE操作可能存在的性能瓶颈,包括InnoDB引擎表、MyISAM引擎表、以及操作系统层面的限制。针对这些瓶颈,本文提出了相应的优化方案,包括增大InnoDB缓冲池、使用MyISAM存储引擎、以及调整操作系统相关参数。通过这些优化方案,可以有效地提升MySQL数据库的性能,减少DROP TABLE操作对数据库性能的影响。
腾讯云数据库 TencentDB
2017/12/14
4.1K1
一次生产环境mysql迁移操作(二)mysql空间释放(碎片整理)
上文中增加了定时归档,现在一些大表磁盘空间一直不释放,导致数据库文件越来越大。现在介绍下数据导入导出方案。
一笠风雨任生平
2020/02/18
1.4K0
相关推荐
聊聊 MySQL 的 Online DDL
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验