pt-archiver

pt-archiver #

https://docs.percona.com/percona-toolkit/pt-archiver.html

pt-archiver - 归档MySQL表中的行到另一个表或文件中。

简介 #

说明 #

pt-archiver是用于归档表的工具,具体说明可见 https://web.archive.org/web/20071014031743/http://www.xaprb.com/blog/2006/05/02/how-to-write-efficient-archiving-and-purging-jobs-in-sql。其目标是实现一种低影响、单向的任务,逐步从表中移除旧数据,而不会对OLTP查询产生较大影响。可以将数据插入到另一张表中(不一定在同一服务器上),或者将其写入适合于 LOAD DATA INFILE 的文件中。若两者皆不做,那么它将只是一个增量 DELETE 操作。

pt-archiver可通过插件机制进行扩展。可以插入自定义代码,以添加高级归档逻辑,这对归档依赖数据、应用复杂的业务规则,或在归档过程中构建数据仓库都可能非常有用。

在使用该工具时,需要仔细选择一些选项的值,最重要的选项有 --limit--retries--txn-size

其策略是找到第一行记录,然后利用某个索引单向扫描以高效找到更多记录。每个后续查询不应扫描整个表;而是应当在索引中定位,然后扫描直到找到更多可归档的行。在 --source 参数的 i 部分指定索引对此至关重要;可以使用 --dry-run 检查生成的查询,并确保对其执行 EXPLAIN,以确认是否高效(大多数情况下,可能希望扫描默认的主键 PRIMARY)。更理想的是,在运行查询前后检查 Handler 状态计数器的差异,以确保每次查询不会扫描整个表。

可以通过 --no-ascend--ascend-first 部分或完全禁用“定位后扫描”优化。对于多列键而言,有时这样可能更高效。请注意,pt-archiver设计为从它选择的索引起始位置开始并仅向前扫描。如果您尝试从表的末尾开始删除数据,并使用的不是其优先选择的索引,可能会导致较长的表扫描。若出现此种情况,请参阅 --sourcei 部分的文档以获取更多信息。

使用方法 #

pt-archiver [OPTIONS] --source DSN --where WHERE

pt-archiver 从 MySQL 表中逐块归档记录。--source--dest 参数使用 DSN 语法;如果 COPYyes,则 --dest 默认使用 --source 的键值。

示例 #

将所有行从oltp_server归档到olap_server并保存到一个文件中:

1pt-archiver --source h=oltp_server,D=test,t=tbl --dest h=olap_server \
2  --file '/var/log/archive/%Y-%m-%d-%D.%t'                           \
3  --where "1=1" --limit 1000 --commit-each

从子表中清除(删除)孤立行:

1pt-archiver --source h=host,D=db,t=child --purge \
2  --where 'NOT EXISTS(SELECT * FROM parent WHERE col=child.col)'

风险 #

Percona Toolkit 是一个成熟的工具,经过实际环境验证并进行了充分测试,但所有数据库工具都可能对系统和数据库服务器带来风险。在使用该工具之前,请:

  • 阅读工具的文档
  • 查看工具已知的“BUG”
  • 在非生产服务器上测试工具
  • 备份生产服务器并验证备份

输出 #

如果指定了--progress参数,输出将包含一个标题行,并以间隔的方式显示状态输出。状态输出的每一行列出当前日期和时间、pt-archiver已运行的秒数以及已归档的行数。

如果指定了--statistics参数,pt-archiver将输出时间统计和其他信息,帮助您确定归档过程中最耗时的环节。

错误处理 #

pt-archiver尝试捕获信号并平稳退出;例如,如果您向其发送SIGTERM信号(在类似UNIX的系统上按下Ctrl-C),它会捕获信号,打印一条关于该信号的消息,然后平稳退出。它不会执行 --analyze--optimize,因为这些操作可能耗时较长。但它会正常运行所有其他代码,包括调用任何插件的 after_finish()(参见“扩展”部分)。

换句话说,如果捕获到信号,它将跳出主要的归档循环并跳过优化/分析步骤。

参数 #

DSN参数 #

环境变量PTDEBUG #

环境变量PTDEBUG可启用详细的调试输出至STDERR。要启用调试并将所有输出捕获到文件中,请按以下方式运行工具:

1PTDEBUG=1 pt-archiver ... > FILE 2>&1

注意

  • 调试输出量很大,可能会生成数兆字节的数据。
  • 使用PTDEBUG可能会暴露密码。启用调试时,所有命令行参数将显示在输出中。

BUGS #

已知问题列表,请访问https://jira.percona.com/projects/PT/issues

请在https://jira.percona.com/projects/PT上报告错误。在您的错误报告中包括以下信息:

  • 运行工具时使用的完整命令行
  • 工具的--version
  • 所有涉及服务器的 MySQL 版本
  • 工具的输出,包括标准错误输出(STDERR)
  • 输入文件(日志/转储/配置文件等)

如果可能,通过使用PTDEBUG运行工具来包含调试输出;请参见“ENVIRONMENT”部分。

实用示例 #

注意

正式执行之前先使用--dry-run测试。并对--dry-run检查生成的查询进行EXPLAIN,以确认是否高效(大多数情况下,可能希望扫描默认的主键PRIMARY)。

删除历史数据 #

1pt-archiver \
2    --source h='127.0.0.1',u='<sourcer_user>',p='<password>',P=3306,D=database_name,t=table1 \
3    --progress 10000 --limit=1000 --txn-size 1000 --bulk-delete \
4    --statistics --purge --no-check-charset --why-quit \
5    --where "id<8950003" > table1.log 2>&1 &

归档某个表的数据 #

1pt-archiver \
2    --source h='127.0.0.1',u='<sourcer_user>',p='<source_pwd>',P=3306,D=source_database,t=table1 \
3    --dest h=<dest_ip>,P=3306,u=<dest_user>,p=<dest_pwd>,D=dest_database,t=table1 \
4    --progress 10000 --limit=1000 --txn-size 1000 --bulk-insert \
5    --statistics --purge --no-check-charset --why-quit \
6    --where "id<300000045" > table1.log 2>&1 &
1pt-archiver \
2    --source h='localhost',u='<sourcer_user>',p='<source_pwd>',P=3306,D=source_database,t=table1 \
3    --dest h=<dest_ip>,P=3306,u=<dest_user>,p=<dest_pwd>,D=dest_database,t=table1 \
4    --progress 10000 --limit=1000 --txn-size 1000 --bulk-insert \
5    --statistics --purge --no-check-charset --why-quit \
6    --where "user_id=912" > table1.log 2>&1 &
© 2025 青蛙小白 | 总访问量 | 总访客数