mysql 生产库大表delete

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql 生产库大表delete相关的知识,希望对你有一定的参考价值。

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大表drop/truncate操作流程

MySQL大表清空和删除正确方法

大表分批删除脚本之MySQL版

MySQL8 大表清空和删除正确方法

MySQL 对于千万级的大表要怎么优化

MySQL使用硬链接的方式删除大表