优雅地使用pt-archiver进行数据归档

本文涉及的产品
RDS AI 助手,专业版
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
简介: 一、引言 最近由于业务需求,需要将公有云RDS(业务库)的大表数据归档至私有云MySQL(历史库),以缩减公有云RDS的体积和成本。 那么问题来了,数据归档的方式有n种,选择哪种呢?经过一番折腾,发现使用percona的pt-archiver就可以轻松并优雅地对MySQL进行数据归档。
7317b2bf9c910bcf1ecb7c629ead4ac2ad8d6df5

一、引言

最近由于业务需求,需要将公有云RDS(业务库)的大表数据归档至私有云MySQL(历史库),以缩减公有云RDS的体积和成本。

那么问题来了,数据归档的方式有n种,选择哪种呢?经过一番折腾,发现使用percona的pt-archiver就可以轻松并优雅地对MySQL进行数据归档。

待我娓娓道来~

1.1 pt-archive是啥

属于大名鼎鼎的percona工具集的一员,是归档MySQL大表数据的最佳轻量级工具之一。

注意,相当轻,相当方便简单。

1.2 pt-archive能干啥

  • 清理线上过期数据;
  • 导出线上数据,到线下数据作处理;
  • 清理过期数据,并把数据归档到本地归档表中,或者远端归档服务器。

二、基本信息

2.1 MySQL环境

0943088ab6ea0b21de9535ace36fbe33c85b9dff

2.2 pt-archiver信息

a503ee9975545f14614ba196999d1767ec516057

2.3 归档表信息

aca6666fb35f4edd98f881c77e5b05b78ad84a9d

注意:pt-archiver操作的表必须有主键

d4c8f64a3e0ada4a2210dd5c690fa60663554d00

三、模拟场景

3.1 场景1-1:全表归档,不删除原表数据,非批量插入


pt-archiver \
--source h=10.73.129.187,P=3306,u=backup_user,p='xxx',D=test123,t=c1 \
--dest h=10.73.129.188,P=3306,u=backup_user,p='xxx',D=test123,t=c1 \
--charset=UTF8 --where '1=1' --progress 10000 --limit=10000 --txn-size 10000 --statistics --no-delete

f522591bb4ee06259c6c2b60eff97ada10d5f15d

3.2 场景1-2:全表归档,不删除原表数据,批量插入

pt-archiver \
--source h=10.73.129.187,P=3306,u=backup_user,p='xxx',D=test123,t=c1 \
--dest h=10.73.129.188,P=3306,u=backup_user,p='xxx',D=test123,t=c1 \
--charset=UTF8 --where '1=1' --progress 10000 --limit=10000 --txn-size 10000 --bulk-insert --bulk-delete --statistics --no-delete

ae7bb93984172b6abfb9e11224de271fc61ff093

3.3 场景2-1:全表归档,删除原表数据,非批量插入,非批量删除

pt-archiver \
--source h=10.73.129.187,P=3306,u=backup_user,p='xxx',D=test123,t=c1 \
--dest h=10.73.129.188,P=3306,u=backup_user,p='xxx',D=test123,t=c1 \
--charset=UTF8 --where '1=1' --progress 10000 --limit=10000 --txn-size 10000 --statistics --purge

d50354a4cf8086406b7fe1d9eefbe17debbd1700

3.4 场景2-2:全表归档,删除原表数据,批量插入,批量删除

pt-archiver \
--source h=10.73.129.187,P=3306,u=backup_user,p='xxx',,D=test123,t=c1 \
--dest h=10.73.129.188,P=3306,u=backup_user,p='xxx',D=test123,t=c1 \
--charset=UTF8 --where '1=1' --progress 10000 --limit=10000 --txn-size 10000 --bulk-insert --bulk-delete --statistics --purge


d98ed12f1a0deb91147e8830b7e7dc63afdf07f8

四、小结

4.1 性能对比

通过下表可以看出,批量操作和非批量操作的性能差距非常明显,批量操作花费时间为非批量操作的十分之一左右。

68d0ecbe4dd224e4f8c141fa8b5bc4afe3cf3cd1

场景2-1:全表归档,删除原表数据,非批量插入,非批量删除4.2 general log分析

  • 从日志看起来,源库的查询和目标库的插入有先后顺序
  • 从日志看起来,目标库的插入和源库的删除,并无先后顺序。在特定条件下,万一目标库插入失败,源库删除成功,咋搞?感觉这里并不十分严谨
  • 删除采用DELETE FROM TABLE WHERE ... ,每次删除一行数据
  • 插入采用INSERT INTO TABLE VALUES('...'),每次插入一行数据

源库general log:

  1. set autocommit=0
  2. 批量查询(对应参数limit)
SELECT /*!40001 SQL_NO_CACHE */ `uuid` FORCE 

INDEX(`PRIMARY`) WHERE (1=1) AND ((`uuid` >= '266431')) 

ORDER BY `uuid` LIMIT 10000

3. 逐行删除

DELETE FROM `test123`.`c1` WHERE (`uuid` = '000002f0d9374c56ac456d76a68219b4')

4. COMMIT(对应参数--txn-size,操作数量达到--txn-size,则commit)

