对于 ByteHouse 而言,默认情况下,CREATE、DROP、ALTER 和 RENAME 等 DDL 仅会在当前节点执行。若希望对整个集群生效,可以使用 ON CLUSTER
子句以分布式方式运行此类查询,初始节点会将 DDL 自动发送到每个节点执行。
fe
例如,以下查询将在集群中的每个主机上创建 all_hits
分布式表:
CREATE TABLE IF NOT EXISTS all_hits ON CLUSTER cluster (p Date, i Int32) ENGINE = Distributed(cluster, default, hits)
On cluster
没有事务性,无法确保全部成功,也无法在单一节点是被时回滚。On cluster
在单个节点内执行查询的顺序是有保证的,因此如果发送了分布式 DDL,每个节点都会按发送顺序执行这些 DDL。system.distributed_ddl_queue
查看队列。distributed_ddl_task_timeout
配置(会话级参数,默认180秒),若 DDL 超时,会返回超时,但其后台仍会根据队列执行。distributed_ddl_task_timeout
配置设置为0(这样不再超时),这样可以确保在建表、Truncate 运行完后,再执行下一步操作。对于 ByteHouse 而言,只要开启了通用建表模式,向 ByteHouse 网关发送的 CREATE、DROP、ALTER 和 RENAME 等 DDL 均会以分布式 DDL 方式运行此类查询,初始节点会将 DDL 自动发送到每个节点执行。使得各节点上表信息的元数据一致,用于通用的建库、建表、改表场景。
但如果对节点直接发送 DDL,或通过网关的指定节点模式发送查询,DDL 只会在目标节点上生效。通常用于修复单一节点的数据问题。
例如,以下查询将在集群中的每个主机上创建 all_hits
分布式表:
CREATE TABLE IF NOT EXISTS all_hits (p Date, i Int32) ENGINE = Distributed(cluster, default, hits)
system.distributed_ddl_queue
查看队列。distributed_ddl_task_timeout
配置(会话级参数,默认180秒),若 DDL 超时,会返回超时,但其后台仍会根据队列执行。distributed_ddl_task_timeout
配置设置为 0(这样不再超时),这样可以确保在建表、Truncate 运行完后,再执行下一步操作。