pt-archiver #
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
设计为从它选择的索引起始位置开始并仅向前扫描。如果您尝试从表的末尾开始删除数据,并使用的不是其优先选择的索引,可能会导致较长的表扫描。若出现此种情况,请参阅 --source
和 i
部分的文档以获取更多信息。
使用方法 #
pt-archiver [OPTIONS] --source DSN --where WHERE
pt-archiver
从 MySQL 表中逐块归档记录。--source
和 --dest
参数使用 DSN 语法;如果 COPY
为 yes
,则 --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 &