> 文章列表 > pt工具的使用(7) pt-archiver的使用

pt工具的使用(7) pt-archiver的使用

pt工具的使用(7) pt-archiver的使用

一、描述

pt-archiver 是归档表的工具,在 sql 中写入高效归档和清除作业。 目标是在不对 OLTP 查询产生太大影响的情况下,将旧数据从表中蚕食掉,从而实现低影响、仅向前的作业。 您可以将数据插入到另一个表中,而不必在同一台服务器上。 您也可以将其写入适合 LOAD DATA INFILE 格式的文件。 或者你两者都不能做,在这种情况下它只是一个增量删除。

二、实践

针对不同参数做了一些实验,来帮助了解参数

1.官方示例

# 标准用法
pt-archiver [OPTIONS] --source DSN --where WHERE# 将表从oltp实例归档到olap的实例中
pt-archiver --source h=oltp_server,D=test,t=tbl --dest h=olap_server --file '/var/log/archive/%Y-%m-%d-%D.%t' --where "1=1" --limit 1000 --commit-each# 从子表删除孤立行
pt-archiver --source h=host,D=db,t=child --purge --where 'NOT EXISTS(SELECT * FROM parent WHERE col=child.col)'

2.具体测试

2.1 归档到同一实例上的不同表

./pt-archiver --source h=127.0.0.1,P=3307,u=rpl_test,D=mts_rpl_test2,t=mts_test3 --charset=utf8mb4  --ask-pass --dest h=127.0.0.1,P=3307,u=rpl_test,D=mts_rpl_test2,t=mts_test3_arch --ask-pass --where "id<135887" --limit 100 --commit-each
# 因为--dest会从--source继承相同的指,所以上面的命令也可以用下面的写法来写,注意,表必须是已经存在的表
./pt-archiver --source h=127.0.0.1,P=3307,u=rpl_test,D=mts_rpl_test2,t=mts_test3 --charset=utf8mb4  --ask-pass --dest t=mts_test3_arch  --where "id<135887" --limit 100 --commit-each
# 利用配置文件来进行登录
./pt-archiver --source F=/etc/my2.cnf,u=root,D=mts_rpl_test2,t=mts_test3 --charset=utf8mb4  --ask-pass --dest t=mts_test3_arch  --where "id<135887" --limit 100 --commit-each
# 利用socket文件来进行登录,如果使用单机多实例部署的时候采用这种方法要尤其注意dest的真实实例./pt-archiver --source u=root,D=mts_rpl_test2,t=mts_test3 -S /data/mysql_data2/mysql.sock  --charset=utf8mb4  --ask-pass --dest t=mts_test3_arch  --where "id<135887" --limit 100 --commit-each

2.2 归档到文件

# 输出到文件,因为文件没有utf8mb4这种编码,所以这里直接设置了no-check-charset
./pt-archiver --source b,h=127.0.0.1,P=3307,u=rpl_test,D=mts_rpl_test2,t=mts_test3   --ask-pass  --file '/data/it_tool/archiver/%Y-%m-%d-%D.txt' --no-check-charset  --where "id<135887" --limit 100 --commit-each

2.3 只删除不归档

# 只删除,不归档
./pt-archiver --source h=127.0.0.1,P=3307,u=rpl_test,D=mts_rpl_test2,t=mts_test3 --charset=utf8mb4  --ask-pass  --purge  --where "id<136887" --limit 100 --commit-each

2.4 不写入binlog中

# b=true指定归档操作不写入binlog中,因为b的copy是false,所以source和dest都需要指定,可以在通用日志中看到有如下操作SET SQL_LOG_BIN=0
./pt-archiver --source b=true,h=127.0.0.1,P=3307,u=rpl_test,D=mts_rpl_test2,t=mts_test3 --charset=utf8mb4  --ask-pass --dest b=true,t=mts_test3_arch  --where "id<137998" --limit 100 --commit-each

2.5 通过通用日志看执行原理

