适用场景
如果数据库里有一张大于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
操作步骤
在50主机上:
在51主机上:
只在主库50上操作,drop后只剩下bbk的硬链接。
查看51上的文件情况,同主库一样,只剩下bbk的硬链接。
在50主机上操作:
在51主机上操作:
操作完成后,主从状态正常,数据库状态正常。
#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命令删除剩余的部分。
更多精彩干货分享
点击下方名片关注
IT那活儿
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/129779.html
摘要:也就是说当使用字符型存储数据后,该数据转换为二进制时的长度超过了位,那么该数据将不会完整存储,会丢失一部分数据。 showImg(https://segmentfault.com/img/bVbuYxg?w=3484&h=2480); 阅读本文大约需要 8 分钟。 写在前面 数据库打算只写 MySQL,Redis 两部分,不会很细,主要以面试题为主。这次写的是 MySQL 篇。 1.说...
摘要:步优化以及其它数据库后端掘金原文链接在发表了一篇简洁有效有趣和令人信服的分钟教程描述了如何进行优化。关于的七种后端掘金对于的,在学习起来可能是比较乱的。 5 步优化 MongoDB 以及其它数据库 - 后端 - 掘金原文链接 Jared Rosoff 在 Scale Out Camp 发表了一篇简洁、有效、有趣和令人信服的《8 分钟 MongoDB 教程》描述了如何进行 MongoDB...
阅读 1249·2023-01-11 13:20
阅读 1558·2023-01-11 13:20
阅读 1012·2023-01-11 13:20
阅读 1680·2023-01-11 13:20
阅读 3971·2023-01-11 13:20
阅读 2519·2023-01-11 13:20
阅读 1355·2023-01-11 13:20
阅读 3486·2023-01-11 13:20