怎么在MySQL数据库中对大的数据库进行删除

  介绍

怎么在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数据库中对大的数据库进行删除