> ## Documentation Index
> Fetch the complete documentation index at: https://clickhouse.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# PostgreSQL

> Página que descreve como integrar o PostgreSQL ao ClickHouse

export const ExperimentalBadge = () => {
  return <div className="experimentalBadge">
            <div className="experimentalIcon">
            <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
                <path strokeWidth="1.25" d="M5.5 2H10.5" stroke="currentColor" strokeLinecap="round" strokeLinejoin="round" />
                <path strokeWidth="1.25" d="M9.50015 2V6.19625L13.4283 12.7425C13.4738 12.8183 13.4985 12.9049 13.4996 12.9934C13.5008 13.0818 13.4785 13.169 13.435 13.246C13.3914 13.323 13.3283 13.3871 13.2519 13.4317C13.1755 13.4764 13.0886 13.4999 13.0002 13.5H3.00015C2.91164 13.5 2.8247 13.4766 2.74822 13.432C2.67174 13.3874 2.60847 13.3233 2.56487 13.2463C2.52126 13.1693 2.49889 13.082 2.50004 12.9935C2.50119 12.905 2.52582 12.8184 2.5714 12.7425L6.50015 6.19625V2" stroke="currentColor" strokeLinecap="round" strokeLinejoin="round" />
                <path strokeWidth="1.25" d="M4.47656 9.56754C5.30344 9.41254 6.47656 9.47942 7.99969 10.25C10.0153 11.2707 11.4216 11.0569 12.2184 10.7282" stroke="currentColor" strokeLinecap="round" strokeLinejoin="round" />
            </svg>
        </div>
            Recurso experimental. <u><a href="/docs/docs/beta-and-experimental-features#experimental-features">Saiba mais.</a></u>
        </div>;
};

export const CloudNotSupportedBadge = () => {
  return <div className="cloudNotSupportedBadge">
            <div className="cloudNotSupportedIcon">
            <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
                <path strokeWidth="1.5" d="M6.33366 12.6666L12.3739 12.6667C13.6593 12.6667 14.7073 11.6187 14.7073 10.3334C14.7073 9.04804 13.6593 8.00003 12.3739 8.00003C12.3739 8.00003 12.3337 7.66659 12.0003 7.33325M10.667 5.33322C8.00033 2.33325 4.45395 4.78537 4.14195 6.68203C2.55728 6.7627 1.29395 8.06203 1.29395 9.6667C1.29395 11.3234 2.66699 12.6666 4.00033 12.6666" stroke="currentColor" strokeLinecap="round" strokeLinejoin="round" />
                <path strokeWidth="1.5" d="M2.66699 14L12.0003 4.66663" stroke="currentColor" strokeLinecap="round" strokeLinejoin="round" />
            </svg>

        </div>
            Sem suporte no ClickHouse Cloud
        </div>;
};

> Um guia completo de migração do PostgreSQL para o ClickHouse, incluindo orientações sobre modelagem de dados e conceitos equivalentes, pode ser encontrado [aqui](/docs/pt-BR/get-started/migrate/postgres/overview). A seguir, descrevemos como conectar o ClickHouse ao PostgreSQL.

Esta página aborda as seguintes opções para integrar o PostgreSQL ao ClickHouse:

* usar o mecanismo de tabela `PostgreSQL` para ler dados de uma tabela do PostgreSQL
* usar o mecanismo de banco de dados experimental `MaterializedPostgreSQL` para sincronizar um banco de dados do PostgreSQL com um banco de dados no ClickHouse

<Tip>
  Confira nosso serviço [Managed Postgres](/docs/pt-BR/products/managed-postgres/overview). Com armazenamento NVMe fisicamente co-localizado com o compute, ele oferece desempenho até 10x superior para workloads limitadas por disco em comparação com alternativas que usam armazenamento conectado à rede, como EBS, e permite replicar seus dados do Postgres para o ClickHouse usando o conector Postgres CDC no ClickPipes.
</Tip>

<div id="using-the-postgresql-table-engine">
  ## Usando o mecanismo de tabela PostgreSQL
</div>

O mecanismo de tabela `PostgreSQL` permite realizar operações **SELECT** e **INSERT** em dados armazenados no servidor PostgreSQL remoto a partir do ClickHouse.
Este artigo ilustra métodos básicos de integração usando uma única tabela.

