ClickHouse Cloud 现已提供 ClickPipes,可将外部 PostgreSQL 数据库迁移到 Managed Postgres 服务。这项内置集成简化了整个流程,帮助您连接源数据库、导出 schema、将其导入 Managed Postgres,并设置持续复制。
前置条件
- 能够使用具有复制权限的用户访问源 PostgreSQL 数据库。请按照与您的数据源对应的设置指南进行配置:
- 准备一个 ClickHouse Managed Postgres 服务作为迁移目标。如果您还没有,请参阅快速入门。
- 在本地计算机上安装
pg_dump和psql。两者都包含在标准 PostgreSQL 客户端工具中。
迁移前注意事项
- DDL 传播:持续复制 (CDC) 会捕获 DML 操作和
ADD COLUMN。其他 DDL 更改 (如DROP COLUMN和ALTER COLUMN) 不会自动传播,必须在目标端手动执行。
步骤 1:连接到源数据库
打开 ClickHouse Cloud 控制台,选择您的 Managed Postgres 服务。

在左侧边栏中,点击 数据源。

点击 开始导入。

填写源 PostgreSQL 数据库的连接信息:主机、端口、用户名、密码和数据库名称。如果源数据库要求使用 TLS,请启用该选项。
如果您需要通过私网连接访问源数据库,可以选择 SSH 隧道 并提供所需的 SSH 信息。这样,迁移便可安全连接到无法从公网访问的数据库。
选择一种摄取方式:
- 初始加载 + CDC — 先复制现有数据,然后持续将后续变更同步到目标端。
- 仅初始加载 — 一次性复制,不进行持续复制。
- 仅 CDC — 跳过初始复制,仅复制从此刻开始产生的新变更。

点击 下一步。
自动 schema 迁移

选择此选项后,ClickPipe 会在创建完成后的 Setup 阶段 自动获取源数据库的 schema,并将其应用到您的 Managed Postgres 服务。
此功能要求目标数据库为空,因为无论您稍后在向导中选择哪些表,它都会从源数据库获取所有数据库对象。如果目标数据库中已有数据,或需要更灵活的自定义配置,则必须改用 手动 模式。
从下拉列表中选择目标数据库,或单击创建新数据库来预配一个数据库。

监控
您可以在 ClickPipes 详情视图中跟踪 schema 迁移进度。日志会显示 schema 迁移的状态,以及过程中遇到的任何错误。
此模式存在以下限制:
- 使用 SSH 隧道的管道无法使用自动 schema 迁移。必须手动导出和导入 schema。
手动 schema 迁移
如果目标数据库中已有数据,或者希望采用比自动模式所要求的全新环境更灵活的自定义设置,可以在此选择 手动 模式。

导出数据库 schema
向导会显示一条已预填源连接信息的 pg_dump 命令。在终端中运行它:

pg_dump \
-h <source_host> \
-U <source_user> \
-d <source_database> \
--schema-only \
-f pg.sql这会在当前目录中创建 pg.sql。

点击 下一步。
将 schema 导入您的 Managed Postgres 服务
从下拉列表中选择目标数据库,或点击 创建新数据库 来创建新数据库。
向导会显示一条 psql 命令,用于将 schema 转储导入您的 Managed Postgres 服务。在终端中运行它:

psql \
-h <target_host> \
-p 5432 \
-U <target_user> \
-d <target_database> \
-f pg.sql
点击 下一步。
Step 4: 配置摄取设置
指定用于逻辑复制的 publication。将此项留空时,系统会自动创建 publication。
展开 高级复制设置 以调整吞吐量:
| 设置 | 默认值 | 说明 |
|---|---|---|
| 同步间隔 (秒) | 10 | 轮询 replication slot 的频率 |
| 初始加载的并行线程数 | 4 | 批量复制阶段使用的线程数 |
| 拉取批次大小 | 100,000 | 每个复制批次拉取的行数 |
| 每个分区快照的行数 | 100000 | 大表快照的分区大小 |
| 并行创建快照的表数量 | 1 | 并行执行快照的表数量 |

点击 下一步。
第 5 步:选择表
选择要复制的表。表会按 schema 分组显示。你可以选择单个表,也可以展开某个 schema,一次性选择其中的所有表。

点击 Create migration。
监控迁移
创建迁移后,你会在数据源中看到它,状态为 运行中。

点击该迁移以打开详情视图。Tables 选项卡会显示每个表的初始加载进度,包括已处理的行数、分区数,以及每个分区的平均耗时。Metrics 选项卡则会在 CDC 开始后显示复制延迟和吞吐量。

迁移后任务
初始加载完成后,如果使用 CDC,且复制延迟几乎为零:
验证行数。 在切换流量之前,对源端和目标端的关键表进行抽查:
SELECT COUNT(*) FROM public.orders;停止向源端写入。 暂停应用写入。要在切换期间强制设为只读模式:
ALTER DATABASE <source_db> SET default_transaction_read_only = on;确认复制已追上。 比较源端和目标端的最新一行:
-- 在源端和目标端均执行
SELECT MAX(id), MAX(updated_at) FROM public.orders;重置序列。 使序列与各表中的当前最大值保持一致:
DO $$
DECLARE r RECORD;
BEGIN
FOR r IN
SELECT
n.nspname AS schema_name,
c.relname AS table_name,
a.attname AS column_name,
pg_get_serial_sequence(format('%I.%I', n.nspname, c.relname), a.attname) AS seq_name
FROM pg_class c
JOIN pg_namespace n ON n.oid = c.relnamespace
JOIN pg_attribute a ON a.attrelid = c.oid
WHERE c.relkind = 'r'
AND a.attnum > 0
AND NOT a.attisdropped
AND n.nspname NOT IN ('pg_catalog', 'information_schema')
LOOP
IF r.seq_name IS NOT NULL THEN
EXECUTE format(
'SELECT setval(%L, COALESCE((SELECT MAX(%I) FROM %I.%I), 0) + 1, false)',
r.seq_name, r.column_name, r.schema_name, r.table_name
);
END IF;
END LOOP;
END $$;切换应用流量。 将读写流量切换到你的 Managed Postgres 服务,并监控错误、约束冲突以及复制状态是否正常。
清理。 完成切换并确认新服务运行正常后,从数据源中删除此次迁移。如果你使用了 CDC,请从源端删除 replication slot 以释放资源:
SELECT pg_drop_replication_slot('<slot_name>');