从大型 percona mysql db 中删除许多行

Delete many rows from a large percona mysql db

我需要对这个案子有新的看法。任何想法表示赞赏。

输入:我们有一个巨大的 percona mysql (5.5) 数据库,需要几个 Tb(太字节)。 innodb 引擎上的表。 应尽快删除超过该大小的一半 (2/3)。 我们还有主从配置。

作为实现该目标的最快方法,我正在考虑以下解决方案: 在从服务器上为每个 table 执行(以避免生产停机):

  1. 停止复制
  2. Select 不删除行到空的新 table 中,它与原始 table
  3. 具有相同的结构
  4. 将原来的 table 重命名为 "table_old",新的 table - 更正名称
  5. 去掉原来的table"table_old"
  6. 开始复制

问题是我们有很多 FK 约束。我也害怕在此过程中破坏复制。

问题: 1) 此解决方案中的 FK 约束可能存在哪些潜在问题? 2)如何不中断复制? 3)意见?替代解决方案?

提前致谢。

如果您可以将数据库离线(也就是除了您之外没有人访问数据库)一段时间,您可以使用您的解决方案,但您需要删除之前涉及的 FK 并在之后重新创建它们。您还应该检查 AUTO_INCREMENT 列,这些列会随着复制操作而改变数字。

如果你想让数据库在线,就需要 FK,我在一些巨大的日志中遇到了类似的问题 tables,任何一次删除所有记录的尝试都可能会锁定数据库或损坏table.

所以我采用了一种缓慢的方法,我制作了一个程序,该程序将使用集群主键从 table 中删除成批的行,然后我将其安排为每 n 秒 运行 .