一、引言

最近由于业务需求,需要将公有云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:全表归档,不删除原表数据,非批量插入

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

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

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

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

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

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

  1.  
    pt-archiver \
  2.  
    --source h=10.73.129.187,P=3306,u=backup_user,p='xxx',,D=test123,t=c1 \
  3.  
    --dest h=10.73.129.188,P=3306,u=backup_user,p='xxx',D=test123,t=c1 \
  4.  
    --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:

  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)

五、附录

常用参数

--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进行数据归档(转)的更多相关文章

  1. pt-archiver数据归档

    可以使用percona-toolkit包中的pt-archiver工具来进行历史数据归档 pt-archiver使用的场景: 1.清理线上过期数据. 2.清理过期数据,并把数据归档到本地归档表中,或者 ...

  2. MySQL数据归档小工具推荐--mysql_archiver

    一.主要概述 MySQL数据库归档历史数据主要可以分为三种方式:一.创建编写SP.设置Event:二.通过dump导入导出:三.通过pt-archiver工具进行归档.第一种方式往往受限于同实例要求, ...

  3. DBA日常管理——数据归档(Archiving-Data)

    原文出处:http://www.sqlnotes.cn/post/2013/09/05/DBA-Daily-Jobs-One%E2%80%94%E2%80%94-Archiving-Data 均为本人 ...

  4. 使用Python以优雅的方式实现根据shp数据对栅格影像进行切割

    目录 前言 涉及到的技术 优雅切割 总结 一.前言        前面一篇文章(使用Python实现子区域数据分类统计)讲述了通过geopandas库实现对子区域数据的分类统计,说白了也就是如何根据一 ...

  5. oracle flashback data archive闪回数据归档天坑之XID重用导致闪回查询数据重复

    我们有个系统使用了Oracle flashback data archive闪回数据归档特性来作为基于时间点的恢复机制,在频繁插入.更新期间发现SYS_FBA_HIST_NNNN表中的XID被两个事务 ...

  6. SQL Server数据归档的解决方案

    SQL Server数据归档的解决方案   最近新接到的一项工作是把SQL Server中保存了四五年的陈年数据(合同,付款,报销等等单据)进行归档,原因是每天的数据增量很大,而历史数据又不经常使用, ...

  7. oracle闪回、闪回数据归档Flashback Data Archive (Oracle Total Recall)的真正强大之处、11gR2增强以及合理使用

    oracle的闪回很早就出来了,准确的说一直以来应该都较少被真正用户广为使用,除了dba和极少部分开发人员偶尔用于逻辑出错.误删恢复之外,较少被用于产生更有价值的用途. 各种闪回表flashback ...

  8. tar命令--数据归档(一)

    虽然zip命令能够很好的将数据压缩和归档到单个文件,蛋挞不是linux 和unix的标准归档工具. ta命令最开始是用来将文件写到磁盘设备上的归档.然而他也能把输出写道文件里. 你会发现这个可选参数是 ...

  9. 今天早上刚刚碰到的一个问题oracle数据归档已满,只能进行内部连接,ORA-00257 archiver error. 错误的处理方法

    archive log 日志已满ORA-00257: archiver error. Connect internal only, until freed 错误的处理方法1. 用sys用户登录  sq ...

  10. iOS - OC NSKeyedArchiver 数据归档

    前言 @interface NSKeyedArchiver : NSCoder @interface NSKeyedUnarchiver : NSCoder 在 OC 语言中,归档是一个过程,即用某种 ...

随机推荐

  1. ONVIF网络摄像头(IPC)客户端开发—RTSP RTCP RTP加载H264视频流

    前言: RTSP,RTCP,RTP一般是一起使用,在FFmpeg和live555这些库中,它们为了更好的适用性,所以实现起来非常复杂,直接查看FFmpeg和Live555源代码来熟悉这些协议非常吃力, ...

  2. 使用Python+FFMPEG实现视频分割与合并

    前言 日常中偶尔会遇到需要简单剪辑处理视频的场景,以前我可能会拿出PR来剪辑一下,(别跟我说国产那些软件,剪辑完视频强制加上广告片头片尾恶心的一批),但是PR毕竟太重量级,剪个简单的视频都要花不少时间 ...

  3. GB18030-2022 标准学习

    GB18030-2022 标准学习 下载 https://openstd.samr.gov.cn/bzgk/gb/newGbInfo?hcno=A1931A578FE14957104988029B08 ...

  4. [转帖]TiKV & TiFlash 加速复杂业务查询丨TiFlash 应用实践

    返回全部 边城元元案例实践2022-08-02 复杂业务查询对于传统的关系型数据库来说是一种考验,而通过 TiKV 行存与 TiFlash 的列存结合使用就能很好地应对.本文根据 TUG 用户边城元元 ...

  5. [转帖]jemalloc 性能测试

    https://wenfh2020.com/2020/07/30/jemalloc/   jemalloc 是一个优秀的内存分配器,通过与系统默认的内存分配器进行比较:jemalloc 内存分配性能比 ...

  6. 【转帖】【漏洞提示】MySQL8.0.29因重大bug官网已下架

    前阵子,MySQL官网已经将 MySQL 8.0.29版本下架.据悉下架原因是由于MySQL 8.0.29 存在关于InnoDB解释器的重大Bug.而最新版本 8.0.30及以上的版本已修复此漏洞.各 ...

  7. [转帖]分享一个Navicat16最新版永久试用的办法

    https://zhuanlan.zhihu.com/p/614621302 新建bat,就叫 navicat无限试用.bat @echo off echo Delete HKEY_CURRENT_U ...

  8. 【转帖】Linux性能优化(十三)——CPU性能测试

    一.CPU上下文切换测试场景 使用sysbench模拟多线程调度: sysbench --threads=10 --time=300 threads run 使用vmstat查看CPU上下文切换: c ...

  9. Mac 版的 Quicker CirMenu

    之前在Windows上用过一款圆盘菜单工具Quicker, 感觉非常方便, 换成Macos后,一直没有找到类似应用. 最近终于发现,一款好用的快捷键收集,触发工具CirMenu. 其核心功能是可以根据 ...

  10. React数据通信父传子和子传父的使用

    组件中的props 在react中,props的特点是: 1.可以给组件传递任意类型的数据 2.props是只读的对象,只能够读取属性的值,无法修改对象 如过我们强行修改数据,会报错,告诉我们该属性是 ...