<div id="1-setting-up-postgresql">
  ### 1. Configurando o PostgreSQL
</div>

1. Em `postgresql.conf`, adicione a seguinte entrada para permitir que o PostgreSQL aceite conexões nas interfaces de rede:

```text theme={null}
  listen_addresses = '*'
```

2. Crie um usuário para se conectar no ClickHouse. Para fins de demonstração, este exemplo concede privilégios totais de superusuário.

```sql theme={null}
  CREATE ROLE clickhouse_user SUPERUSER LOGIN PASSWORD 'ClickHouse_123';
```

3. Crie um novo banco de dados no PostgreSQL:

```sql theme={null}
  CREATE DATABASE db_in_psg;
```

4. Crie uma nova tabela:

```sql theme={null}
  CREATE TABLE table1 (
      id         integer primary key,
      column1    varchar(10)
  );
```

5. Vamos adicionar algumas linhas para teste:

```sql theme={null}
  INSERT INTO table1
    (id, column1)
  VALUES
    (1, 'abc'),
    (2, 'def');
```

6. Para configurar o PostgreSQL para permitir conexões com o novo banco de dados usando o novo usuário de replicação, adicione a seguinte entrada ao arquivo `pg_hba.conf`. Atualize a linha de endereço com a sub-rede ou o endereço IP do seu servidor PostgreSQL:

```text theme={null}
  # TYPE  DATABASE        USER            ADDRESS                 METHOD
  host    db_in_psg             clickhouse_user 192.168.1.0/24          password
```

7. Recarregue o arquivo de configuração `pg_hba.conf` (ajuste este comando de acordo com a sua versão):

```text theme={null}
  /usr/pgsql-12/bin/pg_ctl reload
```

8. Verifique se o novo `clickhouse_user` consegue se conectar:

```text theme={null}
  psql -U clickhouse_user -W -d db_in_psg -h <your_postgresql_host>
```

<Note>
  Se você estiver usando este recurso no ClickHouse Cloud, talvez seja necessário permitir que os endereços IP do ClickHouse Cloud acessem sua instância do PostgreSQL.
  Consulte a [API de Endpoints do ClickHouse Cloud](/docs/pt-BR/products/cloud/guides/sql-console/query-endpoints) para ver os detalhes do tráfego de saída.
</Note>

<div id="2-define-a-table-in-clickhouse">
  ### 2. Defina uma tabela no ClickHouse
</div>

1. Acesse o `clickhouse-client`:

```bash theme={null}
  clickhouse-client --user default --password ClickHouse123!
```

2. Vamos criar um novo banco de dados:

```sql theme={null}
  CREATE DATABASE db_in_ch;
```

3. Crie uma tabela que utilize o `PostgreSQL`:

```sql theme={null}
  CREATE TABLE db_in_ch.table1
  (
      id UInt64,
      column1 String
  )
  ENGINE = PostgreSQL('postgres-host.domain.com:5432', 'db_in_psg', 'table1', 'clickhouse_user', 'ClickHouse_123');
```

Os parâmetros mínimos necessários são:

| parâmetro | Descrição                                    | exemplo                       |
| --------- | -------------------------------------------- | ----------------------------- |
| host:port | nome do host ou IP e porta                   | postgres-host.domain.com:5432 |
| database  | nome do banco de dados PostgreSQL            | db\_in\_psg                   |
| user      | nome de usuário para se conectar ao Postgres | clickhouse\_user              |
| password  | senha para se conectar ao Postgres           | ClickHouse\_123               |

<Note>
  Consulte a página de documentação do [mecanismo de tabela PostgreSQL](/docs/pt-BR/reference/engines/table-engines/integrations/postgresql) para ver a lista completa de parâmetros.
</Note>

<div id="3-test-the-integration">
  ### 3 Teste a integração
</div>

1. No ClickHouse, veja as linhas iniciais:

```sql theme={null}
  SELECT * FROM db_in_ch.table1
```

A tabela do ClickHouse deve ser preenchida automaticamente com as duas linhas que já existiam na tabela do PostgreSQL:

```response theme={null}
  Query id: 34193d31-fe21-44ac-a182-36aaefbd78bf

  ┌─id─┬─column1─┐
  │  1 │ abc     │
  │  2 │ def     │
  └────┴─────────┘
```

