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