码迷,mamicode.com
首页 > 数据库 > 详细

mysql 生产库大表delete

时间:2017-09-14 18:40:27      阅读:173      评论:0      收藏:0      [点我收藏+]

标签:mysql 数据清理 数据归档

mysql 生产库大表删除


一般线上业务增长较快,造成某些表达到分表的临界值,表行数超过2000w且查询频繁,如表业务没有较多的聚合查询的话,可以考虑按时间归档部分历史数据。现推荐2种本人之前使用过的删除方式。


  1. 按照主键或者索引拆分后分段执行,使用存储过程

    需要注意这种大表删除,如果是在主库执行,尽量把会话改成语句格式,以保证不会出现复制延迟

    语句如下: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


本文出自 “云淡风轻” 博客,谢绝转载!

mysql 生产库大表delete

标签:mysql 数据清理 数据归档

原文地址:http://liuminkun.blog.51cto.com/10171900/1965144

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!