O decoderbufs é um plugin de saída de decodificador lógico do PostgreSQL que serializa eventos de alteração do WAL no formato Protocol Buffers (protobuf) para replicação lógica.
Pré-requisitos
Antes de começar, verifique se você tem:
PolarDB for PostgreSQL (Compatible with Oracle) — compatibilidade com sintaxe Oracle 2.0, versão secundária do mecanismo 2.0.14.1.0 ou posterior. Para verificar a versão, execute
SHOW polardb_version;no console ou visualize a versão secundária do mecanismo. Se a versão não atender ao requisito, atualize a versão secundária do mecanismo.-
As seguintes bibliotecas instaladas e disponíveis no cluster PostgreSQL:
Biblioteca
Versão mínima
Finalidade
PostgreSQL
9,6
Mecanismo principal
Protobuf-c
1,2
Serialização de dados
PostGIS
2.1
Suporte a tipos de dados espaciais e geográficos
Configure o cluster
O decoderbufs é carregado automaticamente; portanto, não é necessário carregar a extensão manualmente. A única alteração de configuração necessária é definir wal_level como logical, o que adiciona as informações necessárias para decodificação lógica ao write-ahead log (WAL).
Para defina wal_level:
No console, acesse a página de parâmetros do cluster. Para obter instruções, consulte Definir parâmetros do cluster.
Defina
wal_levelcomological.
A alteração de wal_level reinicia o cluster. Programe essa mudança durante uma janela de manutenção.
Usar o decoderbufs para replicação lógica
O exemplo a seguir demonstra a criação de um slot de replicação, a leitura de alterações do WAL em modo de depuração, o consumo dessas alterações e a verificação da posição do slot.
Todas as etapas utilizam funções SQL da família pg_logical_slot_*. O nome do slot decoderbufs_demo é usado em todo o documento para manter a consistência.
Etapa 1: Crie um slot de replicação
SELECT * FROM pg_create_logical_replication_slot('decoderbufs_demo', 'decoderbufs');
Este comando cria um slot de replicação lógica chamado decoderbufs_demo e define o decoderbufs como plugin de saída.
Etapa 2: Modifique uma tabela no publicador
No lado do publicador, insira, atualize ou exclua linhas em uma tabela publicada. Essa ação gera registros WAL que o decoderbufs decodifica.
Etapa 3: Visualize alterações do WAL (sem consumo)
SELECT data FROM pg_logical_slot_peek_changes('decoderbufs_demo', NULL, NULL, 'debug-mode', '1');
A função pg_logical_slot_peek_changes retorna alterações decodificadas do WAL sem avançar a posição do slot. No modo de depuração ('debug-mode', '1'), a saída é uma representação de texto protobuf legível por humanos. Como a posição do slot permanece inalterada, você pode chamar essa função repetidamente para inspecionar as mesmas alterações.
Etapa 4: Consumir alterações do WAL
SELECT data FROM pg_logical_slot_get_changes('decoderbufs_demo', NULL, NULL, 'debug-mode', '1');
A função pg_logical_slot_get_changes retorna a mesma saída decodificada que peek, mas também avança a posição WAL do slot. Após essa chamada, as alterações consumidas não são mais retornadas em chamadas subsequentes.
Etapa 5: Verifique a posição do slot
SELECT * FROM pg_replication_slots WHERE slot_type = 'logical';
Verifique a coluna confirmed_flush_lsn para confirme se o slot avançou após o consumo das alterações.
Mapeamento de tipos
O decoderbufs mapeia os OIDs de tipos internos do PostgreSQL para tipos de campo protobuf. A tabela abaixo está organizada por categoria de dados.
Tipos numéricos
|
Tipo PostgreSQL |
Campo Decoderbufs |
|
BOOLOID |
datum_boolean |
|
INT2OID |
datum_int32 |
|
INT4OID |
datum_int32 |
|
INT8OID |
datum_int64 |
|
OIDOID |
datum_int64 |
|
FLOAT4OID |
datum_float |
|
FLOAT8OID |
datum_double |
|
NUMERICOID |
datum_double |
Tipos de string e texto
|
Tipo PostgreSQL |
Campo Decoderbufs |
|
CHAROID |
datum_string |
|
VARCHAROID |
datum_string |
|
BPCHAROID |
datum_string |
|
TEXTOID |
datum_string |
|
JSONOID |
datum_string |
|
XMLOID |
datum_string |
|
UUIDOID |
datum_string |
Tipos temporais
|
Tipo PostgreSQL |
Campo Decoderbufs |
|
TIMESTAMPOID |
datum_string |
|
TIMESTAMPTZOID |
datum_string |
Tipos binários
|
Tipo PostgreSQL |
Campo Decoderbufs |
|
BYTEAOID |
datum_bytes |
Tipos espaciais
|
Tipo PostgreSQL |
Campo Decoderbufs |
|
POINTOID |
datum_point |
|
PostGIS geometry |
datum_point |
|
PostGIS geography |
datum_point |