Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

Schema 变更传播支持

MySQL 的 ClickPipes 可以检测源表中的 schema 变更,并且在某些情况下会自动将这些变更传播到目标端表。下文说明了各类 DDL 操作的处理方式:

Schema 变更类型 行为
添加新列 (ALTER TABLE ADD COLUMN ...) 自动传播。schema 变更后复制的所有行都会包含新列
添加带默认值的新列 (ALTER TABLE ADD COLUMN ... DEFAULT ...) 自动传播。支持的默认值也会添加到 ClickHouse 列中,因此这些默认值既适用于 ClickHouse 中已有的行,也适用于 schema 变更后复制的行。
删除现有列 (ALTER TABLE DROP COLUMN ...) 可以检测到,但不会传播。对于 schema 变更后复制的所有行,被删除的列将填充为 NULL

新增列的默认值

对于新增列,ClickPipes 仅在能够安全地将该值转换为 ClickHouse 支持的形式时才会传播默认值。传播后,ClickHouse 会在读取早于新列的数据分区片段时使用该默认值。因此,ClickHouse 中已有的行无需完整刷新表即可获得源端默认值。

ClickPipes 会传播整数字面量、小数字面量和浮点数字面量、布尔值、简单的字符串和日期值;当 MySQL 服务器提供完整的 binlog 行元数据时,还会传播枚举或集合值。它会使用与 ClickHouse 兼容的引号规则重写字符串字面量。

ClickPipes 会特意省略并非可移植字面量的默认值,包括 NULL、比特字面量、CURRENT_TIMESTAMPNOW()UUID() 等函数调用,以及包含反斜杠或控制字符的字符串值。该列仍会被添加,但对于早于该列的数据分区片段,ClickHouse 会使用相应类型的常规默认值。如果这些现有行必须包含源端默认值,则需要完整刷新表。

ClickPipes 仅在执行 ALTER TABLE ADD COLUMN 时传播默认值。后续更改或移除列默认值的操作不会传播到 ClickHouse。

MySQL 5.x 限制

早于 8.0.1 的 MySQL 版本不会在 binlog 中包含完整的列元数据 (binlog_row_metadata=FULL) ,因此 ClickPipes 会按列的序号跟踪列。这意味着:

  • 在末尾添加列 (ALTER TABLE ADD COLUMN ...) 受支持。
  • 任何会导致列位置移位的 DDL 都会导致管道报错,因为届时将无法再可靠地按序号进行映射。这包括:
    • ALTER TABLE DROP COLUMN ...
    • ALTER TABLE ADD COLUMN ... AFTER ... / FIRST
    • ALTER TABLE MODIFY COLUMN ... AFTER ... / FIRST
    • ALTER TABLE CHANGE COLUMN ... AFTER ... / FIRST

如果遇到此错误,您需要重新同步该管道。

Navigation