mysql 生产库大表删除
一般线上业务增长较快,造成某些表达到分表的临界值,表行数超过2000w且查询频繁,如表业务没有较多的聚合查询的话,可以考虑按时间归档部分历史数据。现推荐2种本人之前使用过的删除方式。
按照主键或者索引拆分后分段执行,使用存储过程
需要注意这种大表删除,如果是在主库执行,尽量把会话改成语句格式,以保证不会出现复制延迟
语句如下:set session binlog_format=‘STATEMENT‘;
CREATE PROCEDURE sp_delete_data() BEGIN set session binlog_format=‘STATEMENT‘; label: WHILE (1 = 1) DO DELETE FROM table where aaa like ‘bbb%‘ LIMIT 10000; SET @a1 = ROW_COUNT(); IF @a1 = 0 THEN LEAVE label; END IF; END WHILE; END
limit使用的行数,可以线上测试下,在不影响业务库性能的情况下最大化删除行数。
2.使用percona tools中的pt-archiver来清理过期数据,做数据归档,也可以二者可以同时进行
需要注意参数为--limit 5000 --txn-size 5000性能调优参数具体值可以测试调整优化,尽量多事务提交以提高执行效率.
1)清理过期数据
pt-archiver --source h=localhost,P=3306,u=ceshi,p=111111,D=test,t=example --charset=UTF8 --purge --where ‘id<10000000‘ --progress 3000 --limit=3000 --txn-size=3000 --statistics
2)数据归档到本地或异地的另一张表,通过是否增加--no-delete来决定是否保留原表数据
pt-archiver --source h=localhost,P=3306,u=ceshi,p=111111,D=test,t=example --dest h=localhost,P=3306,u=ceshi,p=111111,D=test,t=example1 --charset=UTF8 --where ‘id<10000000‘ --progress 3000 --limit=3000 --txn-size=3000 --statistics
本文出自 “云淡风轻” 博客,谢绝转载!
原文地址:http://liuminkun.blog.51cto.com/10171900/1965144