MySQL 使用 pt-archiver 删除数据

文章目录

    • 前言
    • 1. 环境准备
      • 1.1 模拟造数
      • 1.2 工具安装
    • 2. 删除数据
      • 2.1 批次删除表
      • 2.2 原理解析
      • 2.3 批处理思路
    • 后记

前言

在线核心业务都会有日志表,随着业务持续运行,日志表每天都在增大,最后超过阈值触发空间使用率告警。DBA 处理空间告警时,会先导出一份表大小信息,然后发给研发确认,哪些表是可以清理些数据的,让研发先清理。如果没有清理空间就需要提审批扩容。
在这里插入图片描述
如果有数据可以清理,又分为 删库、清空表、删除表中部分数据 三种情况。前两种可以直接使用 MySQL 命令处理,第三种通常需要研发写一个任务批量删除,切忌不能直接 DELETE FROM xxxx 一张大表或者一次删几千万的数据,这样会造成集群出现很大的延迟,而且会产生一个巨大的 Binlog 文件,以及更多的锁争用情况。

本篇文章将为介绍如何使用 pt-archiver 分批清理表中的数据,以及写批次任务的思路。

1. 环境准备

1.1 模拟造数

接下来,模拟删除一张日志表的场景,以下是表结构。

CREATE TABLE `order_operation_log` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
  `order_id` bigint(20) DEFAULT NULL COMMENT '订单号',
  `order_num` varchar(16) DEFAULT NULL COMMENT '商品订单号',
  `operation_before` varchar(500) COMMENT '操作前',
  `operation_after` varchar(500) COMMENT '操作后',
  `operator_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '操作人id',
  `operator_name` varchar(30) NOT NULL DEFAULT '' COMMENT '操作人姓名',
  `operation_remark` varchar(255) DEFAULT NULL COMMENT '操作备注',
  `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='订单操作日志表'

为该表制造 1000w 行数据,如何造数可参考我之前的文章。

推荐阅读:MySQL 快速造数

mysql_random_data_load -h127.0.0.1 -u'root' -p'abc123' --max-threads=10 test order_operation_log 10000000

1.2 工具安装

本篇文章的主角 pt-archiver 包含在 Percona Toolkit 中,安装方法往期文章有介绍。

推荐阅读:Percona Toolkit 工具集安装

>> pt-archiver --version
pt-archiver 3.3.1

2. 删除数据

使用 pt-archiver 分批删除表中数据,生产环境推荐一次删除 2w 行,避免造成较大的主从延迟。

2.1 批次删除表

该命令表示删除 test 库下 order_operation_log 表全部数据,每次删除 1000 行。

pt-archiver --source h=127.0.0.1,P=3306,u=root,p=abc123,D=test,t=order_operation_log --where "id < 200000" --bulk-delete --limit 20000 --charset utf8 --progress 100000 --purge --commit-each

重要参数解释:

  • –source:表示源实例信息,后面 h、P、u、p、D、t 分别表示主机地址、端口、用户、密码、数据库名、表名。
  • –where:过滤条件,删除全表 1=1,删除部分数据可按需指定。
  • –bulk-delete:指批量删除。
  • –limit:每次批量的处理的行数。
  • –commit-each:对于每批数据,只提交一次。
  • –charset:连接数据库使用的字符集。
  • –progress:进度打印,删除多少行打印一次进度。
  • –purge:表示只删除数据。
  • –sleep:处理一批数据后,等待几秒后再继续执行。

2.2 原理解析

开启 general_log 日志,可以更直观的看到 pt-archiver 执行过程。

# 测试使用,limit 指定为 10
pt-archiver --source h=127.0.0.1,P=3306,u=root,p=abc123,D=test,t=order_operation_log --where "id < 200000" --bulk-delete --limit 10 --charset utf8 --progress 100000 --purge --commit-each
# 设置会话 autocommi = 0 每个操作需要用户 commit 提交事务
set autocommit=0

# 进入目标表,查看表结构,这里会选择主键或者唯一键,作为分批处理的过滤条件。
USE `test`
SHOW CREATE TABLE `test`.`order_operation_log`

# 确认 id 字段为过滤条件,获取 id 最大值
SELECT MAX(`id`) FROM `test`.`order_operation_log`

# 该步骤的目的是,获取 id 主键删除范围的最大值和最小值
SELECT /*!40001 SQL_NO_CACHE */ `id`,`order_id`,`order_num`,`operation_before`,`operation_after`,`operator_id`,`operator_name`,`operation_remark`,`created_at`,`updated_at` FROM `test`.`order_operation_log` FORCE INDEX(`PRIMARY`) WHERE (id < 200000) AND (`id` < '4940000') ORDER BY `id` LIMIT 10

# 基于查询查到的主键最大值和最小值,进行删除
DELETE FROM `test`.`order_operation_log` WHERE (((`id` >= '109853'))) AND (((`id` <= '109862'))) AND (id < 200000) LIMIT 10

