首页 > 解决方案 > 向已经 HASH 分区的表添加额外的 HASH 分区

问题描述

嗨,我目前有一个包含 100 个 HASH 分区的表。由于未来的扩展,我决定现在需要将其增加到 1000 个分区。

我是否需要从表中删除分区,然后在之后添加 1000 个分区,或者有没有办法将额外的 900 个分区添加到已经分区的表中?

我分区的方式是使用下面的代码。

ALTER TABLE t1
PARTITION BY HASH(venue_id)
PARTITIONS 100;

还有一种方法可以估计将 1000 个分区添加到我的表需要多长时间?我将使用一种 perconas 工具来执行此操作,这将防止表锁定。https://www.percona.com/doc/percona-toolkit/LATEST/pt-online-schema-change.html

标签: mysqlpartitioning

解决方案


您无需删除分区即可重新分区。无论如何,它都会将行插入到新表中,因此您不妨一步完成。

只需 ALTER TABLE 并定义新的分区方案:

ALTER TABLE t1
PARTITION BY HASH(venue_id)
PARTITIONS 1000;

或者使用 pt-online-schema-change:

pt-online-schema-change h=myhost,D=mydatabase,t=t1 
  --alter "PARTITION BY HASH(venue_id) PARTITIONS 1000" 
  --execute

(我在其中放置了换行符以避免换行,但这是一个命令。)


我忘了评论你的另一个问题,关于预测 ETA 的完成。

Percona 脚本的一个优点是它报告进度,您可以从中获得对完成的估计。虽然在我们的环境中,我们发现它不是很准确。它有时会报告说它在几个小时内完成了 99%。

还要记住,Percona 脚本不是 100% 没有锁定的。它在运行开始和结束时需要短暂的独占元数据锁,因为它需要创建触发器,然后重命名表并在最后删除触发器。任何查询,甚至是只读的SELECT,都会阻塞元数据锁。如果您在完成脚本时遇到问题,请确保您对表运行的任何查询和事务快速完成(否则,如果没有,您必须终止它们)。


推荐阅读