怎么在MySQL数据库中对大的数据库进行删除?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
解决办法
<强> 1。业务低峰时间手动执行删除强>
这个可能就需要DBA不辞辛劳,大晚上爬起来删表了。
<强> 2。先清除数据,最后再删除的方式
强>
譬如1000年万条数据,写脚本每次删除20万,睡眠一段时间,继续执行。这样也能做到对用户无感知。
<强> 3。对表文件(idb文件)做一个硬链接来加速删除强>
这个方法利用了linux下硬链接的知识,来进行快速删除,不记得话可以回去翻一下《鸟哥的linux私房菜》
ln data_center_update_log.ibd data_center_update_log.ibd.hdlk [root@mysql01 sports_center] #噢 总用量,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
执行上面命令后,我们就多了一个data_center_update_log.ibd.hdlk文件。此操作实际上不会占用磁盘空间,只是增加了一次对磁盘上文件的引用。
当我们删除其中任何一个文件时,都不会影响磁盘上真实的文件,只是将其引用数目减去1。当被引用的数目变为1的时候,再去删除文件,才会真正做IO来删除它。
正是利用这个特点,将由原来mysql来删除大文件的操作,转换为一个简单的操作系统级的文件删除,从而减少了对mysql的影响。
<强> 4。登陆mysql,执行删除表操作强>
很快,200年万条数据只用了1秒完成,此操作是在创建硬链接后执行的
mysql>, drop tables data_center_update_log; Query 好吧,,0,rows affected (1.02,秒) mysql>退出 再见 退出来,再次查看数据目录,发现就只剩data_center_update_log.ibd.hdlk硬链接文件了 [root@mysql01 sports_center] #噢 总用量,19903792 -rw-r——安康;2,mysql mysql 8447328256, 12月,23,11:35 data_center_update_log.ibd.hdlk
<强> 5。如何正确删除ibd。hdlk硬链接文件呢强>
- <李>
虽然删除表之后,剩下的硬链接文件已经和mysql没有关系了。但如果文件过大,直接用rm命令来删除,也是会造成IO开销飙升,CPU负载过高,进而影响到mysql。
李> <李>这里我们用到的方法,可以循环分块删除,慢慢地清理文件,通过一个脚本即可搞定
李> <李>截断命令通常用于将文件缩小或扩展到指定的大小。如果文件大于指定的大小,则会丢失额外的数据。如果文件较短,则会对其进行扩展,并且扩展部分的读数为零字节。
5.1安装截断命令
[root@mysql01 ~] #, cruncate bash: cruncate:未找到命令 通常操作系统会安装截断命令,该命令在coreutils安装包里面,如果没有安装可以使用下面命令安装 (root@mysql01 ~) #, yum provides 截断 coreutils - 8.22 - 24. - el7.x86_64 :, A set of basic GNU tools commonly used shell 拷贝脚本 源,:基地 匹配 文件名,:/usr/bin/截断 可以看到截断由coreutils安装包提供,下面安装coreutils安装包: [root@mysql01 ~) #, yum install -y coreutils
<强> 5.2截断常用选项强>
- c,——no-create祝辞不创建任何文件
引用>
- o,——io-blocks祝辞将大小视为存储块的数量,而不是字节
- r,参考=RFILE——比;参考指定的文件大小
- s,——大?大小比;按照指定的字节设置文件大小<强> 5.3 truncate_bigfile。sh脚本强>
原理:使用截断- s选项可以指定文件大小,通过脚本指定每次文件减少的大小,并睡睡眠一定时间,从而达到可控的删除文件
附:truncate_bigfile。sh脚本
# !/bin/bash # 截断=/usr/bin/截断 文件=$ 1 if [, x" 1美元,,=,x ); ,echo “Please input  filename in" ,exit 1; 其他的 ,SIZE_M=$ (du -sm “1美元“,|,awk & # 39; {print 1美元}& # 39;) 美元,for 小姐:拷贝(seq “$ {SIZE_M}“, -100年,0) ,做 sleep 1 ,echo “${截断},-s ${我}M $ {FILE}“; ,${截断},-s “${我}“M “$ {FILE}“; ,做 fi if [$ ?大敌;-eq 0,); ,,,\ rm -f “$ {FILE}“; 其他的 ,,,echo “Please check file" fi怎么在MySQL数据库中对大的数据库进行删除