2. De volta ao PostgreSQL, adicione algumas linhas à tabela:

```sql theme={null}
  INSERT INTO table1
    (id, column1)
  VALUES
    (3, 'ghi'),
    (4, 'jkl');
```

4. Essas duas novas linhas devem aparecer na sua tabela no ClickHouse:

```sql theme={null}
  SELECT * FROM db_in_ch.table1
```

A resposta deve ser:

```response theme={null}
  Query id: 86fa2c62-d320-4e47-b564-47ebf3d5d27b

  ┌─id─┬─column1─┐
  │  1 │ abc     │
  │  2 │ def     │
  │  3 │ ghi     │
  │  4 │ jkl     │
  └────┴─────────┘
```

5. Vamos ver o que acontece quando você adiciona linhas à tabela do ClickHouse:

```sql theme={null}
  INSERT INTO db_in_ch.table1
    (id, column1)
  VALUES
    (5, 'mno'),
    (6, 'pqr');
```

6. As linhas adicionadas no ClickHouse devem aparecer na tabela do PostgreSQL:

```sql theme={null}
  db_in_psg=# SELECT * FROM table1;
  id | column1
  ----+---------
    1 | abc
    2 | def
    3 | ghi
    4 | jkl
    5 | mno
    6 | pqr
  (6 rows)
```

