【学习目标】

1、pt-archiver工具的基本使用,和内部原理

2、理解过期数据归档和清理的方法

3、有哪些限制和注意事项

4、常常归档或者purge,一定要注意过滤字段,是否存在null, 日期字段是否存在zero date.

而null在MySQL数据库类型的大小情况

【pt-archiver使用的场景】

1、清理线上过期数据

2、清理过期数据,并把数据归档到本地归档表中,或者远端归档服务器

3、两张表之间的数据不完全相同,希望合并。此时加上–ignore或–replace选项,可以轻松实现

4、导出线上数据,到线下数据作处理

1、归档和清理过期数据

1)   归档是把过期的数据从线上表的,移到另一张归档表中(或数据文件中);

清理过期数据,是把过期数据直接从线上表中清理删除。

因为大部分的应用中,只使用近期的数据(工作集数据),如最近六个月。

共同目的:去除掉应用程序不使用的部分数据,使得热数尽可能的小。

2、归档和清理过期数据,都会把原表中的数据Delete掉,而大量Delete存在以下问题:

1)对于MyISAM表,大的Delete操作,整个过程会lock表。

2)  对于Innodb表,大的delete,导致一个长事务,使innodb性能下降,purge操作延迟,undo量大。

3)导致从库延迟增大

3、使用分块删除原来数据, 如:delete xxx order by pk limit 1000;

这样删除比较整个删除好很多,但清理越来越慢。

4、pt-archiver使用删除的原理

二、pt-archiver的使用说明

用于清理过期数据purge

1、执行命令:pt-archiver  --source h=127.0.0.1,P=58886,D=test,t=t_archive --no-check-charset  --where 'insertdate<"2013-08-10"'  --purge --limit=2

1)     注意--source后的DSN之间不能空格出现,否则会出错。 --where条件的值,有字符串的,要用引号括起来。

2) --limit表示,每组一次删除多少条数据(注意:如果数据比较多时,也可以设置大一些,减少循环次数),最终的清理操作,还是通过Where pK=xx来处理的;

整个流程逻辑,请见上图的代码部分。

执行全过程打印的general_log

46 Query     USE `test`

46 Query     SELECT /*!40001 SQL_NO_CACHE */ `id`,`name`,`insertdate` FROM `test`.`t_archive` FORCE INDEX(`PRIMARY`) WHERE (insertdate<"2013-08-10") LIMIT 2

46 Query     DELETE FROM `test`.`t_archive` WHERE (`id` = '1')

46 Query     commit

46 Query     DELETE FROM `test`.`t_archive` WHERE (`id` = '11')

46 Query     commit

46 Query     SELECT /*!40001 SQL_NO_CACHE */ `id`,`name`,`insertdate` FROM `test`.`t_archive` FORCE INDEX(`PRIMARY`) WHERE (insertdate<"2013-08-10") AND ((`id` >= '11')) LIMIT 2

46 Query     DELETE FROM `test`.`t_archive` WHERE (`id` = '12')

46 Query     commit

46 Query     DELETE FROM `test`.`t_archive` WHERE (`id` = '13')

46 Query     commit

46 Query     SELECT /*!40001 SQL_NO_CACHE */ `id`,`name`,`insertdate` FROM `test`.`t_archive` FORCE INDEX(`PRIMARY`) WHERE (insertdate<"2013-08-10") AND ((`id` >= '13')) LIMIT 2

46 Query     DELETE FROM `test`.`t_archive` WHERE (`id` = '14')

46 Query     commit

46 Query     SELECT /*!40001 SQL_NO_CACHE */ `id`,`name`,`insertdate` FROM `test`.`t_archive` FORCE INDEX(`PRIMARY`) WHERE (insertdate<"2013-08-10") AND ((`id` >= '14')) LIMIT 2

46 Query     commit

46 Quit

2、用于把数据导出文件,不用删除原表中数据:

命令使用:

pt-archiver  --source h=127.0.0.1,P=58886,D=test,t=t_info_refresh  --no-check-charset  --where 'AddTime>"2013-05-02"'  --progress 4000  --no-delete --file "/tmp/pt-archiver.dat"  --limit=10000

参数说明:

--statistics  结束的时候给出统计信息:开始的时间点,结束的时间点,查询的行数,归档的行数,删除的行数,以及各个阶段消耗的总的时间和比例,便于以此进行优化。

--progress  每处理progress指定的行数后,就打印一次信息

--no-delete :表示不删除原来的数据,注意:如果不指定此参数,所有处理完成后,都会清理原表中的数据。

导出数据的基本原理:

通过“过滤条件”,得在此范围内的PK的最大值和最小值 , 然后通过PK索引, 过滤条件 + pk <此范围的最大值 + pk >(此范围内pk的最小值+每次增长limit指定的数) + limit. 这样直到处理完成。

SELECT /*!40001 SQL_NO_CACHE */ `id`,`infoid`,`sortid`,`addtime`,`cateid`,`userid`,`distribution`,`state` FROM `test`.`t_info_refresh` FORCE INDEX(`PRIMARY`) WHERE (A

ddTime>"2013-05-02") AND (`id` < '255410336') AND ((`id` > '255043917')) LIMIT 10000

3、把数据归档到线下数据库(字符集问题是否影响)

使用命令:是从线上数据表,归档到指定的线下数据。

