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

摘要:
存档数据有n种方法。

一、引言

最近由于业务需求,需要将公有云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 二进制
OSCentOS release 6.5 (Final)CentOS release 6.5 (Final)
IP10.73.129.18710.73.129.188
port33063306
配置2c4g2c4g
binlog开启开启

2.2 pt-archiver信息

版本pt-ioprofile 3.0.4
OSCentOS release 6.5 (Final)
IP10.73.129.189
机器配置2c4g

2.3 归档表信息

归档表c1
记录数1000000
体积304M

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

0?wx_fmt=png

三、模拟场景

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

0?wx_fmt=png

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

0?wx_fmt=png

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

0?wx_fmt=png

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

0?wx_fmt=png

四、小结

4.1 性能对比

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

模拟场景非批量操作批量操作对比
归档全表100万行,不删除原表数据486s83s0.17
归档全表100万行,删除原表数据1024s96s0.09
模拟场景insertbulk_insertdeletebulk_delete
归档全表100万行,不删除原表数据420.68s24.56s//
归档全表100万行,删除原表数据484.38s24.89s452.84s11.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进行数据归档(转)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇阿里云服务器ECS(CentOS)部署项目最详细流程(安装tomcat、部署项目、取消访问时自带项目名、购买域名、备案、域名访问项目)(图文介绍)利用Bing翻译API简单的实现一个翻译工具下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

SSL相关漏洞解决方法

最近用绿盟扫描系统进行内网网系统扫描,有几台设备被扫出了SSL相关漏洞,在此做一个简短的加固方法。 本次涉及漏洞 1.漏洞名称:SSL 3.0 POODLE攻击信息泄露漏洞(CVE-2014-3566)【原理扫描】 2.SSL/TLS 受诫礼(BAR-MITZVAH)攻击漏洞(CVE-2015-2808)【原理扫描】 知识普及1:SSL协议要点 SSL(S...

数据可视化之DAX篇(二十八)Power BI时间序列分析用到的度量值,一次全给你

https://zhuanlan.zhihu.com/p/88528732 在各种经营分析报告中,我们常常会看到YTD,YOY这样的统计指标,这样的数据计算并不难,尤其是在PowerBI中,因为有时间智能函数的帮助,大大简化了这些计算,从而快速满足定期的报告需求。 下面就给你列出这些常用统计数据的度量值,帮你快速掌握各种期间数据的算法。   如果对时间智能...

Opentelemetry Collector的配置和使用

Collector的配置和使用 目录 Collector的配置和使用 Collector配置 Receivers Processors Exporters Service Extensions 使用环境变量 Collector的使用 部署到Kubernetes 部署Prometheus operator 使用Makefile 配置OpenT...

Android开发经验02:Android 项目开发流程

Android开发完整流程:   一、用户需求分析 用户需求分析占据整个APP开发流程中最重要的一个环节。一款APP开发的成功与否很大程度都决定于此。这里所说的用户需求分析指的是基于用户的要求所进行的APP功能的梳理。针对的主体都是用户,"以用户为中心",不是瞎喊口号。因为很多公司所开发的APP都是给需求用户所使用的,所以,在整理APP开发需求的同时,不...

Synchronization N层 使用WebService同步SQLCompact

Synchronization N层使用WebService同步SQLCompact 使用Synchronization做与web service进行数据库同步。 Sync同步非常强大,可以同步不同地点的数据库中的数据。 说明:本案例使用微软的经典数据库示例NorthWind,数据库系统使用 MSSQL Express 步骤: 1.使用VS20...

mysql主从复制延迟问题的相关知识与解决方案

一、如何监控发生了主从延迟? 在从库机器上,执行show slave status,查看Seconds_Behind_Master值,代表主从同步从库落后主库的时间,单位为秒,若同从同步无延迟,这个值为0。 Mysql主从延迟一个重要的原因之一是:mysql是以单线程串行执行。 主从复制数据时,在从服务器上的mysql,是一个线程在同步数据。 串行的方式,...