开发者社区> 技术小能手> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

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

简介: 一、引言 最近由于业务需求,需要将公有云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

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

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

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
备份工具pg_dump的使用《postgres》
备份工具pg_dump的使用《postgres》
0 0
pg_dump
备份PostgreSQL数据库的工具,它甚至可以在数据库正在并发使用时进行完整一致的备份,而不会阻塞其它用户对数据库的访问。该工具生成的转储格式可以分为两种,脚本和归档文件。
0 0
闪回数据归档(Flashback Data Archive)
闪回数据归档 虽然ORA-01555错误可以通过种种手段来避免和减少,但是随着时间的流逝,这些UNDO信息总会失去,那么能否将这些信息保存起来,使得数据库在一定的历史周期之内可以不断向后追溯,使得我们可以看到一个数据表在任意历史时间点上的切片呢?   从Oracle Database 11g开始,Oracle 提供了一个这样的功能:闪回数据归档(Flashback Data Archive)。
731 0
ORA-00257: archiver error --11GR2 RAC 设置归档路径和开启flashback
<p>ORA-00257: archiver error --11GR2 RAC 设置归档路径和开启flashback</p> <p><br></p> <p></p> <div id="content" class="bigfont mycontent" style="zoom:1; line-height:23px; font-size:14px; margin:18px 28px
1321 0
[20130123]归档参数log_archive_dest_1问题.txt
[20130123]归档参数log_archive_dest_1问题.txtSQL> select * from v$version where rownumBANNER----------------------------------------------...
556 0
使用data dump 恢复表空间
1)对 表空间进行逻辑导出 SQL> conn system/yang as sysdba已连接。 impdp  system/yang  directory=dump dumpfile=tablespace.dmp tablespaces=users 2)模拟表空间损坏 SQL> drop tablespace test including contents and datafiles;表空间已删除。
552 0
oracle 参数LOG_ARCHIVE_FORMAT 的格式
Parameter type String SyntaxLOG_ARCHIVE_FORMAT = filenameDefault valueOperating system-dependentParameter classStaticRange of value...
676 0
+关注
技术小能手
云栖运营小编~
文章
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载