/pt-archiver --help Archive all rows from oltp_server to olap_server and to a file: pt-archiver --source %t' \ --where "1=1" --limit 1000 --commit-each Purge (delete) orphan rows from child table: pt-archiver 在pt-archiver处理这么多行之后,如果指定该参数,它会提交--source和--dest,并刷新--file给出的文件。 --where:指定WHERE子句以限制存档的行。 /pt-archiver --source u=system,p=**,h=10.15.7.114,P=3306,D=test,t=t1 --file=/tmp/%Y-%m-%d-%D. /pt-archiver line 6563. '1', 1='1', 2='1'] at ./pt-archiver line 6563. [mysql@mysqlt1 bin]$.
Percona pt-archiver工具是这样做的,逐条把历史数据insert到归档表,同时删除原表数据。 jesong]# yum install php php-mysqlnd -y [root@test19-server07 jesong]# wget https://github.com/hcymysql/pt-archiver 环境有问题,请执行下面的2条语句重跑即可 mysql> set global show_compatibility_56=on; mysql> set global sql_mode=''; 原生工具 pt-archiver 进行分批缓慢删除: 如果对原表进行删除归档数据,可以借助原生工具 pt-archiver 进行分批缓慢删除。 shell> pt-archiver --source h=127.0.0.1,P=3306,u=admin,p='hechunyang',D=test,t=sbtest1 --purge --charset
前言 pt-archiver 是一款常见的 表清理或者归档工具。 MySQL 中删除大表之前可以使用 pt-archiver 批量删除所有记录。 社区成员注意到此行为,在 pt-archiver 完成后,该表仍有一行待处理。 我们的工具 pt-archiver 似乎没有将最大值复制到目标表。 如果在 pt-archiver 运行时插入新行,pt-archiver 将看不到它们。 好吧,现在我们知道了为什么没有删除干净的“原因”,但为什么呢?AUTO_INCREMENT 的安全问题是什么? 上面的测试结果告诉我们: 这里的问题实际上并不在于 pt-archiver,而在于参数选项。
之前的percona-toolkit工具集的使用博文里面也写到pt-archiver这个工具的用法,但是不够深入全面。这里补充完善下。 注意:pt-archiver操作的表必须有主键。 查看帮助: perldoc pt-archiver Specify at least one of "--dest","--file", or "--purge". 一般建议也是pt-archiver操作结束后,在业务低谷手动执行analyze table用以回收表空间。 ")"; 删除老数据(单独的删数据操作不用指定字符集): /usr/bin/pt-archiver \ --source h=localhost,u=root,p=1234,P=3306,D=test, 导出数据到文件: /usr/bin/pt-archiver \ --source h=10.0.20.26,u=root,p=1234,P=3306,D=test,t=t \ --file '/root
经过一番折腾,发现使用percona的pt-archiver就可以轻松并优雅地对MySQL进行数据归档。 三、模拟场景 3.1 场景1-1:全表归档,不删除原表数据,非批量插入 pt-archiver \ --source h=10.73.129.187,P=3306,u=backup_user,p='xxx 3.3 场景2-1:全表归档,删除原表数据,非批量插入,非批量删除 pt-archiver \ --source h=10.73.129.187,P=3306,u=backup_user,p='xxx' 3.4 场景2-2:全表归档,删除原表数据,批量插入,批量删除 pt-archiver \ --source h=10.73.129.187,P=3306,u=backup_user,p='xxx',, 一般建议也是pt-archiver操作结束后,在业务低谷手动执行analyze table用以回收表空间
先说结论: 使用者的姿势问题导致,但是pt-archiver也缺少相关的校验机制,最终导致数据错误没有被及时发现。 1 |+----+----------+------------+5 rows in set (0.00 sec)案例1 有问题的写法# 注意下面的字段 res_status是大写字母pt-archiver FORCE INDEX(`PRIMARY`) WHERE (1=1) AND (`id` < '20') AND ((`id` > '19')) ORDER BY `id` LIMIT 1002 没问题的写法pt-archiver FORCE INDEX(`PRIMARY`) WHERE (1=1) AND (`id` < '20') AND ((`id` > '19')) ORDER BY `id` LIMIT 1003 也可以使用pt-archiver 的debug功能此外,也可以启用pt-archiver的debug选项export PTDEBUG=1 然后再执行pt-arhiver命令,即可在控制台输出明细日志正常的# pt_archiver:6721
经过一番折腾,发现使用percona的pt-archiver就可以轻松并优雅地对MySQL进行数据归档。 三、模拟场景 3.1 场景1-1:全表归档,不删除原表数据,非批量插入 pt-archiver \ --source h=10.73.129.187,P=3306,u=backup_user,p='xxx 3.3 场景2-1:全表归档,删除原表数据,非批量插入,非批量删除 pt-archiver \ --source h=10.73.129.187,P=3306,u=backup_user,p='xxx' 3.4 场景2-2:全表归档,删除原表数据,批量插入,批量删除 pt-archiver \ --source h=10.73.129.187,P=3306,u=backup_user,p='xxx',, 一般建议也是pt-archiver操作结束后,在业务低谷手动执行analyze table用以回收表空间
之间的文章《【Percona-toolkit系列】Percona-toolkit工具包的安装和使用》介绍了Percona-toolkit工具包的安装,接下来我们来介绍该工具包中的一个工具pt-archiver 用于数据归档; DBA经常会遇到需定期对数据进行归档和清除,可利percona的pt-archiver工具能完成这一功能,使得数据归档变得方便简单。 pt-archiver可以很轻松的将生产环境的历史数据归档到文件或者直接删除,还可以不同主机间同步数据,而不用将数据落盘,实现的功能有点类似Oracle的数据泵和dblink;pt-archiver一款非常好用的数据归档及清理历史数据的工具 ,工作中可以起到事半功倍的效果; pt-archiver使用的场景: 1、清理线上过期数据 2、清理过期数据,并把数据归档到本地归档表中,或者远端归档服务器 3、两张表之间的数据不完全相同,希望合并。 二、不同实例之间同步数据 使用pt-archiver可以将历史数据搬到备份库,或者在两个库之间在线同步数据。
Percona pt-archiver重构版--大表数据归档工具相信很多小伙伴们,在日常对接开发时,有很多大表在业务上并没有采取任何形式的切分,数据不停地往一张表里灌入,迟早有一天,磁盘空间报警。 Percona pt-archiver工具是这样做的,逐条把历史数据insert到归档表,同时删除原表数据。 global sql_mode=''; 已兼容MySQL8.0###############################################如果对原表进行删除归档数据,可以借助原生工具 pt-archiver 删除数据pt-archiver --source h=127.0.0.1,P=3306,u=admin,p='hechunyang',D=test,t=sbtest1 --purge --charset
生产环境表中有特殊字符算是一个很常见的情况,但是默认情况下pt-archiver的bulk-insert遇到特殊字符会报错,类似如下图:从报错日志可以看到是LOAD DATA LOCAL INFILE 可以去pt-archiver代码里面搜下看试着改下源码。 cp /bin/pt-archiver /bin/pt-archiver_bakvim /bin/pt-archiver修改前:我们这里直接把字符集写死,修改后如下:再次执行 pt-archiver
所以很多DBA往往采用第三种方式--pt-archiver。 pt-archiver是Percona-Toolkit工具集中的一个组件,是一个主要用于对MySQL表数据进行归档和清除的工具。 例如: ln -s /data/XXXXXXXX/percona-toolkit-3.2.1/bin/pt-archiver /usr/local/bin/pt-archiver 3.缺少文档 <type 解决方案: 修改db_archive_exec.py可执行文件,针对pt-archiver添加参数 --no-check-charset 5.参数设置报错 Usage: pt-archiver [OPTIONS " at /usr/local/bin/pt-archiver line 6711. : command not found sh: pt-archiver: command not found sh: pt-archiver: command not found sh: pt-archiver
自己使用pt-archiver备份时总是会少一条数据;如源数据库中某表数据为2333,导入目的数据库后select结果只有2332。 结论在 pt-archiver 中有这样一个参数--nosafe-auto-increment官方文档中作用如下:图片指定不使用自增列(AUTO_INCREMENT)最大值对应的行进行归档默认开启,该选项在进行归档清除时会额外添加一条 简单总结以下里面包含的信息:pt-archiver工具对自增列(AUTO_INCREMENT)最大值默认行为是: 会在进行归档清除时额外添加一条WHERE子句防止对,自增列(AUTO_INCREMENT 间接影响业务综上所述,pt-archiver工具默认开启safe-auto-increment参数是很有必要的。可以防止某些意外发生。那么什么情况下需要关闭safe-auto-increment参数? ------+ | count(*) |+----------+| 100000 | +----------+ 1 row in set (0.08 sec)2.进行归档[root@wx ~]# pt-archiver
2.2 pt-archiver pt-archiver - Archive rows from a MySQL table into another table or a file. (将MySQL表中的行存档到另一个表或文件中,可以理解为归档) Usage: pt-archiver [OPTIONS] --source DSN --where WHERE eg: 将所有行从oltp_server 归档到olap_server并归档到一个文件: pt-archiver --source h=oltp_server,D=test,t=tbl --dest h=olap_server \ --file %t' \ --where "1=1" --limit 1000 --commit-each 从子表中清除(删除)孤立行: pt-archiver host,D=db,t=child --purge \ --where 'NOT EXISTS(SELECT * FROM parent WHERE col=child.col)' 可选参数,可通过pt-archiver
一、引言 前段时间,在优雅的使用pt-archiver进行数据归档一文中介绍了pt-archiver的使用方法,也将pt-archiver部署到了生产环境,这时候问题来了~ 生产环境需要做归档的任务有十几个 二、mysql_archiver 2.1 归档调度 db_archive_exec.py,从数据库获取归档任务的基本信息,调用pt-archiver进行操作 2.1.1 表结构设计 表db_archive_info 2.1.3 调用pt-archiver ?
一、引言 将pt-archiver部署到生产环境的时候,问题来了~ 生产环境需要做归档的任务有十几个,如果要知道每个归档任务成功与否、跑了多长时间、归档了多少数据,就得手工逐个查看日志,非常枯燥的重复劳动 二、mysql_archiver 2.1 归档调度 db_archive_exec.py,从数据库获取归档任务的基本信息,调用pt-archiver进行操作 2.1.1 表结构设计 表db_archive_info 2.1.3 调用pt-archiver ?
报错场景最近一个跑了挺久的数据清理任务报错了,报错日志提示 Truncated incorrect datetime value: '2026-04-14 00:03:341455'dba人工执行pt-archiver 修改方法1、在pt-archiver过程中,加上 设置会话级别的sql_mode参数,类似:/usr/bin/pt-archiver \--source h=192.168.31.181,u=dba,p 读取时的严格:pt-archiver 在读取或比较数据时,MySQL 会尝试将这个畸形的字符串转换回 DATETIME 对象进行比较,这时就会因为格式严重不符而抛出 Truncated incorrect 2. pt-archiver 的内部机制差异pt-archiver 的工作方式不是一条条简单的 DELETE,它会先 SELECT 出要删除的数据,或者在 DELETE 的 WHERE 条件中引用主键范围 批次差异:pt-archiver 是分批次处理的。可能前几个批次处理的数据都是干净的,直到处理到包含这条脏数据(ID 在 'f514c03f...' 到 'f5e9f13e...'
一,引言 前段时间在优雅的使用pt-archiver进行数据归档一文中介绍了pt-archiver的使用方法,也将pt-archiver部署到了生产环境,这时候问题来了…… 生产环境需要做归档的任务有十余个 于是用python折腾了一个小工具…… 二,mysql_archiver 2.1 归档调度 db_archive_exec.py,从数据库获取归档任务的基本信息,调用pt-archiver进行操作 2.1.1 表结构设计 表db_archive_info,主要存放归档任务的基本信息 表db_archive_log,主要存放归档任务的执行日志 2.1.2 获取归档任务 2.1.3 调用pt-archiver
前言 数据库管理员或者运维人员经常需定期对数据进行归档和清除,我们可以使用percona的pt-archiver工具能完成这一功能,使得数据归档变得方便简单。 归档之前准备 pt-archiver归档前,需要先建立归档表(备份表)且表结构要一样。 pt-archiver操作的表必须有主键。 '0', `day` date NOT NULL, PRIMARY KEY (`url`,`day`,`src`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; pt-archiver 一般建议也是pt-archiver操作结束后,在业务低谷手动执行analyze table用以回收表空间。 [root@db-work dbback]# pt-archiver --source h=localhost,u=root,p=qQSVdqzBUlT5TbeI,P=3306,D=pttest1,t=
pt-archiver Bug不会迁移max(id)那条数据的解决方法: 参考: http://www.ttlsa.com/mysql/pt-archiver-bug-cannot-migration-max-id-record / 修改/usr/bin/pt-archiver 如下: 修改前: $first_sql .= " AND ($col < " .
test.single_table_1 like test.single_table; 开始迁移数据 注意: --columns 后面跟随对应的字段名,不需要带上id,这样生成的id就是自增id值 pt-archiver 5.删除原表的数据 unlock tables; pt-archiver \ --source h=192.168.248.111,P=3306,u=root,p='xxx',,D=test,t=single_table 原因是存在两表关联,用pt-archiver进行数据归档解决不了。 方案二的第1步和第2步跟方案一保持一致。 single_table和single_table_exp表 lock table test.single_table read; 2.将single_table_1全表数据回迁到single_table pt-archiver