优雅地使用pt-archiver进行数据归档(转)
一、引言
最近由于业务需求,需要将公有云RDS(业务库)的大表数据归档至私有云MySQL(历史库),以缩减公有云RDS的体积和成本。
那么问题来了,数据归档的方式有n种,选择哪种呢?经过一番折腾,发现使用percona的pt-archiver就可以轻松并优雅地对MySQL进行数据归档。
待我娓娓道来~
1.1 pt-archive是啥
属于大名鼎鼎的percona工具集的一员,是归档MySQL大表数据的最佳轻量级工具之一。
注意,相当轻,相当方便简单。
1.2 pt-archive能干啥
清理线上过期数据;
导出线上数据,到线下数据作处理;
清理过期数据,并把数据归档到本地归档表中,或者远端归档服务器。
二、基本信息
2.1 MySQL环境
| 源库 | 目标库 | |
| 版本 | MySQL 5.7.20 二进制 | MySQL 5.7.20 二进制 |
| OS | CentOS release 6.5 (Final) | CentOS release 6.5 (Final) |
| IP | 10.73.129.187 | 10.73.129.188 |
| port | 3306 | 3306 |
| 配置 | 2c4g | 2c4g |
| binlog | 开启 | 开启 |
2.2 pt-archiver信息
| 版本 | pt-ioprofile 3.0.4 |
| OS | CentOS release 6.5 (Final) |
| IP | 10.73.129.189 |
| 机器配置 | 2c4g |
2.3 归档表信息
| 归档表 | c1 |
| 记录数 | 1000000 |
| 体积 | 304M |
注意:pt-archiver操作的表必须有主键
三、模拟场景
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
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
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
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
四、小结
4.1 性能对比
通过下表可以看出,批量操作和非批量操作的性能差距非常明显,批量操作花费时间为非批量操作的十分之一左右。
| 模拟场景 | 非批量操作 | 批量操作 | 对比 |
| 归档全表100万行,不删除原表数据 | 486s | 83s | 0.17 |
| 归档全表100万行,删除原表数据 | 1024s | 96s | 0.09 |
| 模拟场景 | insert | bulk_insert | delete | bulk_delete |
| 归档全表100万行,不删除原表数据 | 420.68s | 24.56s | / | / |
| 归档全表100万行,删除原表数据 | 484.38s | 24.89s | 452.84s | 11.39s |
4.2 general log分析
场景2-1:全表归档,删除原表数据,非批量插入,非批量删除
从日志看起来,源库的查询和目标库的插入有先后顺序
从日志看起来,目标库的插入和源库的删除,并无先后顺序。在特定条件下,万一目标库插入失败,源库删除成功,咋搞?感觉这里并不十分严谨
删除采用DELETE FROM TABLE WHERE ... ,每次删除一行数据
插入采用INSERT INTO TABLE VALUES('...'),每次插入一行数据
源库general log:
set autocommit=0
批量查询(对应参数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:
set autocommit=0
逐行插入
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 ...
源库:
set autocommit=0
批量查询(对应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)
目标库:
set autocommit=0
批量插入
LOAD DATA LOCAL INFILE '/tmp/vkKXnc1VVApt-archiver' INTO TABLE `test123`.`c1`CHARACTER SET UTF8(`uuid`)
3. COMMIT(对应参数--txn-size,操作数量达到--txn-size,则commit)
五、附录
常用参数
| --where 'id<3000' | 设置操作条件 |
| --limit 10000 | 每次取1000行数据给pt-archive处理 |
| --txn-size 1000 | 设置1000行为一个事务提交一次 |
| --progress 5000 | 每处理5000行输出一次处理信息 |
| --statistics | 结束的时候给出统计信息:开始的时间点,结束的时间点,查询的行数,归档的行数,删除的行数,以及各个阶段消耗的总的时间和比例,便于以此进行优化。只要不加上--quiet,默认情况下pt-archive都会输出执行过程的 |
| --charset=UTF8 | 指定字符集为UTF8 |
| --no-delete | 表示不删除原来的数据,注意:如果不指定此参数,所有处理完成后,都会清理原表中的数据 |
| --bulk-delete | 批量删除source上的旧数据 |
| --bulk-insert | 批量插入数据到dest主机 (看dest的general log发现它是通过在dest主机上LOAD DATA LOCAL INFILE插入数据的) |
| --purge | 删除source数据库的相关匹配记录 |
| --local | 不把optimize或analyze操作写入到binlog里面(防止造成主从延迟巨大) |
| --analyze=ds | 操作结束后,优化表空间(d表示dest,s表示source) 默认情况下,pt-archiver操作结束后,不会对source、dest表执行analyze或optimize操作,因为这种操作费时间,并且需要你提前预估有足够的磁盘空间用于拷贝表。一般建议也是pt-archiver操作结束后,在业务低谷手动执行analyze table用以回收表空间 |
优雅地使用pt-archiver进行数据归档(转)的更多相关文章
- pt-archiver数据归档
可以使用percona-toolkit包中的pt-archiver工具来进行历史数据归档 pt-archiver使用的场景: 1.清理线上过期数据. 2.清理过期数据,并把数据归档到本地归档表中,或者 ...
- MySQL数据归档小工具推荐--mysql_archiver
一.主要概述 MySQL数据库归档历史数据主要可以分为三种方式:一.创建编写SP.设置Event:二.通过dump导入导出:三.通过pt-archiver工具进行归档.第一种方式往往受限于同实例要求, ...
- DBA日常管理——数据归档(Archiving-Data)
原文出处:http://www.sqlnotes.cn/post/2013/09/05/DBA-Daily-Jobs-One%E2%80%94%E2%80%94-Archiving-Data 均为本人 ...
- 使用Python以优雅的方式实现根据shp数据对栅格影像进行切割
目录 前言 涉及到的技术 优雅切割 总结 一.前言 前面一篇文章(使用Python实现子区域数据分类统计)讲述了通过geopandas库实现对子区域数据的分类统计,说白了也就是如何根据一 ...
- oracle flashback data archive闪回数据归档天坑之XID重用导致闪回查询数据重复
我们有个系统使用了Oracle flashback data archive闪回数据归档特性来作为基于时间点的恢复机制,在频繁插入.更新期间发现SYS_FBA_HIST_NNNN表中的XID被两个事务 ...
- SQL Server数据归档的解决方案
SQL Server数据归档的解决方案 最近新接到的一项工作是把SQL Server中保存了四五年的陈年数据(合同,付款,报销等等单据)进行归档,原因是每天的数据增量很大,而历史数据又不经常使用, ...
- oracle闪回、闪回数据归档Flashback Data Archive (Oracle Total Recall)的真正强大之处、11gR2增强以及合理使用
oracle的闪回很早就出来了,准确的说一直以来应该都较少被真正用户广为使用,除了dba和极少部分开发人员偶尔用于逻辑出错.误删恢复之外,较少被用于产生更有价值的用途. 各种闪回表flashback ...
- tar命令--数据归档(一)
虽然zip命令能够很好的将数据压缩和归档到单个文件,蛋挞不是linux 和unix的标准归档工具. ta命令最开始是用来将文件写到磁盘设备上的归档.然而他也能把输出写道文件里. 你会发现这个可选参数是 ...
- 今天早上刚刚碰到的一个问题oracle数据归档已满,只能进行内部连接,ORA-00257 archiver error. 错误的处理方法
archive log 日志已满ORA-00257: archiver error. Connect internal only, until freed 错误的处理方法1. 用sys用户登录 sq ...
- iOS - OC NSKeyedArchiver 数据归档
前言 @interface NSKeyedArchiver : NSCoder @interface NSKeyedUnarchiver : NSCoder 在 OC 语言中,归档是一个过程,即用某种 ...
随机推荐
- ONVIF网络摄像头(IPC)客户端开发—RTSP RTCP RTP加载H264视频流
前言: RTSP,RTCP,RTP一般是一起使用,在FFmpeg和live555这些库中,它们为了更好的适用性,所以实现起来非常复杂,直接查看FFmpeg和Live555源代码来熟悉这些协议非常吃力, ...
- 使用Python+FFMPEG实现视频分割与合并
前言 日常中偶尔会遇到需要简单剪辑处理视频的场景,以前我可能会拿出PR来剪辑一下,(别跟我说国产那些软件,剪辑完视频强制加上广告片头片尾恶心的一批),但是PR毕竟太重量级,剪个简单的视频都要花不少时间 ...
- GB18030-2022 标准学习
GB18030-2022 标准学习 下载 https://openstd.samr.gov.cn/bzgk/gb/newGbInfo?hcno=A1931A578FE14957104988029B08 ...
- [转帖]TiKV & TiFlash 加速复杂业务查询丨TiFlash 应用实践
返回全部 边城元元案例实践2022-08-02 复杂业务查询对于传统的关系型数据库来说是一种考验,而通过 TiKV 行存与 TiFlash 的列存结合使用就能很好地应对.本文根据 TUG 用户边城元元 ...
- [转帖]jemalloc 性能测试
https://wenfh2020.com/2020/07/30/jemalloc/ jemalloc 是一个优秀的内存分配器,通过与系统默认的内存分配器进行比较:jemalloc 内存分配性能比 ...
- 【转帖】【漏洞提示】MySQL8.0.29因重大bug官网已下架
前阵子,MySQL官网已经将 MySQL 8.0.29版本下架.据悉下架原因是由于MySQL 8.0.29 存在关于InnoDB解释器的重大Bug.而最新版本 8.0.30及以上的版本已修复此漏洞.各 ...
- [转帖]分享一个Navicat16最新版永久试用的办法
https://zhuanlan.zhihu.com/p/614621302 新建bat,就叫 navicat无限试用.bat @echo off echo Delete HKEY_CURRENT_U ...
- 【转帖】Linux性能优化(十三)——CPU性能测试
一.CPU上下文切换测试场景 使用sysbench模拟多线程调度: sysbench --threads=10 --time=300 threads run 使用vmstat查看CPU上下文切换: c ...
- Mac 版的 Quicker CirMenu
之前在Windows上用过一款圆盘菜单工具Quicker, 感觉非常方便, 换成Macos后,一直没有找到类似应用. 最近终于发现,一款好用的快捷键收集,触发工具CirMenu. 其核心功能是可以根据 ...
- React数据通信父传子和子传父的使用
组件中的props 在react中,props的特点是: 1.可以给组件传递任意类型的数据 2.props是只读的对象,只能够读取属性的值,无法修改对象 如过我们强行修改数据,会报错,告诉我们该属性是 ...