# 提交事务
commit

# 执行第二次,获取主键的最大值和最小值
SELECT /*!40001 SQL_NO_CACHE */ `id`,`order_id`,`order_num`,`operation_before`,`operation_after`,`operator_id`,`operator_name`,`operation_remark`,`created_at`,`updated_at` FROM `test`.`order_operation_log` FORCE INDEX(`PRIMARY`) WHERE (id < 200000) AND (`id` < '4940000') AND ((`id` >= '109862')) ORDER BY `id` LIMIT 10

# 执行删除
DELETE FROM `test`.`order_operation_log` WHERE (((`id` >= '109863'))) AND (((`id` <= '109872'))) AND (id < 200000) LIMIT 10

# 提交事务
commit

2.3 批处理思路

在业务代码中,如果有类似需求,也可以借鉴 pt-archiver 的实现方式。不过在获取最大值最小值时,可不必返回所有数据。

以下是模拟的过程,由于用于测试,我们使用的是 limit 10,一般生产可一批删除 2w 行。

-- 开启事务
begin-- 获取范围
SELECT /*!40001 SQL_NO_CACHE */ min(id), max(id) from (SELECT `id` FROM `test`.`order_operation_log` FORCE INDEX(`PRIMARY`) WHERE (id < 200000) AND (`id` < '4940000') ORDER BY `id` LIMIT 10) as tmp;

输出结果:

+---------+---------+
| min(id) | max(id) |
+---------+---------+
|  111103 |  111112 |
+---------+---------+

按照范围,执行删除:

-- 执行删除
DELETE FROM `test`.`order_operation_log` WHERE (((`id` >= '111103'))) AND (((`id` <= '111112'))) AND (id < 200000) LIMIT 10
-- 提交事务
commit

得到结果:

Query OK, 10 rows affected (0.01 sec)

后记

MySQL 使用 DELETE 删除数据,并不会完成删除,而是打上删除标记,会出现碎片空间。如果要完全释放空间,需要重建表收缩空间碎片。

-- 低峰执行下方 SQL 即可收缩空间碎片,支持 online DDL
alter table table_name force, ALGORITHM=INPLACE, LOCK=NONE	

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/426808.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vue开发实例(十一)用户列表的实现与操作

用户列表的实现与操作 一、创建用户页面和路由二、表格优化1、表头自定义2、表格滚动3、加入数据索引4、利用插槽自定义显示 三、功能1、查询功能3、增加4、删除5、修改 一、创建用户页面和路由 创建用户页面 在 src/components/Main 下创建文件夹user&#xff0c;创建文件Us…

java spring 02. AbstractApplicationContext

spring创建对象的顺序&#xff0c;先创建beanfactory&#xff0c;再会把xml文件读取到spring。 public ClassPathXmlApplicationContext(String[] configLocations, boolean refresh, Nullable ApplicationContext parent)throws BeansException {//调用父类的构造方法super(p…

Django Web架构:全面掌握Django模型字段(上)

Django Web架构 全面掌握Django模型字段&#xff08;上&#xff09; - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article…

【机器人最短路径规划问题(栅格地图)】基于蚁群算法求解

代码获取方式&#xff1a;QQ&#xff1a;491052175 或者 私聊博主获取 基于蚁群算法求解机器人最短路径规划问题的仿真结果 仿真结果 收敛曲线变化趋势 蚁群算法求解最优解的机器人运动路径 各代蚂蚁求解机器人最短路径的运动轨迹

二、TensorFlow结构分析(1)

目录 1、TF数据流图 1.1 TensorFlow结构分析 1.2 案例 2、图与TensorBoard 2.1 图结构 2.2 图相关操作 2.2.1 默认图 2.2.2 创建图 2.3 TensorBoard&#xff1a;可视化学习 2.3.1 数据序列化 - events文件 2.3.2 启动TensorBoard 2.4 OP 2.4.1 常见OP 2.4.2 指令…

20.图

图的基本概念 1.图的定义 由顶点和边组成的集合&#xff0c;G(V,E) 2.基本概念 邻接点&#xff1a; 对于无向图u v来说&#xff0c;uv互为邻接点 对于有向图u->v来说&#xff0c;v是u的邻接点&#xff0c;但u不是v的临界点 路径&#xff1a; 一个顶点到另一个顶点所经过的…

【漏洞复现】通天星CMSV6车载监控平台getImage任意文件读取漏洞

Nx01 产品简介 深圳市通天星科技有限公司&#xff0c;是一家以从事计算机、通信和其他电子设备制造业为主的企业。通天星车载视频监控平台软件拥有多种语言版本。应用于公交车车载视频监控、校车车载视频监控、大巴车车载视频监控、物流车载监控、油品运输车载监控、警车车载视…

【数据结构】_包装类与泛型

