pt-archiver的实践分享,及为何要用 ob-archiver 归档数据的探讨

news2024/11/18 1:36:40

作者简介:肖杨,软件开发工程师

在数据密集型业务场景中,数据管理策略是否有效至关重要,它直接关系到系统性能与存储效率的提升。数据归档作为该策略的关键环节,不仅有助于优化数据库性能,还能有效降低存储成本。

在众多数据归档工具中,pt-archiver 深受 MySQL 用户青睐。我撰写此博客的目的,正是为了分享我对 pt-archiver 的亲身体验与深入测试,为大家提供一份详尽的试用报告。同时,我也借此机会向大家介绍我最近开发的 ob-archiver,这是一款专为 OceanBase 设计的数据归档命令行工具,期待能为大家带来便利与帮助。

​​​​​​​

1. pt-archiver 上手体验

最近在调研数据生命周期管理相关的工具,了解到 Percona-Toolkit 工具集中的 pt-archiver 很受 MySQL 用户的欢迎,于是打算上手体验下。Percona-Toolkit 工具集中包含了 30 多个命令行工具,已经开源了(GitHub - percona/percona-toolkit: Percona Toolkit: a collection of advanced open source command-line tools.),并且收获了 900+ Star。

废话不多说,直接上手试试吧~

1.1. 安装

# percona-toolkit 依赖 perl 环境库,需要提前安装
sudo yum install perl-DBI perl-DBD-MySQL perl-IO-Socket-SSL perl-Digest-MD5 perl-TermReadKey

# 安装 percona-toolkit rpm 包
sudo rpm -ivh percona-toolkit-3.5.5-1.el7.x86_64.rpm

# 验证 pt-archiver 命令是否可用
pt-archiver --version

1.2. 准备环境

pt-archiver 是针对 MySQL 设计的,没有对 OceanBase MySQL 模式做兼容处理。我这里使用的是 MySQL 5.7.42。

源端数据库/源表:gaoda_archive_source/employee

目标数据库/归档表:gaoda_archive_dest/employee_arc

源表的基本信息:1,000,000 rows with 6 columns

源表 DDL:

CREATE TABLE `employee` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `birthday` datetime DEFAULT NULL,
  `weight` double DEFAULT NULL,
  `gender` enum('MALE','FEMALE') DEFAULT NULL,
  `description` tinytext,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8

1.3. 场景一:表归档到表

1. 在目标数据库新建相同结构的归档表(必须提前新建,否则会报错)

2. 逐行归档表数据,且不删除源端表已归档数据

3. 查看归档表数据

4. TRUNCATE 归档表,然后在上述命令增加 --limit 和 --bulk-insert 选项以批量归档

1.4. 场景二:表归档到文件

1. 归档 100,000 行表数据到文件(需要确保文件路径已存在)

2. 查看归档文件

1.5. 场景三:数据清理

1. 通过 --purge 选项执行清理,通过 --dry-run 选项可以打印 SQL 并退出而不执行任何操作(类似 EXPLAIN SQL)

2. 删除命令中的--dry-run 选项,执行数据清理

1.6. 体验小结

pt-archiver 的试用过程是比较丝滑的。作为命令行工具,其安装和使用方法简单、参数清晰易懂、日志可读性好。最重要的是轻量化,轻量化,还是 xxx 轻量化,不需要打开任何专业软件就能归档大批量数据,这体验真的很爽啊。另外 --dry-run 选项查看执行计划的功能非常亮眼。

2. pt-archiver 深入测试

用起来很爽,但我更想了解 pt-archiver 归档、清理数据的底层逻辑,比如它的数据查询和删除策略、如何保障归档准确性。PT 官方描述是:

The strategy is to find the first row(s), then scan some index forward-only to find more rows efficiently. Each subsequent query should not scan the entire table; it should seek into the index, then scan until it finds more archivable rows.

数据归档中,为了保障数据一致性和表查询效率,应该会对表结构(主键、索引、约束等)和 WHERE 条件(引用的列是否为索引列等)有一定的要求。pt-archiver 并没有在文档中作出明确说明,因此需要通过更深度地测试,分析其功能细节和使用限制。

2.1. 索引与约束

在下面的测试中,约束全部使用主键约束,索引全部使用普通索引。

先说结论:pt-archiver 数据归档时,要求源表有主键或至少包含一个索引(任意类型),对 WHERE 条件中引用的列没有特殊要求。如果表中存在主键,则使用主键拼接 WHERE 子句,并使用 ORDER BY 按序查询,使用 LIMIT 分批操作;如果表中不存在主键,则使用第一个索引。另外,pt-archiver 会添加 WHERE 子句条件限制具有 AUTO_INCREMENT 属性字段所对应的数据行操作(目的是为了在数据库重启之后,之前 AUTO_INCREMENT 的值还可以使用)。

