MYSQL删除大数据表经验总结
最近线上突然发现一张表每天会产生500w条的数据,一个月下来发现已经接近8000w条的数据,达到90G之大的数据,之前在系统没有升级之前一年才产生100w左右的记录,估计开发的程序或者逻辑出现问题了,不管怎么样,作为运维发生问题,第一时间先以解决问题为第一位,所以这里总结一下删除大表数据的经验。
方法1:重建表
数据较大直接通过where条件进行delete操作肯定不行,加索引的话也不行。MYSQL上delete加low_priorty,quick,ignore估计也帮助不大。
重建表过程如下:
1、把需要保留的数据insert到一张新表
INSERT INTO new_table SELECT * FROM source_table WHERE MODIFIEDTIME > date_sub(now(), interval 30 day);
2、使用RENAME表以原子方式移动原始表,并将副本重命名为原始名称
RENAME TABLE source_table TO source_table_old, new_table TO source_table;
3、删除原表
DROP TABLE source_table_old;
如果按照如上方式,INSERT
操作根据表大小不同,周期会很长以至N小时都完成不了,如果你线上是MYSQL是在线服务的,这种方法就不可取,会造成INSERT
漫长时间过程中丢失的数据。
参考:
https://my.oschina.net/zimingforever/blog/91287 https://dev.mysql.com/doc/refman/5.6/en/delete.html
方法2:拆分SQL执行
拆分SQL执行就是把需要删除的数据做在线删除,单独按照条件做删除的话会造成锁表的情况,会导致数据丢失的情况,所以我们可以把需要删除的数据把ID查询出来,然后循环ID列表逐渐删除,操作如下。
1、查询需要删除数据的ID定向到文件中
mysql -u'xxx' -p'ooo' db_name -Bse "select id from source_table" >> /data/delete_id.txt
2、遍历ID文件做删除操作
#!/bin/bash
# Create Date: 2018-03-29 18:51:39
# Last Modified: 2018-03-29 20:06:10
# Author: nock
for id in $(cat /data/delete_id.txt);do
mysql -u'xxx' -p'ooo' db_name -Bse "delete from source_table where ID='${id}';" if [ $? -eq 0 ];then echo $id >> /data/tag-id.txt ;fi
done
但是delete
操作存储数据碎片的问题,MyISAM
和InnoDB
引擎还是有区别的,后面的文章会详细介绍。
方法3:切换主从
主从切换执行过程如下:
1、暂停主从同步
slave stop;
2、删除需要删除的数据
delete from source_table where MODIFIEDTIME < date_sub(now(), interval 30 day);
3、重启开启主从同步
slave start;
4、切换IP
把业务上连接MYSQL的应用程序IP地址都更换,然后按照业务逻辑,按照优先级重启程序。
总结
如上三种方式切换主从是我最推荐的,我线上最终也是决定切换主从来解决大数据表数据删除的问题,因为数据越大方法1、2时间都会较长,而且还有丢失数据的风险。
后面准备针对这个大表做定期数据规定或者写脚本做定期删除操作,但是删除后表优化的情况我们后面讨论。
- 独家 | 手把手教TensorFlow(附代码)
- HBase Region自动切分细节
- eclipse搭建ssh后台
- 解决mysql漏洞 Oracle MySQL Server远程安全漏洞(CVE-2015-0411)
- im4java包处理图片
- centOS7 mini配置linux服务器(五) 安装和配置tomcat和mysql
- RedisPool操作Redis,工具类实例
- centOS7 mini配置linux服务器(四) 配置jdk
- 老司机教你“飙”EventBus3
- Android listView异步下载和convertView复用产生的错位问题
- 实用Android 屏幕适配方案分享
- java-FFmpeg(一) 实现视频的转码和截图功能
- websocket(二) websocket的简单实现,识别用户属性的群聊
- websocket教程(一) 非常有趣的理解websocket
- MySQL 教程
- MySQL 安装
- MySQL 管理与配置
- MySQL PHP 语法
- MySQL 连接
- MySQL 创建数据库
- MySQL 删除数据库
- MySQL 选择数据库
- MySQL 数据类型
- MySQL 创建数据表
- MySQL 删除数据表
- MySQL 插入数据
- MySQL 查询数据
- MySQL where 子句
- MySQL UPDATE 查询
- MySQL DELETE 语句
- MySQL LIKE 子句
- mysql order by
- Mysql Join的使用
- MySQL NULL 值处理
- MySQL 正则表达式
- MySQL 事务
- MySQL ALTER命令
- MySQL 索引
- MySQL 临时表
- MySQL 复制表
- 查看MySQL 元数据
- MySQL 序列 AUTO_INCREMENT
- MySQL 处理重复数据
- MySQL 及 SQL 注入
- MySQL 导出数据
- MySQL 导入数据
- MYSQL 函数大全
- MySQL Group By 实例讲解
- MySQL Max()函数实例讲解
- mysql count函数实例
- MYSQL UNION和UNION ALL实例
- MySQL IN 用法
- MySQL between and 实例讲解
- 达梦数据库、oracle数据库如何判断指定表有没有建立索引?对应的表有没有索引查询方法
- Linux服务器运行sh文件提示权限不够解决方法?飞腾服务器Permission denied问题授权方法
- 不支持图形化界面的Linux系统如何显示图像化界面?飞腾服务器显示图像化界面方法,DISPLAY environment variable is undefined问题解决方法
- 一分钟学Python| Python的函数(上)
- 数据分析与数据挖掘 - 07数据处理
- MySql8.0.19最新版本创建用户分配权限演示,You have an error in your SQL syntax权限分配问题解决方法
- linux服务器oracle数据库导出dmp文件功能演示,备份数据库命令。exp命令显示command not found解决方法,EXP-00028: 无法打开dmp进行写入问题解决
- oracle数据库exp命令导入导出dmp文件演示,oracle数据库备份还原功能
- oracle数据库impdp导入dmp文件功能演示,imp导入IMP-00038: Could not convert to environment character sets handle问题解决
- 弄懂这 5 个问题,拿下 Python 迭代器!
- windows、linux下命令行登录oracle数据库方法,查询sga参数值sql语句
- oracle数据库查询open_cursors值的sql语句,达梦数据库查询MAX_SESSION_STATEMENT值方法,MAX_SESSION_STATEMENT的最大值、上限是多少。
- 达梦数据库启用日志方法,达梦数据库查看日志是否启用,达梦数据库日志文件位置查找
- JavaScript 技术篇 - js 查看哪个元素获取了焦点,js 指定元素获取焦点方法
- 工作10年后,再看String s = new String("xyz") 创建了几个对象?