我试图用pt archiver清除mysql表,但遇到了一个奇怪的问题。
假设下面的查询返回60789行。
SELECT COUNT(*) FROM abc WHERE created_at BETWEEN '2008-09-01 00:00:00' AND '2008-09-05 23:59:59';
我使用以下pt archiver语法来清除行。
/usr/local/bin/pt-archiver --source h=localhost,u=root,p=abcdef,D=cbs_production,t=abc \
--where "created_at >= '2008-09-01 00:00:00' AND created_at <= '2008-09-05 23:59:59'" \
--purge --sleep-coef 1.0 --txn-size 1000 --progress=1000 --statistics
因此,它开始在每次迭代中删除1000行,但当它完成61000行时,它将永远挂起,并且不会删除剩余的789行。
我尝试了以下版本的percona工具包。pt archiver 3.0.9和pt archiver 3.0.10
我也参考了以下帖子,但没有任何效果。
https://bugs.launchpad.net/percona-toolkit/+bug/1096274
https://bugs.launchpad.net/percona-toolkit/+bug/1583498
https://bugs.launchpad.net/percona-toolkit/+bug/1193474
3条答案
按热度按时间fquxozlt1#
我不知道一个人能有多容易搞清楚主键
id
要传递给pt-archiver
脚本。更合适的解决方案是更新
pt-archiver
此线程中描述的脚本:https://bugs.launchpad.net/percona-toolkit/+bug/1193474/comments/4rkttyhzu2#
我无法重现你面临的问题:
是否可以发送您的mysql版本和表结构?
omtl5h9j3#
谢谢@vinicius。我发现了问题所在。
我使用了--where语句,如下所示。
当我使用“created\u at”时,pt archiver在最后一个事务中永远卡住了。然后我决定在--where语句中使用表的主键“id”,如下所示。
所以有了“身份证”,阿奇弗的工作就完美无瑕了。
我不知道为什么它不能与时间戳一起工作,但当使用“id”时问题就解决了。