MySQL 使用 pt-archiver 删除数据

news2024/11/18 13:38:50

文章目录

    • 前言
    • 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.coloradmin.cn/o/1479035.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

WPF 滑动条样式

效果图&#xff1a; 浅色&#xff1a; 深色&#xff1a; 滑动条部分代码&#xff1a; <Style x:Key"RepeatButtonTransparent" TargetType"{x:Type RepeatButton}"><Setter Property"OverridesDefaultStyle" Value"true"/&g…

探索反距离加权的深度:一种用于地理数据分析的空间插值方法

目录 一、介绍 二、方法论 三、应用 四、优势 五、局限性 六、代码 七、结论 一、介绍 反距离加权 &#xff08;IDW&#xff09; 是一种广泛用于地理信息系统 &#xff08;GIS&#xff09; 和环境科学的空间插值技术&#xff0c;用于根据附近位置的值估计任何位置的缺失值。它的…

『Linux从入门到精通』第 ㉒ 期 - 动静态库

文章目录 &#x1f490;专栏导读&#x1f490;文章导读&#x1f427;什么是库&#xff1f;&#x1f427;为什么要有库&#xff1f;&#x1f427;写一个自己的库&#x1f426;方法一&#x1f426;方法二 静态库&#x1f426;标准化&#x1f426;方法三 动态库&#x1f426;配置动…

小马识途营销顾问解析舆情处置方法

大部分知名企业都逃不过负面舆情这一关&#xff0c;有负面不一定企业就不规范&#xff0c;产品就不好。其实&#xff0c;企业做大了&#xff0c;难以做到尽善尽美&#xff0c;有时候是同行不正当竞争造成的…… 总之&#xff0c;网络平台上面的负面舆情信息的影响不可小视&…

深入Linux内核(进程篇)—进程切换之ARM体系架构 简单总结

context_switch函数完成Arm架构Linux进程切换&#xff0c;调用两个函数&#xff1a; 调用switch_mm() 完成用户空间切换&#xff0c;刷新I-CACHE&#xff0c;处理ASID和TLB&#xff0c;页表转换基址切换&#xff08;即把TTBR0寄存器的值设置为新进程的PGD&#xff09;&#xf…

软件更新快讯-Obsidian更新-1.5.8 linux Appimage直装

更新内容 1.5.8&#xff1a; 从具有相同属性的文件导航时&#xff0c;固定属性不会显示。 修复了Home和End在导航文档顶部和底部时不总是起作用的问题。 Fixed properties not appearing when navigating from a file that has the same properties.Fixed Home and End not a…

uniapp实战:父子组件传参之子组件数量动态变化

需求说明 现有的设置单元列表,每个带有虚线加号的可以看做是一组设置单元,点击加号可以添加一组设置单元.点击设置单元右上角可以删除对应的设置单元. 实现思路说明 利用数组元素添加或是删除的方式实现页面数量动态变化.由于每个设置单元内容都相同所以单独封装了一个子组件.…

k8s 集群调度,标签,亲和性和反亲和性,污点和容忍,pod启动状态 排错详解

目录 pod启动创建过程 kubelet持续监听的原因 调度概念 调度约束 调度过程 优点 原理 优先级选项 示例 指定调度节点 标签基本操作 获取标签帮助 添加标签&#xff08;Add Labels&#xff09;&#xff1a; 更新标签&#xff08;Update Labels&#xff09; 删除标…

怎么判断主机电源有没有坏?是电源开关键

如何判断主机电源是否坏了&#xff1f; 关闭计算机电源&#xff0c;然后打开主机箱并取出电源。 因为电源线都是接在主板上的&#xff0c;所以可以先拍张照片&#xff0c;这样就可以知道哪根线是哪根了。 然后轻轻地拉出线。 如下图所示&#xff0c;电源线已从主板等处拔掉。…

electron打包前端项目

