Java基础、中级、高级、架构面试资料

面试官:如何快速的 drop 掉一个 100G 的大表!

SQL herman 2052浏览
公告:“业余草”微信公众号提供免费CSDN下载服务(只下Java资源),关注业余草微信公众号,添加作者微信:xttblog2,发送下载链接帮助你免费下载!
本博客日IP超过2000,PV 3000 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog2,之前的微信号好友位已满,备注:返现
受密码保护的文章请关注“业余草”公众号,回复关键字“0”获得密码
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
视频教程免费领
腾讯云】1核2G5M轻量应用服务器50元首年,高性价比,助您轻松上云

面试官:如何快速的 drop 掉一个 100G 的大表!

别看 drop 命令很简单,但是当执行时机不对,执行姿势不对,可能会引发“大祸”。

最近微信群里的一位网友就“引火上身”了,而其他群友则“因祸得福”了。

事情的起因是这样的,一位网友发现测试服务器上的一个 log 表达到了 100G。他想这个表太大了,而且测试环境的 log 数据,没啥用。就想着给 delete 掉。一开始,他就直接执行 delete,发现,执行了半天,没反应。

delete from log;

于是,他就从 Navicat 上,强制结束了执行。选择使用 drop 进行执行。

drop table log;

执行 drop 命令后,发现花了更久的时间,命令还是没返回执行成功。他就慌了,更要命的是,这个时候,各个业务线的人,都在反馈,测试环境很卡。

最后,他只好坦白从宽,去和领导和 dba 反馈问题了。至于最后的结局,我们就不细说了。包括他们的业务和各业务线的架构设计也不在本文的讨论范畴。

我们今天,重大说是,drop 一张表的时候,MySQL 的底层都干了些什么?以及它为什么会慢,如何快速的进行一张表的 drop。

从高性能 MySQL 一书中,我们得出,MySQL 的 drop 命令,主要干了两件事。

  1. 清除 Buffer Pool 缓冲
  2. 删除对应的磁盘数据文件 ibd

针对第一点,当我们的 Buffer Pool 缓冲设置的越大,drop 时就越耗时,因此合理的 Buffer Pool 缓冲区设置就显得很重要。

第二点,尤其重要。因为它是真正存数据的文件。drop 数据慢,最大的原因,就是和它有关。

在我们删除物理数据文件时,如果数据文件过大,删除过程会产生大量的 IO 并耗费更多的时间,造成磁盘 IO 开销飙升,CPU 负载过高,影响其他程序运行。

好在 linux 提供的有硬连接特性,我们可以合理的利用这个特性,加快删除速度。

Linux硬连接特性
Linux硬连接特性
软链接和硬链接
软链接和硬链接

当多个文件名同时指向同一个 INODE 时,这个 INODE 的引用数 N > 1,删除其中任何一个文件名都会很快。因为其直接的物理文件块没有被删除,只是删除了一个指针而已;当 INODE 的引用数 N = 1 时,删除文件需要去把这个文件相关的所有数据块清除,所以会比较耗时。

因此,我们可以合理的利用这个机制,给数据库表的 .ibd 文件创建一个新的硬链接。当删除表时,删除物理文件时,其实删除的就是物理文件的一个指针,所以删除操作响应速度会非常快,不到 1 秒就能完成这个操作。

-- 先创建表文件的硬链接
ln table_test.ibd table_test.ibd.bak
-- 删除表
drop table table_test;

最后就是要真正删除掉物理文件,释放文件所占用的磁盘空间。这一步我就不展开说了,网上有很多工具,都可以做到。

我们这里讲了大表的 drop,同样的,这个过程这适合大库 drop。如果一个数据库比较大,那我们可以先删除其中较大的表,最后在执行 DROP DATABASE 删除整个库,对大表的删除可参见上面的方法。

业余草公众号

最后,欢迎关注我的个人微信公众号:业余草(yyucao)!可加作者微信号:xttblog2。备注:“1”,添加博主微信拉你进微信群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作也可添加作者微信进行联系!

本文原文出处:业余草: » 面试官:如何快速的 drop 掉一个 100G 的大表!