[experimental] MaterializedPostgreSQL
使用PostgreSQL数据库表的初始数据转储创建ClickHouse数据库,并启动复制过程,即执行后台作业,以便在远程PostgreSQL数据库中的PostgreSQL数据库表上发生新更改时应用这些更改。
ClickHouse服务器作为PostgreSQL副本工作。它读取WAL并执行DML查询。DDL不是复制的,但可以处理(如下所述)。
创建数据库
CREATE DATABASE [IF NOT EXISTS] db_name [ON CLUSTER cluster]ENGINE = MaterializedPostgreSQL('host:port', ['database' | database], 'user', 'password') [SETTINGS ...]
Engine参数
host:port— PostgreSQL服务地址database— PostgreSQL数据库名user— PostgreSQL用户名password— 用户密码
设置
CREATE DATABASE database1ENGINE = MaterializedPostgreSQL('postgres1:5432', 'postgres_database', 'postgres_user', 'postgres_password')SETTINGS materialized_postgresql_max_block_size = 65536,materialized_postgresql_tables_list = 'table1,table2,table3';SELECT * FROM database1.table1;
必备条件
在postgresql配置文件中将wal_level设置为
logical,将max_replication_slots设置为2。每个复制表必须具有以下一个replica identity:
default (主键)
index
postgres# CREATE TABLE postgres_table (a Integer NOT NULL, b Integer, c Integer NOT NULL, d Integer, e Integer NOT NULL);postgres# CREATE unique INDEX postgres_table_index on postgres_table(a, c, e);postgres# ALTER TABLE postgres_table REPLICA IDENTITY USING INDEX postgres_table_index;
总是先检查主键。如果不存在,则检查索引(定义为副本标识索引)。 如果使用index作为副本标识,则表中必须只有一个这样的索引。 你可以用下面的命令来检查一个特定的表使用了什么类型:
postgres# SELECT CASE relreplidentWHEN 'd' THEN 'default'WHEN 'n' THEN 'nothing'WHEN 'f' THEN 'full'WHEN 'i' THEN 'index'END AS replica_identityFROM pg_classWHERE oid = 'postgres_table'::regclass;
注意
- TOAST不支持值转换。将使用数据类型的默认值。
使用示例
CREATE DATABASE postgresql_dbENGINE = MaterializedPostgreSQL('postgres1:5432', 'postgres_database', 'postgres_user', 'postgres_password');SELECT * FROM postgresql_db.postgres_table;
