mysql - 向已经 HASH 分区的表添加额外的 HASH 分区

标签 mysql partitioning

您好,我目前有一个包含 100 个 HASH 分区的表。由于 future 的扩展,我决定现在需要将其增加到 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

最佳答案

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

只需 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,都会阻止元数据锁定。如果您在完成脚本时遇到问题,请确保您对表运行的任何查询和事务都能快速完成(否则,如果没有完成,您必须终止它们)。

关于mysql - 向已经 HASH 分区的表添加额外的 HASH 分区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55336322/

相关文章:

sql-server - SQL Server 分区 View 和锁定

c++ - 霍尔分区不起作用?

mysql - SQL不获取空列

php - PHP mysql 中的 WHERE 子句

apache-spark - PySpark - 优化 Parquet 读取后的分区数量

mysql - MySQL 5.5 中如何确定varchar 分区RANGE?

java.sql.SQLException : Access denied for user 'userapp' @'localhost' /glassfish 异常

php - 如何在Excel中获取MySQL表实体

MySQL:无法创建/写入文件 '/tmp/#sql_3c6_0.MYI'(错误代码:2)-这是什么意思?

Mysql分区从Key到Hash的变化