ALTER
大多数 ALTER TABLE 查询会修改表设置或数据
| 修改器 |
|---|
| COLUMN |
| PARTITION |
| DELETE |
| UPDATE |
| ORDER BY |
| INDEX |
| CONSTRAINT |
| TTL |
| STATISTICS |
| 应用删除掩码 |
| 应用补丁 |
大多数 ALTER TABLE 查询仅支持用于 *MergeTree、Merge 和 Distributed 表。
这些 ALTER 语句操作视图
| 语句 | 描述 |
|---|---|
| ALTER TABLE ... MODIFY QUERY | 修改 物化视图 结构。 |
这些 ALTER 语句修改与基于角色的访问控制相关的实体
| 语句 |
|---|
| USER |
| ROLE |
| QUOTA |
| ROW POLICY |
| SETTINGS PROFILE |
| 语句 | 描述 |
|---|---|
| ALTER TABLE ... 修改 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、APPLY PATCHES、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。