目标库general log:

  1. set autocommit=0
  2. 逐行插入
INSERT INTO `test123`.`c1`(`uuid`) VALUES ('0436dcf30350428c88e3ae6045649659')

3. COMMIT(对应参数--txn-size,操作数量达到--txn-size,则commit)

场景2-2:全表归档,删除原表数据,批量插入,批量删除

  • 从日志看起来,源库的批量查询和目标库的批量插入有先后顺序
  • 从日志看起来,目标库的批量插入和源库的批量删除,并无先后顺序。
  • 批量删除采用DELETE FROM TABLE WHERE ... LIMIT 10000
  • 批量插入采用LOAD DATA LOCAL INFILE 'file' INTO TABLE ...

源库:

  1. set autocommit=0
  2. 批量查询(对应limit参数)
SELECT /*!40001 SQL_NO_CACHE */ `uuid` FORCE 

INDEX(`PRIMARY`) WHERE (1=1) AND ((`uuid` >= '266431')) 

ORDER BY `uuid` LIMIT 10000

3. 批量删除

DELETE FROM `test123`.`c1` WHERE (((`uuid` >= '266432'))) AND (((`uuid` <= '273938'))) AND (1=1) LIMIT 10000

4. COMMIT(对应参数--txn-size,操作数量达到--txn-size,则commit)

目标库:

  1. set autocommit=0
  2. 批量插入
LOAD DATA LOCAL INFILE '/tmp/vkKXnc1VVApt-archiver' INTO TABLE `test123`.`c1`CHARACTER SET UTF8(`uuid`)

3. COMMIT(对应参数--txn-size,操作数量达到--txn-size,则commit)

五、附录

常用参数

a2a6fa0100cd34c226f95c9649e9bdbb628fd115


原文发布时间为:2017-11-28

本文作者:蓝剑锋@知数堂

本文来自云栖社区合作伙伴“老叶茶馆”,了解相关信息可以关注“老叶茶馆”微信公众号

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
JSON NoSQL Redis
redis-full-check校验工具
redis-full-check是阿里云Redis&MongoDB团队开源的用于校验2个redis数据是否一致的工具,通常用于redis数据迁移后正确性的校验。
27158 0
|
7月前
|
人工智能 弹性计算 运维
AI驱动下的云平台运维效率变革,让系统更聪明,让人更专注!
随着AI时代的到来,如何上好云、用好云、管好云是政企客户面临的共同话题,而云平台已成为支撑其业务运行的核心基础设施。分布式、多Region、声明式、异构等技术的广泛应用,带来了架构灵活性和部署效率的提升,但也让运维工作变得前所未有的复杂。
977 5
|
安全 关系型数据库 MySQL
Linux(CentOS6)安装MySQL5.6
Linux(CentOS 6)系统上安装MySQL 5.6版本的详细步骤,包括准备数据存放目录、创建用户、下载安装包、初始化数据库、配置服务脚本、设置环境变量等操作。
1024 1
|
人工智能 物联网 C语言
SVDQuant:MIT 推出的扩散模型后训练的量化技术,能够将模型的权重和激活值量化至4位,减少内存占用并加速推理过程
SVDQuant是由MIT研究团队推出的扩散模型后训练量化技术,通过将模型的权重和激活值量化至4位,显著减少了内存占用并加速了推理过程。该技术引入了高精度的低秩分支来吸收量化过程中的异常值,支持多种架构,并能无缝集成低秩适配器(LoRAs),为资源受限设备上的大型扩散模型部署提供了有效的解决方案。
1050 5
SVDQuant:MIT 推出的扩散模型后训练的量化技术,能够将模型的权重和激活值量化至4位,减少内存占用并加速推理过程
|
SQL 监控 关系型数据库
使用 pt-query-digest 工具分析 MySQL 慢日志
【8月更文挑战第5天】使用 pt-query-digest 工具分析 MySQL 慢日志
1358 3
使用 pt-query-digest 工具分析 MySQL 慢日志
|
缓存 安全 应用服务中间件
nginx配置proxy_set_header
nginx配置proxy_set_header
|
小程序 前端开发 API
微信小程序全栈开发中的多端适配与响应式布局是一种高效的开发模式。
探讨小程序全栈开发中的多端适配与响应式布局,旨在实现统一的用户体验。多端适配包括平台和设备适配,确保小程序能在不同环境稳定运行。响应式布局利用媒体查询和弹性布局技术,使界面适应各种屏幕尺寸。实践中需考虑兼容性、性能优化及用户体验,借助跨平台框架如Taro或uni-app可简化开发流程,提升效率。
512 1
|
负载均衡 监控 Go
Golang深入浅出之-Go语言中的服务网格(Service Mesh)原理与应用
【5月更文挑战第5天】服务网格是处理服务间通信的基础设施层,常由数据平面(代理,如Envoy)和控制平面(管理配置)组成。本文讨论了服务发现、负载均衡和追踪等常见问题及其解决方案,并展示了使用Go语言实现Envoy sidecar配置的例子,强调Go语言在构建服务网格中的优势。服务网格能提升微服务的管理和可观测性,正确应对问题能构建更健壮的分布式系统。
864 1

热门文章

最新文章