ALTER
大多数 ALTER TABLE
查询修改表设置或数据
大多数 ALTER TABLE
查询仅支持 *MergeTree 表,以及 Merge 和 Distributed。
这些 ALTER
语句操作视图
- ALTER TABLE ... MODIFY QUERY — 修改 物化视图 结构。
- ALTER LIVE VIEW — 刷新 实时视图。
这些 ALTER
语句修改与基于角色的访问控制相关的实体
ALTER TABLE ... MODIFY COMMENT 语句添加、修改或删除表的注释,无论之前是否设置过。
ALTER NAMED COLLECTION 语句修改 命名集合。
变异
旨在操作表数据的 ALTER
查询通过称为“变异”的机制实现,最显著的是 ALTER TABLE ... DELETE 和 ALTER TABLE ... UPDATE。它们是类似于 MergeTree 表中合并的异步后台进程,用于生成新“变异”的部分版本。
对于 *MergeTree
表,变异通过**重写整个数据部分**来执行。没有原子性 - 部分在准备好后立即替换为变异部分,并且在变异期间开始执行的 SELECT
查询将看到来自已变异部分的数据以及来自尚未变异部分的数据。
变异按其创建顺序完全排序,并按该顺序应用于每个部分。变异也与 INSERT INTO
查询部分排序:在提交变异之前插入到表中的数据将被变异,之后插入的数据将不会被变异。请注意,变异不会以任何方式阻止插入。
变异条目在添加变异条目后立即返回(对于复制表,返回到 ZooKeeper,对于非复制表,返回到文件系统)。变异本身使用系统配置文件设置异步执行。要跟踪变异的进度,可以使用 system.mutations
表。成功提交的变异即使 ClickHouse 服务器重新启动也将继续执行。一旦提交,就无法回滚变异,但是如果变异由于某种原因卡住,可以使用 KILL MUTATION
查询取消。
已完成变异的条目不会立即删除(保留的条目数由 finished_mutations_to_keep
存储引擎参数确定)。较旧的变异条目将被删除。
ALTER 查询的同步性
对于非复制表,所有 ALTER
查询都是同步执行的。对于复制表,查询只是将相应操作的指令添加到 ZooKeeper
,并且这些操作本身尽快执行。但是,查询可以等待这些操作在所有副本上完成。
对于创建变异的 ALTER
查询(例如:包括但不限于 UPDATE
、DELETE
、MATERIALIZE INDEX
、MATERIALIZE PROJECTION
、MATERIALIZE COLUMN
、APPLY DELETED MASK
、CLEAR STATISTIC
、MATERIALIZE STATISTIC
),同步性由 mutations_sync 设置定义。
对于其他仅修改元数据的 ALTER
查询,可以使用 alter_sync 设置来设置等待。
可以使用 replication_wait_for_inactive_replica_timeout 设置指定等待非活动副本执行所有 ALTER
查询的时间(以秒为单位)。
对于所有 ALTER
查询,如果 alter_sync = 2
并且某些副本在 replication_wait_for_inactive_replica_timeout
设置中指定的时间内未处于活动状态,则会抛出异常 UNFINISHED
。