以下是我的测试过程,不需要关注的同学建议直接跳过哈,因为太枯燥了~

2.1.1. 表-无主键无索引

CREATE TABLE `table_without_pk_and_index` (
  `col1` varchar(120) DEFAULT NULL,
  `col2` varchar(120) DEFAULT NULL,
  `col3` varchar(120) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8

运行报错:"Cannot find an ascendable index in table at /usr/bin/pt-archiver line 3262, <STDIN> line 2"。尝试通过使用 --no-ascend 并取消 --no-delete 选项来禁用升序索引优化(直译的,官方描述是 Ascending Index Optimization),仍然报上述错误,可以确认 必须要有约束或索引

2.1.2. 表-有主键无索引

CREATE TABLE `table_only_with_pk` (
  `col1` varchar(120) NOT NULL,
  `col2` varchar(120) DEFAULT NULL,
  `col3` varchar(120) DEFAULT NULL,
  PRIMARY KEY (`col1`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

1. where 条件使用主键(varchar 类型):执行成功,数据准确

2. where 条件使用非主键:执行成功,数据准确

使用 --dry-run查看执行 SQL 可以发现,pt-archiver 会主动去寻找主键,并利用主键 order by 和 limit 来实现 forward 寻找列,并不依赖 WHERE 条件指定索引列

3. where 条件使用主键和非主键:执行成功,数据准确

2.1.3. 表-无主键有索引

1. 仅有一个索引

CREATE TABLE `table_only_with_index` (
  `col1` varchar(255) DEFAULT NULL,
  `col2` varchar(255) DEFAULT NULL,
  `col3` varchar(255) DEFAULT NULL,
  KEY `idx_col1` (`col1`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

   a. where 条件使用索引:执行成功,数据准确

   b. where 条件使用非索引:执行成功,数据准确

使用 --dry-run查看执行 SQL 可以发现,pt-archiver 会主动去寻找索引列,并利用索引列 order by 和 limit 来实现 forward 寻找列,并不依赖 WHERE 条件指定索引列,不过其 SQL 的 WHERE 子句的拼接与主键存在差异

注意,这种情况下,理论上存在丢数据风险,下文会给出复现案例。

   c. where 条件使用索引和非索引:执行成功,数据准确

2. 存在多个索引

CREATE TABLE `table_only_with_multi_index` (
  `col1` varchar(255) DEFAULT NULL,
  `col2` varchar(255) DEFAULT NULL,
  `col3` varchar(255) DEFAULT NULL,
  `col4` varchar(255) DEFAULT NULL,
  KEY `idx_col1` (`col1`),
  KEY `idx_col2` (`col2`),
  KEY `idx_col3` (`col3`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

当表中没有主键,但是存在多个索引时,pt-archiver 默认只会使用第一个索引

如果使用 --no-ascend 选项来关闭升序索引优化,并删除 --no-delete 选项来及时清理已归档的数据,则 SELECT 语句中直接不会使用任何索引:

2.1.4. 表-有主键有索引

CREATE TABLE `table_with_pk_and_index` (
  `col1` varchar(255) NOT NULL,
  `col2` varchar(255) DEFAULT NULL,
  `col3` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`col1`),
  KEY `idx_col2` (`col2`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

如果表中同时存在主键和索引,则 pt-archiver 在查询中只会使用主键

1. where 条件使用非索引列

2. where 条件使用索引列

2.2. 异常案例——归档时漏数据

源表结构和数据如下:

CREATE TABLE `table_for_test` (
  `col1` varchar(120) DEFAULT NULL,
  `col2` varchar(120) DEFAULT NULL,
  `col3` varchar(120) DEFAULT NULL,
  KEY `idx_col1` (`col1`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8

使用 pt-archiver 归档 WHERE col3 < 'j' 的数据,并且保留源端数据,执行以下命令:

pt-archiver --source h=xxx,P=3307,u=root,D=gaoda_archive_source,t=table_for_test,A=utf8 --dest h=xxx,P=3307,u=root,D=gaoda_archive_dest,t=table_for_test_arc,A=utf8 --charset=utf8 --where "col3 < 'j'" --progress 1 --txn-size=1 --statistics --no-delete --ask-pass --limit=5 --bulk-insert

预期应该归档 9 行数据,实际只归档了 7 条数据:

原因分析如下:

2.3. 原理浅析

根据前面的测试结果,推测 pt-archiver 的执行流程如下:

3. ob-archiver 来啦!

3.1. 功能简介

在 MySQL 领域,pt-archiver 以其轻量化、快捷易用而广受欢迎。然而在处理 OceanBase 数据库时,会遇到不兼容和效率不佳的问题:

  • 4.x 版本 OB,无法使用--bulk-insert批量插入功能。使用普通插入模式可以规避,但是性能差距约 6.5 倍
  • 3.x 版本 OB,所有功能都无法使用,语法不支持
  • 所有版本都无法设置--charset=UTF8,因为 OB 用的是 utf8mb4

针对这一问题,我们开发了 ob-archiver。ob-archiver 是基于 OceanBase ODC 数据归档引擎 打造的轻量化命令行工具,兼容 pt-archiver 的命令行选项,并对 OceanBase 数据库提供原生支持和更强大的性能:

  • 支持 MySQL 和 OceanBase MySQL 模式
  • 支持数据限流
  • 支持数据分片并发处理

「 后续会有文章揭秘 OceanBase ODC 数据归档引擎关键技术原理,例如断点恢复数据校验多维度限流自动分片等,敬请期待 😚 」

3.2. 使用样例

源表结构:

使用 ob-archiver 归档并清理源表中 col1 列在 200,000 和 700,000 之间的 499,999 行数据:

3.3. 下载使用

下载 ob-archiver 软件包并解压,按 README.md 文档指引使用。

ob-archiver-1.0.0-beta.tar.gz (15 MB)

ob-archiver-1.0.0-beta.zip (15 MB)

【结尾小彩蛋】 🎉

如果你不喜欢使用命令行工具,推荐使用 ODC(OceanBase Developer Center)体验完整的数据生命周期管理能力。可以通过 GUI 界面点点点,创建定时任务进行数据归档和清理工作,还支持断点恢复,从此解放双手,岂不美哉!点此直达。

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

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

相关文章

Android-Handler详解_使用篇

本文我将从Handler是什么、有什么、怎们用、啥原理&#xff0c;四个方面去分析。才疏学浅&#xff0c;如有错误&#xff0c;欢迎指正&#xff0c;多谢。 1.是什么 因为Android系统不允许在子线程访问UI组件&#xff0c;否则就会抛出异常。所以咱们平实用的最多的可能是在子线…

「媒体宣传」如何针对不同行业制定媒体邀约方案

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 针对不同行业制定媒体邀约方案时&#xff0c;需要考虑行业特点、目标受众、媒体偏好以及市场趋势等因素。 一、懂行业 先弄清楚你的行业是啥样&#xff0c;有啥特别之处。 了解行业的热…

【地图构建(1)】占用栅格地图构建Occupancy grid mapping

本文主要参考Probabilistic Robotics《概率机器人》一书。 其他参考&#xff1a; 弗莱堡大学课件 博客 含代码博客 0.引言 位姿已知的地图构建(mapping with known poses)的定义&#xff1a;已知机器人的位姿 x 1 : t x_{1:t} x1:t​和传感器的观测数据 z 1 : t z_{1:t} z1:t…

绝地求生:报告长官!速去领取PUBG7周年礼包及7周年活动攻略【附方法】

奖励都需要长官们绑定全球账号&#xff0c;在游戏个人资料处查看是否有绑定&#xff01; PUBG七周年礼包详情&#xff1a; 包含7周年快乐甜筒帽 7周年快乐背包&#xff08;3级&#xff09; 戴墨镜的幽灵 黑货票券 x30 档案管理员宝箱 x1 钥匙 x1 绑定ID登录&#xff0c;或…

【FIneBI可视化工具的使用】

前言&#xff1a; &#x1f49e;&#x1f49e;大家好&#xff0c;书生♡&#xff0c;今天主要和大家分享一下可视化的工具FineBI的详细使用,希望对大家有所帮助。感谢大家关注点赞。 &#x1f49e;&#x1f49e;前路漫漫&#xff0c;希望大家坚持下去&#xff0c;不忘初心&…

大型驱动水冷负载电阻、缓冲器、滤波器和快速放电电阻

EAK业界首创双面水冷负载电阻器&#xff0c;独特的设计&#xff0c;用户更方便的串联并联使用&#xff0c;强大的水流带走更多因充放电带来的热量。AlN高可靠性氮化铝基板保证了热膨胀不会影响电阻的工作。 液冷电阻器使用水或离子水作为冷却剂。通过添加乙二醇&#xff0c;可以…

单调栈(C++)

单调栈,即栈中元素是单调递增的或是单调递减的,是一个比较好用的数据结构. 柱状图中最大的矩形 84. 柱状图中最大的矩形 - 力扣&#xff08;LeetCode&#xff09; 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。…

【SAP2000】在框架结构中应用分布式面板荷载Applying Distributed Panel Loads to Frame Structures

在框架结构中应用分布式面板荷载 Applying Distributed Panel Loads to Frame Structures 使用"Uniform to Frame"选项,可以简单地将荷载用于更多样化的情况。 With the “Uniform to Frame” option, loads can be easily used for a greater diversity of situat…

【书生·浦语大模型实战营第二期】学习笔记1

1. Introduction 开源llm举例&#xff1a;LLaMA 、Qwen 、Mistral 和Deepseek 大型语言模型的发展包括预训练、监督微调&#xff08;SFT&#xff09;和基于人类反馈的强化学习&#xff08;RLHF&#xff09;等主要阶段 InternLM2的显著特点 采用分组查询注意力&#xff08;GQA…

蓝桥杯基础练习汇总详细解析(三)——字母图形、01字符串、闰年判断(详细解题思路、代码实现、Python)

试题 基础练习 字母图形 提交此题 评测记录 资源限制 内存限制&#xff1a;256.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 问题描述 利用字母可以组成一些美丽的图形&#xff0c;下面给出了一个例子&#…

web开发发展历程-前端、后端、消息队列、后端架构演进

文章目录 摘要主要内容不同的时代对应不同的技术前端技术的中间阶段-单页面应用前后端分离后端技术演化-云计算平台总体趋势反应式编程 消息队列发展史kafka&#xff0c;rocketmq&#xff0c;pulsar网易后端架构演进架构瓶颈数据库瓶颈服务器瓶颈数据库缓存瓶颈-缓存击穿、雪崩…

Spring Boot:Web开发之三大组件的整合

Spring Boot 前言Spring Boot 整合 ServletSpring Boot 整合 FilterSpring Boot 整合 Listener 前言 在 Web 开发中&#xff0c;Servlet 、Filter 和 Listener 是 Java Web 应用中的三大组件。Servlet 是 Java 代码&#xff0c;通过 Java 的 API 动态的向客户端输出内容。Filt…

7.3*3卷积核生成

1.卷积核 在数字图像处理中的各种边沿检测、滤波、腐蚀膨胀等操作都离不开卷积核的生成。下面介绍如何生成各种3X3的卷积核。为后面的数字图像操作打下基础。   由于图像经过卷积操作后会减少两行两列&#xff0c;因此在生成卷积核的时候一般会对图像进行填充&#xff0c;填充…

day 36 贪心算法 part05● 435. 无重叠区间 ● 763.划分字母区间 ● 56. 合并区间

一遍过。首先把区间按左端点排序&#xff0c;然后右端点有两种情况。 假设是a区间&#xff0c;b区间。。。这样排列的顺序&#xff0c;那么 假设a[1]>b[0],如果a[1]>b[1]&#xff0c;就应该以b[1]为准&#xff0c;否则以a[1]为准。 class Solution { public:static bo…

一个基于.NET Core构建的简单、跨平台、模块化的商城系统

前言 今天大姚给大家分享一个基于.NET Core构建的简单、跨平台、模块化、完全开源免费&#xff08;MIT License&#xff09;的商城系统&#xff1a;Module Shop。 商城后台管理端功能 商品&#xff1a;分类、品牌、单位、选项&#xff08;销售属性&#xff09;、属性、属性模…

人脸68关键点与K210疲劳检测

目录 人脸68关键点检测 检测闭眼睁眼 双眼关键点检测 计算眼睛的闭合程度&#xff1a; 原理: 设置阈值进行判断 实时监测和更新 拓展&#xff1a;通过判断上下眼皮重合程度去判断是否闭眼 检测嘴巴是否闭合 提取嘴唇上下轮廓的关键点 计算嘴唇上下轮廓关键点之间的距…

LangChain入门:2.OpenAPI调用ChatGPT模型

快速入门 本篇文章正式进入LangChain的编码阶段&#xff0c;今天实现的功能是使用OpenAPI调用ChatGPT模型来进行文本问答。 1. 申请OpenAPI的访问令牌 这里介绍两种获取到OpenAPI访问令牌的方式&#xff0c;大家按照自己需求进行选择&#xff0c;之后的文章我会基于第二种选…

政安晨:【深度学习神经网络基础】(二)—— 神经元与层

政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: 政安晨的机器学习笔记 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff01; 神经元是深度学习神经网络中的基本单元&#xff0c;模拟了…

淘宝详情数据采集(商品上货,数据分析,属性详情,价格监控),海量数据值得get

淘宝详情数据采集涉及多个环节&#xff0c;包括商品上货、数据分析、属性详情以及价格监控等。在采集这些数据时&#xff0c;尤其是面对海量数据时&#xff0c;需要采取有效的方法和技术来确保数据的准确性和完整性。以下是一些关于淘宝详情数据采集的建议&#xff1a; 请求示…

DevSecOps平台架构系列-互联网企业私有化DevSecOps平台典型架构

目录 一、概述 二、私有化DevSecOps平台建设思路 2.1 采用GitOps公有云建设 2.2 采用GitOps私有云建设 2.3 总结 三、GitOps及其生态组件 3.1 采用GitOps的好处 3.1.1 周边生态系统齐全 3.1.2 便于自动化的实现 3.1.3 开发人员属性GitOps 3.2 GitOps部分生态组件介绍…