【问题标题】:Turn MySQL query into Percona pt-archiver string将 MySQL 查询转换为 Percona pt-archiver 字符串
【发布时间】:2017-11-09 14:02:59
【问题描述】:

在pt-archiver中如何表达?

DELETE * FROM Table1 JOIN ON Table1.id=Table2.id WHERE Table2.id>=1;

我找不到在 pt-archiver 字符串中加入 Table1 和 Table2 的任何可能性。我试过了,但是 Table2 的连接字符串丢失了:

pt-archiver --source h=127.0.0.1,D=db,t=Table1 --purge --where 'Table2.id >= 1'

请给我一些你的想法。

【问题讨论】:

  • pt-archiver 似乎不支持多表案例。如果您想优化您的查询,我认为将大 DELETE 拆分为较小的。比如Table2.id>=20000000 ...然后Table2.id>=1000000 ..
  • 是的,我知道它可以工作,但是如果我这样做,应该手动控制服务器以解决过载问题并在紧急情况下进行调整。我在 Percona 主页上找到了一些解决方案,如下:pt-archiver --source h=host,D=db,t=child --purge \ --where 'EXISTS(SELECT * FROM parent WHERE col=child.col AND child.col>=1)'。这可能有效,但我不确定父表的声明方式和位置。有什么想法吗?
  • 大概是这样的?? pt-archiver --source h=localhost,D=db,t=Table1 --purge \ --where 'EXISTS(SELECT * FROM Table2 WHERE id=Table1.id AND Table2.id>=1)'
  • 试试--dry-run。这个选项告诉你 cmd 会做什么

标签: mysql sql percona


【解决方案1】:

我已经完成了你所描述的任务,我使用 pt-archiver 归档还必须连接到另一个表的行。

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

这可行,但我不确定父表的声明方式和位置。有什么想法吗?

您在源 DSN 中为 pt-archiver 声明了一个表。这就是本例中的child 表。

您没有在 pt-archiver 选项中声明 parent 表。它仅在您在 --where 选项中拼出的子查询中引用,与上面的示例完全相同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    相关资源
    最近更新 更多