pt-archiver  --source h=127.0.0.1,P=58886,D=test,t=t_info_refresh --dest h=10.5.12.13,P=58886,u=archiver,p=123,D=test,t=t_info_refresh  --no-check-charset  --where 'AddTime>"2013-05-02"'  --progress 5000  --no-delete --limit=10000 --statistics

MySQL过期数据归档和清理--pt--archiver相关推荐

  1. 自动清理归档日志_从MYSQL 数据库归档 到 归档设计

    到数据归档,很多人的第一个概念就是,不就是无用的数据,换个地方放吗,直接拷贝,删除不就得了,有那么麻烦. 我见到过的,听到过的数据库归档的方法有以下几种 1  数据通过人工的手段来进行清理,直接将表换 ...

  2. 归档日志存在arch_从MYSQL 数据库归档 到 归档设计

    到数据归档,很多人的第一个概念就是,不就是无用的数据,换个地方放吗,直接拷贝,删除不就得了,有那么麻烦. 我见到过的,听到过的数据库归档的方法有以下几种 1  数据通过人工的手段来进行清理,直接将表换 ...

  3. 从MYSQL 数据库归档 到 归档设计

    到数据归档,很多人的第一个概念就是,不就是无用的数据,换个地方放吗,直接拷贝,删除不就得了,有那么麻烦. 我见到过的,听到过的数据库归档的方法有以下几种 1  数据通过人工的手段来进行清理,直接将表换 ...

  4. Mysql大表数据清理方案

    需求:表t_user_login_log中存储了上千条数据,我们需要对该表做数据清理,只保留近三个月的数据. 方案一 数据量<1000条时推荐使用 DELETE方法 推荐力度:极不推荐 是否会影 ...

  5. 金仓数据库KingbaseES 归档日志清理

    WAL是Write Ahead Log的简写,和Oracle的redo日志类似,在R3版本存放在data/sys_log中,R6版本以后在data/sys_wal目录,在数据库访问过程中,任何对数据块 ...

  6. mysql 分区表 归档_MySQL分区表

    1,MySQL分区表作用 当单表的数据量较大,需要进行定期的数据归档删除时,或者提高查询性能,都可以采用分区: 2,分区表设置 分区的种类 range分区 list分区 hash分区 key分区 ra ...

  7. 解决归档出错,ORA-00257: archiver error. Connect internal only, until freed.

    [Oracle@jingmin ~]$ sqlplus test1/test1 SQL*Plus: Release 11.2.0.3.0 Production on Fri Dec 21 10:08: ...

  8. mysql残余文件的清理

    如果再次安装不成功,可以卸载后对残余文件进行清理后再安装. (1)服务目录:mysql服务的安装目录 (2)数据目录:默认在C:\ProgramData\MySQL 如果自己单独指定过数据目录,就找到 ...

  9. 连接数据库时提示归档器失败 ORA-00257: archiver error

    (1)问题现象 SQL> conn hr/hr ERROR: ORA-00257: archiver error. Connectinternal only, until freed. Warn ...

  10. mysql binlog purge_正确清理mysql binlog日志方法

    MySQL中的binlog日志记录了数据库中数据的变动,便于对数据的基于时间点和基于位置的恢复,但是binlog也会日渐增大,占用很大的磁盘空间,因此,要对binlog使用正确安全的方法清理掉一部分没 ...

最新文章

  1. python随机数生成_关于Python中的随机数生成步骤和随机数质量
  2. python模拟网页点击_python怎么模拟点击网页按钮
  3. mysql单表最大数据量_你的Mysql库真需要Adaptive Hash Index
  4. python元组元素抓7_Python3基础 tuple 通过拆分元组向元组中加入新的元素
  5. 安装程序集'' policy.8.0.microsoft.vc80.atl,type=''win32-
  6. java国际象棋棋牌_java使用swing绘制国际象棋棋盘
  7. 对Mac硬盘重新分区后如何恢复丢失的数据?
  8. java中substring的使用方法
  9. JSP九大内置对象及其作用域
  10. 四元数与欧拉角的相互转换
  11. 系统中如何做到实名认证
  12. C. Not Adjacent Matrix
  13. 概率论复习笔记【3条件概率】
  14. html检测正则表达式,正则表达式在线测试工具
  15. 《测量助理》最新版本V3.0.220618发布更新
  16. Android Studio Git教程
  17. Python 豆瓣网的全自动登录(豆瓣验证码自动识别)
  18. React报错Warning: This synthetic event is reused for performance reasons. If you‘re seeing this, 解决方法
  19. 实录:有钱女性私生活
  20. LC72 Edit Distance

热门文章

  1. 记录金盾专用播放器加密视频提取工具逆向分析过程二
  2. 利用比值判敛法求收敛半径的问题
  3. Windows 10连接打印机提示网路“指定的网络名已不再可用”
  4. UMD算法讲义——Lecture 3:算法设计回顾:数学背景
  5. 机器学习案例之_金融反欺诈预测
  6. elsevier模板通讯作者添加脚注的方法[已解决]
  7. 验证二叉树的前序序列化[抽象前序遍历]
  8. 读计算机网络得学五笔吗,打破无聊难学 另类五笔学习方法
  9. Word批量调整插入图片大小
  10. 如何破解终端算力困局?PRCV这篇论文让机器人“算有余力”