ClickHouse/docs/ru/engines/database-engines/materialized-postgresql.md
Dmitriy 27f489b41f Correction of the description
Скорректировал описание.
2021-08-07 18:50:24 +03:00

4.5 KiB
Raw Blame History

toc_priority toc_title
30 MaterializedPostgreSQL

[экспериментальный] MaterializedPostgreSQL

Создает базу данных ClickHouse с исходным дампом данных таблиц PostgreSQL и запускает процесс репликации, т.е. выполняется применение новых изменений в фоне, как эти изменения происходят в таблице 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 ...]

Параметры движка

  • host:port — адрес сервера PostgreSQL.
  • database — имя базы данных на удалённом сервере.
  • user — пользователь PostgreSQL.
  • password — пароль пользователя.

Настройки

CREATE DATABASE database1
ENGINE = 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;

Требования

  1. Настройка wal_level должна иметь значение logical, параметр max_replication_slots должен быть равен по меньшей мере 2 в конфигурационном файле в PostgreSQL.

  2. Каждая реплицируемая таблица должна иметь один из следующих репликационных идентификаторов:

  • первичный ключ (по умолчанию)

  • индекс

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;

Первичный ключ всегда проверяется первым. Если он отсутствует, то проверяется индекс, определенный как replica identity index (репликационный идентификатор). Если индекс используется в качестве репликационного идентификатора, то в таблице должен быть только один такой индекс. Вы можете проверить, какой тип используется для указанной таблицы, выполнив следующую команду:

postgres# SELECT CASE relreplident
          WHEN 'd' THEN 'default'
          WHEN 'n' THEN 'nothing'
          WHEN 'f' THEN 'full'
          WHEN 'i' THEN 'index'
       END AS replica_identity
FROM pg_class
WHERE oid = 'postgres_table'::regclass;

!!! warning "Предупреждение" Репликация TOAST-значений не поддерживается. Для типа данных будет использоваться значение по умолчанию.

Пример использования

CREATE DATABASE postgresql_db
ENGINE = MaterializedPostgreSQL('postgres1:5432', 'postgres_database', 'postgres_user', 'postgres_password');

SELECT * FROM postgresql_db.postgres_table;