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_TIMESTAMP、NOW() 或 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 .../FIRSTALTER TABLE MODIFY COLUMN ... AFTER .../FIRSTALTER TABLE CHANGE COLUMN ... AFTER .../FIRST
如果遇到此错误,您需要重新同步该管道。