Este exemplo demonstrou a integração básica entre PostgreSQL e ClickHouse usando o mecanismo de tabela `PostrgeSQL`.
Consulte a [página de documentação do mecanismo de tabela PostgreSQL](/docs/pt-BR/reference/engines/table-engines/integrations/postgresql) para conhecer mais recursos, como especificar esquemas, retornar apenas um subconjunto de colunas e conectar-se a várias réplicas. Consulte também o blog [ClickHouse and PostgreSQL - a match made in data heaven - part 1](https://clickhouse.com/blog/migrating-data-between-clickhouse-postgres).

<div id="using-the-materializedpostgresql-database-engine">
  ## Usando a mecanismo de banco de dados MaterializedPostgreSQL
</div>

<CloudNotSupportedBadge />

<ExperimentalBadge />

A mecanismo de banco de dados PostgreSQL usa os recursos de replicação do PostgreSQL para criar uma réplica do banco de dados com todos os schemas e tabelas, ou com apenas um subconjunto deles.
Este artigo ilustra métodos básicos de integração usando um banco de dados, um schema e uma tabela.

***Nos procedimentos a seguir, são usados o PostgreSQL CLI (psql) e o ClickHouse CLI (clickhouse-client). O servidor PostgreSQL está instalado em Linux. A seguir estão as configurações mínimas caso o banco de dados PostgreSQL seja uma nova instalação de teste.***

<div id="1-in-postgresql">
  ### 1. No PostgreSQL
</div>

1. Em `postgresql.conf`, defina os níveis mínimos de escuta, o nível de WAL para replicação e os slots de replicação:

adicione as seguintes entradas:

```text theme={null}
listen_addresses = '*'
max_replication_slots = 10
wal_level = logical
```

\**O ClickHouse precisa, no mínimo, do wal level `logical` e de `2` slots de replicação*

2. Usando uma conta de administrador, crie um usuário para conexão a partir do ClickHouse:

```sql theme={null}
CREATE ROLE clickhouse_user SUPERUSER LOGIN PASSWORD 'ClickHouse_123';
```

\**para fins de demonstração, foram concedidas permissões completas de superusuário.*

3. crie um novo banco de dados:

```sql theme={null}
CREATE DATABASE db1;
```

4. conecte-se ao novo banco de dados no `psql`:

```text theme={null}
\connect db1
```

5. crie uma nova tabela:

```sql theme={null}
CREATE TABLE table1 (
    id         integer primary key,
    column1    varchar(10)
);
```

6. insira as linhas iniciais:

```sql theme={null}
INSERT INTO table1
(id, column1)
VALUES
(1, 'abc'),
(2, 'def');
```

7. Configure o PostgreSQL para permitir conexões com o novo banco de dados usando o novo usuário para replicação. Abaixo está a entrada mínima a ser adicionada ao arquivo `pg_hba.conf`:

```text theme={null}
# TYPE  DATABASE        USER            ADDRESS                 METHOD
host    db1             clickhouse_user 192.168.1.0/24          password
```

\**para fins de demonstração, isto usa o método de authentication por senha em texto simples. atualize a linha de endereço com a sub-rede ou o endereço do servidor, conforme a documentação do PostgreSQL*

8. recarregue a configuração do `pg_hba.conf` com algo como isto (ajuste conforme a sua versão):

```text theme={null}
/usr/pgsql-12/bin/pg_ctl reload
```

9. Teste o acesso com o novo `clickhouse_user`:

```text theme={null}
 psql -U clickhouse_user -W -d db1 -h <your_postgresql_host>
```

<div id="2-in-clickhouse">
  ### 2. No ClickHouse
</div>

1. faça login na ClickHouse CLI

```bash theme={null}
clickhouse-client --user default --password ClickHouse123!
```

2. Ative o recurso experimental do PostgreSQL para o mecanismo de banco de dados:

```sql theme={null}
SET allow_experimental_database_materialized_postgresql=1
```

3. Crie o novo banco de dados a ser replicado e defina a tabela inicial:

```sql theme={null}
CREATE DATABASE db1_postgres
ENGINE = MaterializedPostgreSQL('postgres-host.domain.com:5432', 'db1', 'clickhouse_user', 'ClickHouse_123')
SETTINGS materialized_postgresql_tables_list = 'table1';
```

opções mínimas:

| parâmetro | Descrição                                    | exemplo                                           |
| --------- | -------------------------------------------- | ------------------------------------------------- |
| host:port | nome do host ou IP e porta                   | postgres-host.domain.com:5432                     |
| database  | nome do banco de dados PostgreSQL            | db1                                               |
| user      | nome de usuário para se conectar ao Postgres | clickhouse\_user                                  |
| password  | senha para se conectar ao Postgres           | ClickHouse\_123                                   |
| settings  | configurações adicionais para o mecanismo    | materialized\_postgresql\_tables\_list = 'table1' |

<Info>
  Para ver o guia completo do mecanismo de banco de dados PostgreSQL, consulte [https://clickhouse.com/docs/engines/database-engines/materialized-postgresql/#settings](https://clickhouse.com/docs/engines/database-engines/materialized-postgresql/#settings)
</Info>

4. Verifique se a tabela inicial tem dados:

```sql theme={null}
ch_env_2 :) select * from db1_postgres.table1;

SELECT *
FROM db1_postgres.table1
```

```response theme={null}
Query id: df2381ac-4e30-4535-b22e-8be3894aaafc

┌─id─┬─column1─┐
│  1 │ abc     │
└────┴─────────┘
┌─id─┬─column1─┐
│  2 │ def     │
└────┴─────────┘
```

<div id="3-test-basic-replication">
  ### 3. Teste a replicação básica
</div>

1. No PostgreSQL, adicione novas linhas:

```sql theme={null}
INSERT INTO table1
(id, column1)
VALUES
(3, 'ghi'),
(4, 'jkl');
```

2. No ClickHouse, verifique se as novas linhas estão visíveis:

```sql theme={null}
ch_env_2 :) select * from db1_postgres.table1;

SELECT *
FROM db1_postgres.table1
```

```response theme={null}
Query id: b0729816-3917-44d3-8d1a-fed912fb59ce

┌─id─┬─column1─┐
│  1 │ abc     │
└────┴─────────┘
┌─id─┬─column1─┐
│  4 │ jkl     │
└────┴─────────┘
┌─id─┬─column1─┐
│  3 │ ghi     │
└────┴─────────┘
┌─id─┬─column1─┐
│  2 │ def     │
└────┴─────────┘
```

<div id="4-summary">
  ### 4. Resumo
</div>

Este guia de integração se concentrou em um exemplo simples de como replicar um banco de dados com uma tabela. No entanto, há opções mais avançadas, que incluem replicar o banco de dados inteiro ou adicionar novas tabelas e esquemas às replicações existentes. Embora os comandos DDL não sejam compatíveis com essa replicação, o motor pode ser configurado para detectar alterações e recarregar as tabelas quando houver mudanças estruturais.

<Info>
  Para conhecer mais recursos disponíveis nas opções avançadas, consulte a [documentação de referência](/docs/pt-BR/reference/engines/database-engines/materialized-postgresql).
</Info>
