资讯专栏INFORMATION COLUMN

MYSQL下如何安全的快速删除大表

IT那活儿 / 2407人阅读
MYSQL下如何安全的快速删除大表



适用场景



如果数据库里有一张大于1T的表需要删除,那么用什么方法操作最安全呢?所谓的安全,即为删除过程中,不影响数据库的响应,业务连接不会卡壳,系统正常使用……

假如直接登录数据库使用drop table tablename;会是什么情况?在drop table的时候,innodb会维护一个全局锁,drop完毕锁才能释放。这就意味着,在白天,访问量非常大的时候,执行删除大表的命令,整个mysql就会挂起,在删表期间,QPS也会严重下滑,后果可想而知……



最佳选择(原理)



正确的方法为使用linux下硬链接的知识,进行大表删除,对数据库自身的健康度影响较小。

所谓的硬链接,就是不止一个文件名指向node Index,有好几个文件名指向node Index。
假设,又有一个文件名指向上面的node Index,如下:

这时,如果做了删除文件名(1)的操作,linux系统检测到,还有一个文件名(2)指向node Index,因此并不会真正的把文件删了,而是把文件(1)的引用给删了,这步操作非常快,只是删除引用。于是就会变成如下:

接下来,如果再删除文件名(2)的操作,linux系统检测到,没有其他文件名指向该node Index,就会删除真正的存储文件,这步操作,是删真正的文件,所以会比较慢。这时,我们写一个for循环,进行小量文件,多次删除,直到大文件变小,安全了,才从磁盘上RM。



环境说明



双主架构:192.168.157.50:30016,192.168.157.51:30016

实例名字:xxx_test

删除大表:xxx.alipay_fans,大小为30GB

文件路径:/data/mysql/db_xxx_test/data/xxx/Alipay_fans.ibd



操作步骤



1. 建立硬链接

在50主机上:

在51主机上:


2. 删除表

只在主库50上操作,drop后只剩下bbk的硬链接。

查看51上的文件情况,同主库一样,只剩下bbk的硬链接。


3. 删除文件

在50主机上操作:

在51主机上操作:


4. 验证主从状态

操作完成后,主从状态正常,数据库状态正常。


5. 脚本说明

#filename=/data/mysql/db_xxx_test/data/xxx/alipay_fans.ibd
#filesize=30 #定义要删除文件的大小,单位GB(以实际大小调整)
#ln $filename $filename.bbk
# for i in `seq $filesize -1 1`;do truncate -s ${i}G $filename.bbk;ll -h $filename.bbk;done  
#rm $filename.bbk

备注:从文件大小30G开始,每次缩减1G,执行truncate,直到文件剩余1G,最后使用rm命令删除剩余的部分。


END


更多精彩干货分享

点击下方名片关注

IT那活儿

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/129779.html

相关文章

  • 「Python 面试」第五次更新

    摘要:也就是说当使用字符型存储数据后,该数据转换为二进制时的长度超过了位,那么该数据将不会完整存储,会丢失一部分数据。 showImg(https://segmentfault.com/img/bVbuYxg?w=3484&h=2480); 阅读本文大约需要 8 分钟。 写在前面 数据库打算只写 MySQL,Redis 两部分,不会很细,主要以面试题为主。这次写的是 MySQL 篇。 1.说...

    zhunjiee 评论0 收藏0
  • mysql - 收藏集 - 掘金

    摘要:步优化以及其它数据库后端掘金原文链接在发表了一篇简洁有效有趣和令人信服的分钟教程描述了如何进行优化。关于的七种后端掘金对于的,在学习起来可能是比较乱的。 5 步优化 MongoDB 以及其它数据库 - 后端 - 掘金原文链接 Jared Rosoff 在 Scale Out Camp 发表了一篇简洁、有效、有趣和令人信服的《8 分钟 MongoDB 教程》描述了如何进行 MongoDB...

    Donald 评论0 收藏0

发表评论

0条评论

IT那活儿

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<