跳至主要内容

[实验性]MaterializedPostgreSQL

创建具有 PostgreSQL 表初始数据转储的 ClickHouse 表,并启动复制过程,即执行后台作业以在远程 PostgreSQL 数据库中应用 PostgreSQL 表发生的新更改。

注意

此表引擎处于实验阶段。要使用它,请在您的配置文件中或使用 SET 命令将 allow_experimental_materialized_postgresql_table 设置为 1。

SET allow_experimental_materialized_postgresql_table=1

如果需要多个表,强烈建议使用 MaterializedPostgreSQL 数据库引擎代替表引擎并使用 materialized_postgresql_tables_list 设置,该设置指定要复制的表(也可以添加数据库 schema)。在 CPU、更少的连接和远程 PostgreSQL 数据库中更少的复制槽方面,它会好得多。

创建表

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. 仅允许数据库 原子性

  4. MaterializedPostgreSQL 表引擎仅适用于 PostgreSQL 版本 >= 11,因为实现需要 pg_replication_slot_advance PostgreSQL 函数。

虚拟列

  • _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 值的复制。将使用数据类型的默认值。