1.npm run build 打包项目文件到disk文件夹 2.安装electron:npm install electron 打开后进到/dist里面 然后把这个项目的地址配置环境变量 配置环境变量&#xff1a;在系统变量的path中添加进去 配置成功后&#xff0c;electron -v看看版本。 3.创建主程序的入口文件main.…

如何修改“Ubuntu 主机名“Windows系统?

一、修改&#xff08;node2&#xff09; hostnamectl set-hostname node2 二、重启 sudo reboot now

Linux系统加固:限制root用户SSH远程登录

Linux系统加固&#xff1a;限制root用户SSH远程登录 一、前言二、禁止root用户远程登录系统1、执行备份2、先新建一个普通用户并设置高强度密码3、编辑/etc/ssh/sshd_config文件4、重启SSH服务5、补充&#xff1a;查看ssh协议版本 三、验证root用户是否可以远程登录系统 &#…

(k8s中)docker netty OOM问题记录

1、首先查看docker的内存占用情况&#xff1a; docker top 容器名 -u 查看内存cpu占用率&#xff08;容器名来自kubectl describe pod xxx或者docker ps&#xff09; 可以看出内存一直增长&#xff0c;作为IO代理这是不正常的。 2、修改启动参数和配置文件 需要注意的是为了…

WiFi模块推动远程医疗和健康监测的革命

随着科技的不断进步&#xff0c;WiFi模块在医疗领域的应用正推动着远程医疗和健康监测的革命。这一技术的引入不仅提高了医疗服务的效率&#xff0c;也为患者提供了更为便捷、智能的医疗体验。本文将深入探讨WiFi模块如何推动远程医疗和健康监测。 实时健康监测 WiFi模块在医疗…

灰度负载均衡和普通负载均衡有什么区别

灰度负载均衡&#xff08;Gray Load Balancing&#xff09;与普通负载均衡的主要区别在于它们服务发布和流量管理的方式。 灰度负载均衡 目的&#xff1a;主要用于灰度发布&#xff0c;即逐步向用户发布新版本的服务&#xff0c;以减少新版本可能带来的风险。工作方式&#x…

模拟算法题练习(一)

模拟算法介绍&#xff1a; 模拟算法通过模拟实际情况来解决问题&#xff0c;一般容易理解但是实现起来比较复杂&#xff0c;有很多需要注意的细节&#xff0c;或者是一些所谓很“麻模“的东西。 模拟题一般不涉及太难的算法&#xff0c;一般就是由较多的简单但是不好处理的部…

OD(12)之Mermaid思维导图(Mindmap)

OD(12)之Mermaid思维导图(Mindmap)使用详解 Author: Once Day Date: 2024年2月29日 漫漫长路才刚刚开始… 全系列文章可参考专栏: Mermaid使用指南_Once_day的博客-CSDN博客 参考文章: 关于 Mermaid | Mermaid 中文网 (nodejs.cn)Mermaid | Diagramming and charting tool…

JVM运行流程

⭐ 作者&#xff1a;小胡_不糊涂 &#x1f331; 作者主页&#xff1a;小胡_不糊涂的个人主页 &#x1f4c0; 收录专栏&#xff1a;JavaEE &#x1f496; 持续更文&#xff0c;关注博主少走弯路&#xff0c;谢谢大家支持 &#x1f496; JVM 1. 运行流程2. 运行时数据区2.1 堆&am…

鸿蒙Harmony应用开发—ArkTS声明式开发(焦点事件)

焦点事件指页面焦点在可获焦组件间移动时触发的事件&#xff0c;组件可使用焦点事件来处理相关逻辑。 说明&#xff1a; 从API Version 8开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 目前仅支持通过外接键盘的tab键、方向键触发。不支…

BEANZ NFT 概览与数据分析

作者&#xff1a;stellafootprint.network 编译&#xff1a;cicifootprint.network 数据源&#xff1a;BEANZ NFT Collection Dashboard 2022 年 3 月 31 日&#xff0c;BEANZ NFT 的出现给 Azuki NFT 持有者带来了惊喜&#xff0c;成为 Azuki NFT 的亲密伙伴。这个 NFT …