跳转到主要内容
建议 ClickHouse Cloud 用户使用 ClickPipes 将 PostgreSQL 复制到 ClickHouse。它原生支持 PostgreSQL 的高性能 CDC (变更数据捕获) 。
使用 PostgreSQL 表的初始数据转储创建 ClickHouse 表,并启动复制过程;也就是说,它会执行一个后台作业,将远程 PostgreSQL database 中该 PostgreSQL 表发生的新变更同步过来。
此表引擎为 Experimental。要使用它,请在配置文件中将 allow_experimental_materialized_postgresql_table 设为 1,或使用 SET 命令:
SET allow_experimental_materialized_postgresql_table=1
如果需要复制多个表,强烈建议使用 MaterializedPostgreSQL 数据库引擎,而不是此表引擎,并使用 materialized_postgresql_tables_list setting 指定要复制的表 (后续还将支持添加 database schema) 。这样在 CPU、连接数以及远程 PostgreSQL database 内部的 replication slots 方面都会更优。

创建表

CREATE TABLE postgresql_db.postgresql_replica (key UInt64, value UInt64)
ENGINE = MaterializedPostgreSQL('postgres1:5432', 'postgres_database', 'postgresql_table', 'postgres_user', 'postgres_password')
PRIMARY KEY key;
引擎参数
  • host:port — PostgreSQL 服务器地址。
  • database — 远程数据库名称。
  • table — 远程表名。
  • user — PostgreSQL 用户。
  • password — 用户密码。

要求

  1. 在 PostgreSQL 配置文件中,wal_level 的值必须为 logical,且 max_replication_slots 参数的值必须至少为 2
  2. 使用 MaterializedPostgreSQL 引擎的表必须具有主键,并且该主键必须与 PostgreSQL 表的副本标识索引 (默认情况下为主键) 一致 (参见副本标识索引的详细信息) 。
  3. 仅允许使用 Atomic 数据库。
  4. MaterializedPostgreSQL 表引擎仅适用于 PostgreSQL 11 及以上版本,因为其实现依赖 PostgreSQL 的 pg_replication_slot_advance 函数。

虚拟列

  • _version — 事务计数器。类型:UInt64
  • _sign — 删除标记。类型:Int8。可能的值:
    • 1 — 行未删除,
    • -1 — 行已删除。
创建表时无需添加这些列。它们在 SELECT 查询中始终可用。 _version 列等于 WAL 中的 LSN 位置,因此可用于检查复制的最新状态。
CREATE TABLE postgresql_db.postgresql_replica (key UInt64, value UInt64)
ENGINE = MaterializedPostgreSQL('postgres1:5432', 'postgres_database', 'postgresql_replica', 'postgres_user', 'postgres_password')
PRIMARY KEY key;

SELECT key, value, _version FROM postgresql_db.postgresql_replica;
不支持复制 TOAST 的值。将使用该数据类型的默认值。
最后修改于 2026年6月10日