用途:为 ClickHouse 提供模式(Schema)迁移的实践模式集合,覆盖列变更、引擎更换、零停机切换、数据回填、跨服务器迁移与离线迁移等场景。
主要能力:
- ALTER TABLE 操作:ADD COLUMN(可带 DEFAULT、AFTER)、DROP COLUMN、MODIFY COLUMN(类型需兼容)、RENAME COLUMN,多为仅元数据操作,通常即时完成。
- 引擎更换:无法直接 ALTER 引擎,模式为新建表→从旧表插入→重命名,如 CREATE TABLE t_new ENGINE = ReplacingMergeTree() ORDER BY id AS SELECT * FROM t_old; 再 RENAME TABLE t_old TO t_backup, t_new TO t_old; 大表可用 INSERT INTO ... SELECT 分批。v22.5+ 可用 EXCHANGE TABLES t_old AND t_new 原子交换,要求两表存在且同库。
- 零停机迁移:建新表→建物化视图捕获新写入(CREATE MATERIALIZED VIEW mv TO t_new AS SELECT ... FROM t_old)→回填历史数据→校验一致性→切换应用→删除旧表与视图。
- 数据回填:按分区批量(如 WHERE toYYYYMM(date) = 202301),用 max_insert_block_size、max_threads 控制吞吐,通过 system.processes、system.merges 监控,回填后核对行数。
- 轻量变更:ALTER TABLE t UPDATE col = expr WHERE condition 默认异步(mutations_sync = 0),用 system.mutations 跟踪进度;ALTER TABLE t DELETE WHERE condition 会重写受影响 part;可用 max_rows_per_mutation 限流,重操作安排在低峰期。
- 跨服务器迁移:用 remote() 表函数,如 INSERT INTO local_db.t SELECT * FROM remote('source_host:9000', 'db', 't', 'user', 'pass'),大表按分区分批或走 clickhouse-local 离线方案。
- 离线迁移:clickhouse-local --file migration.sql 无需运行服务器即可执行迁移,适合冷数据模式变更或 CI/CD 校验;也可直接操作数据文件,如 clickhouse-local -S 'col1 Type1, col2 Type2' --input-format Native < data.bin。
- 版本管理:用专用表记录已应用迁移,如 CREATE TABLE _schema_migrations (name String, applied_at DateTime DEFAULT now()) ENGINE = TinyLog; 每次成功后插入一行,应用前先检查,配合部署脚本实现幂等。
- 分区操作:ATTACH PARTITION(结构相同则零拷贝)、REPLACE PARTITION(原子交换)、MOVE PARTITION。
限制与注意:Nullable 转非 Nullable 需为已有 NULL 提供默认值;修改 ORDER BY 需重建表;UPDATE/DELETE 会重写所有 part,应避开高峰;建议用生产数据量在预发环境测试;若任一表为副本表且副本路径不同,EXCHANGE TABLES 会失败。