# 基本环境检测和设置,包括设置字符集,sql_mode,关闭自动提交,查询最大id等,
2023-04-12T09:23:40.510296Z	   28 Query	show variables like '%general%'
2023-04-12T09:24:12.562739Z	   40 Connect	rpl_test@127.0.0.1 on mts_rpl_test2 using TCP/IP
2023-04-12T09:24:12.562940Z	   40 Query	set autocommit=0
2023-04-12T09:24:12.563548Z	   40 Query	/*!40101 SET NAMES "utf8mb4"*/
2023-04-12T09:24:12.563695Z	   40 Query	SHOW VARIABLES LIKE 'wait\\_timeout'
2023-04-12T09:24:12.565120Z	   40 Query	SET SESSION wait_timeout=10000
2023-04-12T09:24:12.565245Z	   40 Query	SELECT @@SQL_MODE
2023-04-12T09:24:12.565337Z	   40 Query	SET @@SQL_QUOTE_SHOW_CREATE = 1/*!40101, @@SQL_MODE='NO_AUTO_VALUE_ON_ZERO,STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION'*/
2023-04-12T09:24:12.565430Z	   40 Query	SELECT VERSION()
2023-04-12T09:24:12.565564Z	   40 Query	SHOW VARIABLES LIKE 'character_set_server'
2023-04-12T09:24:12.566813Z	   40 Query	SELECT version()
2023-04-12T09:24:12.567026Z	   40 Query	SHOW VARIABLES LIKE 'version%'
2023-04-12T09:24:12.568246Z	   40 Query	SHOW ENGINES
2023-04-12T09:24:12.568528Z	   40 Query	SHOW VARIABLES LIKE 'innodb_version'
2023-04-12T09:24:12.569788Z	   40 Query	show variables like 'innodb_rollback_on_timeout'
2023-04-12T09:24:12.570783Z	   40 Query	/*!40101 SET @OLD_SQL_MODE := @@SQL_MODE, @@SQL_MODE := '', @OLD_QUOTE := @@SQL_QUOTE_SHOW_CREATE, @@SQL_QUOTE_SHOW_CREATE := 1 */
2023-04-12T09:24:12.570906Z	   40 Query	USE `mts_rpl_test2`
2023-04-12T09:24:12.571014Z	   40 Query	SHOW CREATE TABLE `mts_rpl_test2`.`mts_test3`
2023-04-12T09:24:12.571152Z	   40 Query	/*!40101 SET @@SQL_MODE := @OLD_SQL_MODE, @@SQL_QUOTE_SHOW_CREATE := @OLD_QUOTE */
2023-04-12T09:24:12.571430Z	   40 Query	SELECT CONCAT(/*!40100 @@session.character_set_connection, */ "")
2023-04-12T09:24:16.494268Z	   41 Connect	rpl_test@127.0.0.1 on mts_rpl_test2 using TCP/IP
2023-04-12T09:24:16.494437Z	   41 Query	set autocommit=0
2023-04-12T09:24:16.494571Z	   41 Query	/*!40101 SET NAMES "utf8mb4"*/
2023-04-12T09:24:16.494700Z	   41 Query	SHOW VARIABLES LIKE 'wait\\_timeout'
2023-04-12T09:24:16.496211Z	   41 Query	SET SESSION wait_timeout=10000
2023-04-12T09:24:16.496320Z	   41 Query	SELECT @@SQL_MODE
2023-04-12T09:24:16.496443Z	   41 Query	SET @@SQL_QUOTE_SHOW_CREATE = 1/*!40101, @@SQL_MODE='NO_AUTO_VALUE_ON_ZERO,STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION'*/
2023-04-12T09:24:16.496606Z	   41 Query	SELECT VERSION()
2023-04-12T09:24:16.496714Z	   41 Query	SHOW VARIABLES LIKE 'character_set_server'
2023-04-12T09:24:16.497890Z	   41 Query	SELECT version()
2023-04-12T09:24:16.498032Z	   41 Query	SHOW VARIABLES LIKE 'version%'
2023-04-12T09:24:16.499070Z	   41 Query	SHOW ENGINES
2023-04-12T09:24:16.499392Z	   41 Query	SHOW VARIABLES LIKE 'innodb_version'
2023-04-12T09:24:16.500537Z	   41 Query	show variables like 'innodb_rollback_on_timeout'
2023-04-12T09:24:16.501484Z	   41 Query	/*!40101 SET @OLD_SQL_MODE := @@SQL_MODE, @@SQL_MODE := '', @OLD_QUOTE := @@SQL_QUOTE_SHOW_CREATE, @@SQL_QUOTE_SHOW_CREATE := 1 */
2023-04-12T09:24:16.501583Z	   41 Query	USE `mts_rpl_test2`
2023-04-12T09:24:16.501665Z	   41 Query	SHOW CREATE TABLE `mts_rpl_test2`.`mts_test3_arch`
2023-04-12T09:24:16.501849Z	   41 Query	/*!40101 SET @@SQL_MODE := @OLD_SQL_MODE, @@SQL_QUOTE_SHOW_CREATE := @OLD_QUOTE */
2023-04-12T09:24:16.502141Z	   41 Query	SELECT CONCAT(/*!40100 @@session.character_set_connection, */ "")
2023-04-12T09:24:16.502295Z	   40 Query	SHOW VARIABLES LIKE 'wsrep_on'
2023-04-12T09:24:16.503568Z	   40 Query	SHOW VARIABLES LIKE 'wsrep_on'
2023-04-12T09:24:16.504761Z	   40 Query	SHOW VARIABLES LIKE 'version%'
2023-04-12T09:24:16.505724Z	   40 Query	SHOW ENGINES
2023-04-12T09:24:16.506017Z	   40 Query	SHOW VARIABLES LIKE 'innodb_version'
2023-04-12T09:24:16.507188Z	   40 Query	SELECT MAX(`id`) FROM `mts_rpl_test2`.`mts_test3`
2023-04-12T09:24:16.507580Z	   40 Query	SELECT CONCAT(@@hostname, @@port)
2023-04-12T09:24:16.507709Z	   41 Query	SELECT CONCAT(@@hostname, @@port)# 确定数据范围,插入新表,归档旧表,重复这个操作达到limit的条数,然后commit
2023-04-12T09:24:16.507988Z	   40 Query	SELECT /*!40001 SQL_NO_CACHE */ `id`,`name`,`email` FROM `mts_rpl_test2`.`mts_test3` FORCE INDEX(`PRIMARY`) WHERE (id<135887) AND (`id` < '2000001') ORDER BY `id` LIMIT 100
2023-04-12T09:24:16.521222Z	   41 Query	INSERT INTO `mts_rpl_test2`.`mts_test3_arch`(`id`,`name`,`email`) VALUES ('134887','asd134886','233@qq.com')
2023-04-12T09:24:16.521535Z	   40 Query	DELETE FROM `mts_rpl_test2`.`mts_test3` WHERE (`id` = '134887')# 简单的心跳检测
2023-04-12T09:24:16.521787Z	   40 Query	SELECT 'pt-archiver keepalive'# 提交查询并退出,commit是每达到一次limit的条数就进行一次commit,这两个commit是分别提交insert和delete的
2023-04-12T09:24:16.805639Z	   41 Query	commit
2023-04-12T09:24:16.805790Z	   40 Query	commit
2023-04-12T09:24:16.805977Z	   40 Query	SELECT /*!40001 SQL_NO_CACHE */ `id`,`name`,`email` FROM `mts_rpl_test2`.`mts_test3` FORCE INDEX(`PRIMARY`) WHERE (id<135887) AND (`id` < '2000001') AND ((`id` >= '135886')) ORDER BY `id` LIMIT 100
2023-04-12T09:24:16.806178Z	   41 Query	commit
2023-04-12T09:24:16.806236Z	   40 Query	commit
2023-04-12T09:24:16.806312Z	   40 Quit
2023-04-12T09:24:16.806393Z	   41 Quit

