设为首页 收藏本站
查看: 803|回复: 0

[经验分享] 大量删除MySQL中的数据

[复制链接]

尚未签到

发表于 2017-12-12 16:46:48 | 显示全部楼层 |阅读模式
  出现的背景:
  公司做了一个redis相关的项目,其中mysql存储了很多统计数据。比如客户端上报的数据,redis实例的数据,应用的数据,机器的数据等。每天都在上报,采集,由于没有定期删除,数据大量累积。大概有一年左右的数据,一个表的数据已经达到亿级别的。这样算下来,一个表的数据至少是几十GB了。因此需要删除过期的数据,暂时保留近三个月的统计数据。
  解决方案:
  基本每个表都有个字段叫create_time或者collect_time的字段,只要删除这个字段三个月之前的数据就ok了
  

delete from table_name where create_time < '2017-04-06'  

  只要执行这句SQL应该就可以了
  遇到的问题:
  

The total number of locks exceeds the lock table>  

  因为需要删除的数据太大,mysql给的buffer好像只有8MB左右(网上搜到的)
  后面找到DBA帮忙看,问这个表建了索引没有
  

show index from table_name  

  通过查看索引,我们在create_time和collect_time上是建了索引的,索引类型是BTree,ASC。这里我们用的Mysql引擎是InnoDb
  

delete from table_name where create_time < '2017-07-06'  order by create_time asc limit 10000  

  接着,我想用order by + limit实现删除,还是出现了上面的错误
  后面DBA提示我说,为啥不用ID删除,说按id删除,速度和按索引列删除,不是一个数量级的
  接着我想到了拆分一下。
  最终解决方案:
  找出符合条件的create_time和collect_time的最大ID
  

select max(id) from table_name where create_time < '2017-04-06'  

  这里千万左右的数据大概需要10多秒
  接着按id删除,一次删除10k,循环删除
  

delete from table_name where>  

  直到把过期的时间删除完成
  这里我没有msyql服务器的权限,通过java客户端连接删除,使用的spring jdbcTemplate这个接口
  另外,这里一次删除10k还有个原因是,事务太大,影响其他服务的运行
  还用到的技术,就是使用线程池来执行sql删除,实现异步删除。和同事吃饭的时候,同事也提供了一个解决方案,每次删一秒的数据,这样一次次的删。看了一下数据,一秒的数据基本在几十万,左右,这样不太好控制数据量大小。还是通过主键id + limit 10k这里稳妥一点。
  还有一点就是,为了怕压到mysql服务器,这里线程池删除的时候回sleep(1000),阻塞1s再删除,减轻mysql服务器的压力

  今天搞了一下数据删除这一点东西,感觉mysql水很深,比如一个select count(*)的执行过程,select from table_name order by>

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-423398-1-1.html 上篇帖子: Mysql binlog 日志 下篇帖子: Windows10系统下,彻底删除卸载MySQL
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表