目录 1. 包装类 1.1 基本数据类型和对应的包装类 1.2 &#xff08;自动&#xff09;装箱和&#xff08;自动&#xff09;拆箱 1.2.1 装箱与拆箱 1.2.2 自动&#xff08;显式&#xff09;装箱与自动&#xff08;显式&#xff09;拆箱 1.3 valueOf()方法 2. 泛型类 2.1 泛…

bert 相似度任务训练完整版

任务 之前写了一个相似度任务的版本&#xff1a;bert 相似度任务训练简单版本,faiss 寻找相似 topk-CSDN博客 相似度用的是 0&#xff0c;1&#xff0c;相当于分类任务&#xff0c;现在我们相似度有评分&#xff0c;不再是 0,1 了&#xff0c;分数为 0-5&#xff0c;数字越大…

ChatGPT最新功能“Text To Speech (TTS,文本转语音)”详细解读!

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;所以创建了“AI信息Gap”这个公众号&#xff0c;专注于分享AI全维度知识…

Windows环境MySQL全量备份+增量备份

一、环境准备 1.1.安装MySQL 在进行MySQL数据库备份和还原操作时&#xff0c;必须先提前安装好MySQL环境&#xff0c;且MySQL服务已成功开启 如果没有安装MySQL环境&#xff0c;可以参考博客&#xff1a;http://t.csdnimg.cn/h8bHl 如果已成功安装MySQL环境&#xff0c;打开…

Orbit 使用指南 02 | 在场景中生成原始对象| Isaac Sim | Omniverse

如是我闻&#xff1a; Orbit使用指南02将 深入探讨如何使用Python代码在Orbit中向场景生成各种对象&#xff08;或原始对象&#xff09;。一起探索如何生成地面平面、灯光、基本图形形状以及来自USD文件的网格。前置知识&#xff1a;如何生成空白场景&#xff0c;Orbit 使用指…

VUE实现Office文档在线编辑,支持doc/docx、xls/xlsx、ppt/pptx、pdf等

1.微软提供的在线Office预览&#xff08;只能预览&#xff0c;不能编辑&#xff09; https://view.officeapps.live.com/op/view.aspx?src服务器上文档地址&#xff08;http开头&#xff09; 2.国内在线Office方案&#xff1a; 腾讯文档、石墨文档、飞书 优势&#xff1a;跨…

paimon取消hive转filesystem

目录 概述实践关键配置spark sql 结束 概述 公司上一版本保留了 hive &#xff0c;此版优化升级后&#xff0c;取消 hive。 实践 关键配置 同步数据时&#xff0c;配置如下&#xff0c;将形成两个库 # ods库 CREATE CATALOG paimon WITH (type paimon,warehouse hdfs:///d…

CentOS配网报错:network is unreachable

常用命令&#xff1a; 打开&#xff1a; cd /etc/sysconfig/network-scripts/ 修改&#xff1a; vim ifcfg-ens33 打开修改&#xff1a; vim /etc/sysconfig/network-scripts/ifcfg-ens33 保存&#xff1a; 方法1&#xff1a;ESCZZ&#xff08;Z要大写&#xff09; 方…

熔断降级 spring事务

如果有事务处理&#xff0c;会先把事务的自动提交给关闭

Apache Flink连载(三十七):Flink基于Kubernetes部署(7)-Kubernetes 集群搭建-3

🏡 个人主页:IT贫道-CSDN博客 🚩 私聊博主:私聊博主加WX好友,获取更多资料哦~ 🔔 博主个人B栈地址:豹哥教你学编程的个人空间-豹哥教你学编程个人主页-哔哩哔哩视频 目录

32单片机基础:PWM驱动舵机,直流电机

PWM驱动舵机 接线图如上图所示。注意&#xff0c;舵机的5V 线不能接到面包板上的正极&#xff0c;面包板上的正极只有3.3V,是STM32提供的&#xff0c;所以要接到STLINK的5V, 我们如何驱动舵机呢&#xff1f;由之前我们介绍原理知道&#xff0c;要输出如下图对应的PWM波形才行…

202209 青少年软件编程等级考试Scratch二级真题

第 1 题 【 单选题 】 数字&#xff1a;1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;6&#xff0c;9&#xff0c;13&#xff0c;19&#xff0c;28&#xff0c;...的下一项是多少&#xff1f; A&#xff1a;37 B&#xff1a;39 C&#xff1a;41 D&#xff1a;47 …

爱奇艺2023年营收319亿元:完善服务价值感知,重构影视新生态

近日&#xff0c;爱奇艺&#xff08;NASDAQ:IQ&#xff09;发布截至2023年12月31日未经审计的第四季度和全年财报&#xff0c;这份财报被外界评价为“爱奇艺交出的年度最佳业绩”。 财报显示&#xff0c;爱奇艺全年总营收319亿元&#xff0c;同比增长10%&#xff1b;非美国通用…
最新文章