三、参数详解

参数 意义
--source 制动归档的表,“i”指定索引,默认使用主键。“a”和“b”选项允许您控制语句如何流经二进制日志。 如果指定“b”选项,二进制日志记录将在指定的连接上被禁用。 如果您指定“a”选项,连接将使用指定的数据库,您可以使用它来防止从服务器使用 --replicate-ignore-db 选项执行二进制日志事件。 这两个选项可以用作实现相同目标的不同方法:将数据从主服务器上归档,但将其保留在从服务器上。 例如,您可以在主服务器上运行清除作业,并使用您选择的方法防止它在从服务器上发生。
--dest 此项指定一个表,pt-archiver 将插入从 --source 归档的行。 它使用与 --source 相同的 key=val 参数格式。 大多数缺失值默认为与 --source 相同的值,因此您不必重复 --source 和 --dest 中相同的选项。 使用 --help 选项查看从 --source 复制了哪些值。
--where 指定 WHERE 子句以限制归档哪些行
--commit-each
--txn-size
--commit-each提交每组获取和归档的行,与--limit配合使用
--txn-size指定每次事务提交的行数
这两个参数是互斥的
--limit 每个语句要获取和归档的行数。默认为一行
--[no]check-charset 是否检查字符集,默认检查
--file 归档到文件中,%D Database name;%t Table name,时间的格式化如例子中所描述,与--output-format结合使用可以指定输出的内容是dump(使用制表符作为分隔符)还是csv(使用逗号作为分隔符),与--header配合使用指定是否打印字段名字在第一行
--sleep
--sleep-coef
--sleep 两次提取中间的休眠时间,默认不休眠
--sleep-coef 指定sleep时间为最后一次 SELECT 时间的多少倍。
--purge 只清除,不归档,最好用--primary-key-only 指定表的主键列。 这将防止无缘无故地从服务器获取所有列。
--ignore
--replace
指定归档的时候insert的方式,这两个参数是互斥的
--pause-file=s 当此参数指定的文件存在时,执行将暂停
--pid=s 创建给定的 PID 文件。如果 PID 文件已存在且其中包含的 PID 与当前 PID 不同,则该工具将不会启动。但是,如果 PID 文件存在并且其中包含的 PID 不再运行,则该工具将使用当前 PID 覆盖 PID 文件。工具退出时,PID 文件会自动删除
--plugin=s 用作通用插件的 Perl 模块名称。
--low-priority-insert

