巨大的未分区 MySQL table 问题

Giant unpartitioned MySQL table issues

我有一个 MySQL table,大小约为 8TB。你可以想象,查询是可怕的。

我在考虑:

  1. 使用分区
  2. 创建一个新的table
  3. 循环执行一系列查询以将数据转储到这些分区

但是循环将需要提交大量查询并且每个查询都非常慢。

有更好的方法吗?就地重新分区生产数据库是行不通的——这似乎是一个不错的选择,但速度很慢

有没有一种工具可以让生活更轻松?而不是 Python 作业循环和提交作业?

非常感谢

您可以使用 pt-online-schema-change。这个免费工具允许您使用 ALTER TABLE 语句对 table 进行分区,但它不会阻止客户端在重组 table 时使用它。

另一个有用的工具可能是 pt-archiver。您可以根据您的分区想法创建一个新的 table,然后 pt-archiver 逐渐将数据从旧的 table 复制或移动到新的 table.

当然,首先要在小得多的 table 上的测试环境中尝试使用这些工具,这样您就可以练习使用它们。请勿在您的 8TB table.

上首次尝试使用它们

无论您使用什么解决方案,您都需要足够的存储空间 space 来存储整个数据集两次,外加二进制日志。旧的 table 不会缩小,即使您从中删除数据也是如此。所以我希望你的文件系统至少是 24TB。否则新的 table 应该存储在不同的服务器上(或者最好是其他几台服务器)。

无论使用哪种解决方案,都需要很长时间。我预计至少需要 4 周,如果您没有配备 direct-attached NVMe 存储的非常强大的服务器,可能会更长。

如果您使用远程存储(如 Amazon EBS),它可能无法在您退休之前完成!

在我看来,即使您尝试分区,单个 table 的 8TB 也是一个问题。分区不会神奇地修复性能,并且可能会使某些查询变得更糟。您有查询分区 table 的经验吗?您是否了解分区修剪的工作原理以及何时不起作用?

在您选择分区作为您的解决方案之前,我建议您阅读 MySQL 手册中有关分区的整个章节:https://dev.mysql.com/doc/refman/8.0/en/partitioning.html, especially the page on limitations: https://dev.mysql.com/doc/refman/8.0/en/partitioning-limitations.html 然后尝试使用较小的 table。

对于这种规模的数据,比分区更好的策略是将数据拆分为碎片,并将每个碎片存储在多个数据库服务器之一上。您需要一个添加更多分片的策略,因为我认为数据会继续增长。