加入收藏 | 设为首页 | 会员中心 | 我要投稿 鹰潭站长网 (https://www.0701zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

MySQL如何优雅的删除大表

发布时间:2022-12-19 13:34:36 所属栏目:MySql教程 来源:转载
导读: 前言
删除表,大家下意识想到的命令可能是直接使用DROP TABLE "表名"
,这是初生牛犊的做法,因为当要删除的表达空间到几十G,甚至是几百G的表时候。这样一条命令下去,MySQL可能就直接夯住

前言

删除表,大家下意识想到的命令可能是直接使用DROP TABLE "表名"

,这是初生牛犊的做法,因为当要删除的表达空间到几十G,甚至是几百G的表时候。这样一条命令下去,MySQL可能就直接夯住了,外在表现就是QPS急速下降,客户请求变慢。

解决办法1.业务低峰时间手动执行删除

这个可能就需要DBA不辞辛劳,大晚上爬起来删表了。

2.先清除数据,最后再删除的方式

譬如1000万条数据,写脚本每次删除20万,睡眠一段时间,继续执行。这样也能做到对用户无感知。

3.对表文件(idb文件)做一个硬链接来加速删除

这个方法利用了linux下硬链接的知识mysql删除表,来进行快速删除,不记得话可以回去翻一下《鸟哥的linux私房菜》

ln?data_center_update_log.ibd?data_center_update_log.ibd.hdlk

[root@mysql01?sports_center]#?ll
总用量?19903792
-rw-r-----?1?mysql?mysql???????9076?10月?17?13:15?data_center_update_log.frm
-rw-r-----?2?mysql?mysql?8447328256?12月?23?11:35?data_center_update_log.ibd
-rw-r-----?2?mysql?mysql?8447328256?12月?23?11:35?data_center_update_log.ibd.hdlk


4.登陆mysql,执行drop表操作

很快,200万条数据只用了1秒完成,此操作是在创建硬链接后执行的
mysql>?drop?tables?data_center_update_log;
Query?OK,?0?rows?affected?(1.02?sec)


mysql>?exit
Bye

退出来,再次查看数据目录,发现就只剩data_center_update_log.ibd.hdlk硬链接文件了
[root@mysql01?sports_center]#?ll
总用量?19903792
-rw-r-----?2?mysql?mysql?8447328256?12月?23?11:35?data_center_update_log.ibd.hdlk

5.如何正确删除ibd.hdlk

硬链接文件呢5.1 安装truncate

命令

[root@mysql01?~]#?cruncate
-bash:?cruncate:?未找到命令
通常操作系统会安装truncate命令,该命令在coreutils安装包里面,如果没有安装可以使用下面命令安装

[root@mysql01?~]#?yum?provides?truncate
coreutils-8.22-24.el7.x86_64?:?A?set?of?basic?GNU?tools?commonly?used?in?shell?scripts
源????:base
匹配来源:
文件名????:/usr/bin/truncate

可以看到truncate由coreutils安装包提供,下面安装coreutils安装包:

[root@mysql01?~]#?yum?install?-y?coreutils


5.2 truncate

常用选项

-c,?--no-create?-->?不创建任何文件?
-o,?--io-blocks?-->?将大小视为存储块的数量,而不是字节?
-r,?--reference=RFILE?-->?参考指定的文件大小?
-s,?--size=SIZE?-->?按照指定的字节设置文件大小?

5.3 truncate_bigfile.sh脚本

#!?/bin/bash
#

TRUNCATE=/usr/bin/truncate
FILE=$1

if?[?x"$1"?=?x?];then
?echo?"Please?input?filename?in"
?exit?1;
else
?SIZE_M=$(du?-sm?"$1"?|?awk?'{print?$1}')

?for?i?in?$(seq?"${SIZE_M}"?-100?0)
?do
??sleep?1
??echo?"${TRUNCATE}?-s?${i}M?${FILE}"
??${TRUNCATE}?-s?"${i}"M?"${FILE}"
?done
fi

if?[??$??-eq?0?];then
????????\rm?-f?"${FILE}"
else
????????echo?"Please?check?file"
fi

因为有悔,所以披星戴月;因为有梦,所以奋不顾身!个人博客首发:easydb.net

(编辑:鹰潭站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!