Integração de Dados entre Instâncias PostgreSQL utilizando postgres_fdw

O recurso de Foreign Data Wrapper (FDW) do PostgreSQL permite que uma instância de banco de dados acesse tabelas residentes em outros servidores como se fossem tabelas locais. Esta funcionalidade é essencial para arquiteturas de microserviços, consolidação de relatórios e movimentação de dados entre ambientes.

1. Configuarção do Ambiente Local

Antes de iniciar a conexão, é recomendável criar um namespace dedicado para organizar os objetos que virão da fonte externa.

-- Criação de um schema isolado para os dados externos
CREATE SCHEMA IF NOT EXISTS integracao_remota;

2. Habilitação da Extensão

Para utilizar o driver de conexão entre instâncias PostgreSQL, a extensão postgres_fdw deve estar instalada na base de dados de origem (a que receberá os dados).

CREATE EXTENSION IF NOT EXISTS postgres_fdw;

3. Definição do Servidor Estrangeiro

Nesta etapa, definimos os metadados de conexão com o servidor remoto. Note que as credenciais ainda não são inseridas aqui, apenas o endereço e o banco de dados.

CREATE SERVER IF NOT EXISTS srv_externo_prod
FOREIGN DATA WRAPPER postgres_fdw
OPTIONS (
    host '192.168.1.50',
    port '5432',
    dbname 'db_producao'
);

4. Mapeamento de Credenciais

É necessário vincular um usuário do banco de dados local a um usuário existente no banco de dados remoto para autenticação.

-- Mapeia o usuário logado atualmente para um usuário do servidor remoto
CREATE USER MAPPING IF NOT EXISTS FOR CURRENT_USER
SERVER srv_externo_prod
OPTIONS (
    user 'usr_leitura',
    password 'senha_segura_123'
);

5. Importação de Tabelas

Ao invés de criar manualmente cada tabela externa, o PostgreSQL permite importar a estrutura de um schema inteiro ou selecionar tabelas específicas.

Importação seletiva

-- Importa apenas as tabelas de vendas e clientes
IMPORT FOREIGN SCHEMA public
LIMIT TO (vendas, clientes)
FROM SERVER srv_externo_prod
INTO integracao_remota;

Importação com exclusão

-- Importa tudo, exceto tabelas de logs volumosos
IMPORT FOREIGN SCHEMA public
EXCEPT (logs_sistema, rastreamento_audit)
FROM SERVER srv_externo_prod
INTO integracao_remota;

6. Consulta e Validação

Uma vez importadas, as tabelas podem ser consultadas normalmente via SQL.

-- Consulta teste com limite de registros
SELECT * FROM integracao_remota.vendas ORDER BY data_venda DESC LIMIT 5;

Monitoramento e Auditoria de FDW

Para gerenciar a infraestrutura de tabelas externas, você pode utilizar as visões de sistema do PostgreSQL.

Listar Servidores Externos Configurados

SELECT 
    srvname AS nome_servidor, 
    srvtype AS tipo, 
    srvoptions AS configuracoes
FROM pg_foreign_server;

Verificar Mapeamentos de Usuários

SELECT 
    s.srvname AS servidor, 
    u.rolname AS usuario_local, 
    um.umoptions AS detalhes_mapeamento
FROM pg_user_mapping um
JOIN pg_foreign_server s ON s.oid = um.umserver
JOIN pg_authid u ON u.oid = um.umuser;

Listar Todas as Tabelas Externas

SELECT 
    foreign_table_schema AS schema, 
    foreign_table_name AS tabela, 
    foreign_server_name AS servidor
FROM information_schema.foreign_tables;

Teste de Conectividade e Resiliência

O FDW não mantém uma conexão persistente aberta o tempo todo. A conexão é estabelecida no momento da execução da query. Para testar a saúde do link sem onerar o sistema, utilize um timeout curto:

BEGIN;
SET LOCAL statement_timeout = '3s';
SELECT 1 FROM integracao_remota.clientes LIMIT 1;
COMMIT;

Caso o servidor remoto sofra um reinício, o PostgreSQL local tentará retsabelecer o handshake na próxima requisição, sem necessidade de reconfigurar os objetos FDW.

Manutenção de Objetos

Para remover as configurações criadas:

-- Remove uma tabela específica
DROP FOREIGN TABLE IF EXISTS integracao_remota.vendas;

-- Remove o servidor e todos os mapeamentos/tabelas dependentes
DROP SERVER IF EXISTS srv_externo_prod CASCADE;

Tags: postgresql postgres_fdw database-administration SQL foreign-data-wrapper

Publicado em 5-31 16:08 por Thomas