--delayed-insert

两者都是低优先级别插入,两个参数互斥,但是delay将在之后被mysql废除
--share-lock
--for-update
指定加读锁还是写锁,这两个参数是互斥的
--analyze
--optimize
–analyze=ds,为d则在dest上使用analyze,为s则在source上使用analyze,ds则表示两者都执行
–optimize表示执行optimize,使用方式与analyze一直,两个参数互斥
--no-ascend
--no-delete
--no-ascend不使用升序索引优化
--no-delete 不删除数据,两个参数是互斥的
–check-interval=m 定义归档每次暂停多长时间
--check-slave-lag=s 暂停归档,直到此副本的滞后小于–max-lag
--max-lag=m 暂停校验和,直到所有副本的滞后小于此值
--local 不要将 OPTIMIZE 或 ANALYZE 查询写入 binlog。
--channel 指定复制通道
--ascend-first 仅升序第一个索引列
--buffer 指定–file时,仅在事务提交的时候刷新到磁盘
--bulk-delete 批量删除
--[no]bulk-delete-limit 是否开启批量删除限制,delete … limit
--bulk-insert 通过load-data批量插入
--columns=a 归档指定的字段,逗号分隔
--dry-run 试运行,不做任何处理
--max-flow-ctl 试用于pxc集群的类max-lag参数
--progress 指定多少行打印一次进度信息
--slave-user=s 从库用户
--slave-password=s 从库密码
--set-vars 设置执行时的mysql参数
--quick-delete 给delete加quick修饰符
--quiet 不输出任何信息,包括statistics信息
--retries 遇到超时或死锁的重试次数
--run-time 指定运行时间,s=seconds, m=minutes, h=hours, d=days; 如果不指定用的是s,例子:–run-time 600s
--config=A 个逗号分隔的配置文件列表;如果指定,这必须是命令行上的第一个选项
--statistics 收集和打印时间统计数据
--sentinel 默认文件是/tmp/pt-archiver-sentinel,该文件存在则退出归档
--stop 通过创建sentine文件来停止归档

官方文档:参数和使用方式