Todos os produtos
Search
Central de documentação

Hologres:Subscribe to Hologres binlogs

Última atualização: Jun 28, 2026

O Hologres oferece o recurso de binlog para capturar eventos de banco de dados. Utilize esses eventos para replicação e sincronização de dados ou como fluxo de mensagens para consumidores downstream. O consumo de binlogs do Hologres aumenta a reutilização de dados e reduz a latência no processamento de ponta a ponta. Este tópico descreve como assinar binlogs do Hologres e executar operações relacionadas.

Binlog

Assim como bancos de dados tradicionais, como o MySQL, o Hologres suporta binlogs para registrar todos os eventos de alteração de dados. Os binlogs do Hologres permitem implementar replicação e sincronização de dados. No entanto, eles são usados tipicamente apenas para sincronização, enquanto os binlogs de bancos de dados tradicionais também atendem a cenários de alta disponibilidade, como sincronização entre instâncias primárias e réplicas e recuperação de dados. Por isso, suas implementações diferem em vários aspectos fundamentais:

  • Os binlogs do Hologres não registram operações DDL.

  • Os binlogs do Hologres são flexíveis e específicos por tabela. Ative-os ou desative-os individualmente por tabela e defina um Time to Live (TTL) diferente para cada uma.

  • Como data warehouse distribuído em tempo real, o Hologres possui um binlog distribuído.

  • A consulta aos binlogs do Hologres é simples e direta.

Em cenários de big data, o Flink pode consumir diretamente os binlogs do Hologres. Em comparação com o modelo tradicional de camadas de data warehouse, a combinação do Flink com os binlogs do Hologres viabiliza uma arquitetura totalmente orientada a eventos. Isso permite o processamento em tempo real desde a camada de armazenamento de dados operacionais (ODS) até a camada de dimensão do data warehouse (DWD), e da camada DWD para a camada de serviços de dados (DWS). Essa abordagem suporta governança de dados por meio de camadas, unifica o armazenamento, melhora a reutilização de dados e reduz a latência de processamento de ponta a ponta, oferecendo uma solução completa de data warehouse em tempo real.

Limitações

Observe as seguintes limitações ao assinar binlogs do Hologres:

  • Somente o Hologres V0.9 ou superior suporta assinatura de binlog. Caso sua instância esteja em uma versão anterior, participe do grupo de suporte online no DingTalk. Para mais detalhes, consulte Como obter mais suporte online?.

  • Nas versões V0.9 e V0.10 do Hologres, não é possível ativar binlogs para tabelas existentes alterando suas propriedades; recrie a tabela. A partir da V1.1, ative binlogs sob demanda.

  • Antes das versões V1.3.14 e V1.1.82 do Hologres, apenas um Superuser podia consumir o binlog. O uso de uma conta com menos privilégios resultava no erro permission denied for table hg_replication_slot_properties. A partir das versões V1.3.14 e V1.1.82, a conta precisa apenas da permissão SELECT na tabela para consumir o binlog com o Flink. Para consumir o binlog via JDBC, a conta deve pertencer à Replication Role.

  • O Hologres suporta binlogs no nível de tabela tanto para tabelas orientadas a linhas quanto para tabelas orientadas a colunas. A tabela a seguir lista os métodos de consumo suportados.

    Categoria do Flink

    Tabela orientada a linhas

    Tabela orientada a colunas

    Tabela híbrida linha-coluna (Suportado a partir da V1.1)

    Blink

    Suportado

    Suportado

    Suportado

    Realtime Compute for Apache Flink

    Suportado

    Suportado

    Suportado

    Apache Flink

    Não suportado

    Não suportado

    Não suportado

    JDBC

    Suportado na V1.1 e posteriores

    Suportado na V1.1 e posteriores

    Suportado na V1.1 e posteriores

  • O Blink não suporta o tipo de dado TIMESTAMP ao consumir binlogs do Hologres. Utilize o tipo TIMESTAMPTZ ao criar tabelas no Hologres. Outros tipos especiais, como SMALLINT, também não são suportados.

  • Não é possível consumir binlogs da tabela pai de uma tabela particionada. Utilize uma tabela filha ou uma tabela regular (não particionada). A partir do Hologres V1.3.24, modifique o TTL do binlog de uma tabela filha sob demanda. Se nenhum TTL de binlog for especificado explicitamente para a tabela filha, ela herdará o TTL da tabela pai. Note que o TTL do binlog não é um temporizador preciso; o sistema não garante a exclusão imediata do binlog após a expiração e realiza a limpeza em algum momento posterior.

  • Para cargas de trabalho com muitas escritas, ativar binlogs em uma tabela orientada a colunas gera, teoricamente, mais sobrecarga do que em uma tabela orientada a linhas. Portanto, prefira tabelas orientadas a linhas ao ativar binlogs. Se a tabela também for utilizada para consultas OLAP, opte pelo formato de armazenamento híbrido linha-coluna. Para mais informações, consulte Formatos de armazenamento de tabela.

  • Apenas tabelas internas do Hologres suportam binlogs. Tabelas externas não possuem esse suporte.

Formato e princípios do binlog

Um registro de binlog contém campos de sistema e colunas da tabela do usuário. A tabela a seguir descreve esses campos.

Nome do campo

Tipo

Descrição

hg_binlog_lsn

BIGINT

Campo de sistema do binlog que representa o número de sequência do log (LSN). O valor é monotonicamente crescente, mas não há garantia de continuidade dentro de um mesmo shard. Também não há garantia de unicidade ou ordenação entre shards diferentes.

Nota

Para mais informações sobre como os dados do binlog são distribuídos entre os shards, consulte Chave de distribuição.

hg_binlog_event_type

BIGINT

Campo de sistema do binlog que indica o tipo de evento de alteração.

  • Os valores válidos para hg_binlog_event_type são:

    • 5 (INSERT): O registro do binlog refere-se à inserção de uma nova linha.

    • 2 (DELETE): O registro do binlog refere-se à exclusão de uma linha existente.

    • 3 (BEFORE_UPDATE): O registro do binlog refere-se ao estado de uma linha existente antes de uma atualização.

    • 7 (AFTER_UPDATE): O registro do binlog refere-se ao estado de uma linha existente após uma atualização.

hg_binlog_timestamp_us

BIGINT

Campo de sistema do binlog que representa o timestamp do sistema em microssegundos (us).

user_table_column_1

Definido pelo usuário

Uma coluna da tabela do usuário.

...

...

...

user_table_column_n

Definido pelo usuário

Uma coluna da tabela do usuário.

  • Uma operação UPDATE gera dois registros de binlog: um para o estado da linha antes da atualização e outro para o estado após a atualização. O recurso de assinatura de binlog garante que esses dois registros sejam consecutivos, com o registro de pré-atualização aparecendo primeiro.

  • Ao executar um UPDATE com um Conector do Hologres, como Holo Client, Flink Connector ou Data Integration, o conector traduz o evento BEFORE_UPDATE para um evento DELETE e o evento AFTER_UPDATE para um evento INSERT. Consequentemente, os valores 2 e 5 aparecerão no campo hg_binlog_event_type. No entanto, o conector assegura a consistência eventual dos dados.

  • O campo hg_binlog_event_type registra os eventos BEFORE_UPDATE e AFTER_UPDATE somente quando uma instrução UPDATE é executada usando SQL puro.

O binlog do Hologres pode ser entendido como uma tabela especial orientada a linhas. Ativar binlogs para uma tabela equivale a criar uma nova tabela orientada a linhas onde hg_binlog_lsn é a chave, e as colunas da tabela original, hg_binlog_event_type e hg_binlog_timestamp_us formam conjuntamente o valor. A tabela de binlog possui um esquema fixo ou fortemente tipado. A ordem das colunas do usuário segue a mesma ordem definida no DDL da tabela. Por esse motivo, utilize tabelas orientadas a linhas ou tabelas híbridas linha-coluna para tabelas com binlog ativado, garantindo assim melhor desempenho na leitura do binlog.

Ativação de binlogs

Por padrão, o recurso de binlog vem desativado no Hologres. Para ativá-lo, defina as propriedades de tabela binlog.level e binlog.ttl. Os exemplos a seguir demonstram como ativar binlogs. Para mais informações sobre os parâmetros de criação de tabela, consulte CREATE TABLE.

Nota

Teoricamente, ativar binlogs em uma tabela orientada a colunas custa mais do que em uma tabela orientada a linhas. Se a tabela sofrer atualizações frequentes, recomenda-se ativar binlogs em uma tabela orientada a linhas.

  • Sintaxe para V2.1 e posteriores:

    Os nomes das propriedades de tabela binlog.level e binlog.ttl foram atualizados para binlog_level e binlog_ttl.

    CREATE TABLE test_message_src (
        id int PRIMARY KEY,
        title text NOT NULL,
        body text
    )
    WITH (
        orientation = 'row',
        clustering_key = 'id',
        binlog_level = 'replica',
        binlog_ttl = '86400' -- The TTL of the binlog, in seconds.
    );
  • Sintaxe suportada em todas as versões:

    begin;
    create table test_message_src(
      id int primary key, 
      title text not null, 
      body text);
    call set_table_property('test_message_src', 'orientation', 'row');--Create a row-oriented table named test_message_src.
    call set_table_property('test_message_src', 'clustering_key', 'id');--Create a clustered index on the id column.
    call set_table_property('test_message_src', 'binlog.level', 'replica');--Set a table property to enable the binlog feature.
    call set_table_property('test_message_src', 'binlog.ttl', '86400');--The TTL of the binlog, in seconds.
    commit;

A tabela a seguir descreve os parâmetros.

Parâmetro

Descrição

binlog_level ou binlog.level

Especifica se os binlogs devem ser ativados. Valores válidos:

  • replica: ativado.

  • none: desativado.

binlog_ttl ou binlog.ttl

O TTL do binlog, em segundos. Valor padrão: 2592000 (30 dias).

Ativação de binlogs sob demanda

A partir do Hologres V1.1, é possível ativar ou desativar binlogs e configurar o TTL para atender a diferentes requisitos de retenção. Ative binlogs em tabelas existentes sem a necessidade de recriá-las.

Nota

Os recursos a seguir estão disponíveis apenas no Hologres V1.1 e posteriores. Se você utiliza uma versão anterior, consulte Solução de problemas de falhas na preparação de upgrade ou entre em contato conosco pelo grupo do DingTalk do Hologres. Para mais informações, consulte Como obter mais suporte online?.

  • Ativar binlogs

    Utilize as instruções a seguir para ativar binlogs em uma tabela existente e definir o TTL do binlog.

    -- Set table properties to enable binlogs.
    begin;
    call set_table_property('<table_name>', 'binlog.level', 'replica');
    commit;
    -- Set table properties to configure the binlog TTL in seconds.
    begin;
    call set_table_property('<table_name>', 'binlog.ttl', '2592000');
    commit;

    table_name é o nome da tabela para a qual você deseja ativar os binlogs.

  • Desativar binlogs

    Utilize a instrução a seguir para desativar binlogs em uma tabela.

    -- Set table properties to disable binlogs.
    begin; 
    call set_table_property('<table_name>', 'binlog.level', 'none'); 
    commit; 

    table_name é o nome da tabela para a qual você deseja desativar os binlogs.

  • Modificar o TTL do binlog

    A instrução abaixo permite modificar o TTL de uma tabela que já possui binlogs ativados.

    Nota

    A partir do Hologres V1.3.24, é possível definir o TTL do binlog para uma tabela filha de uma tabela particionada. Caso o TTL do binlog não seja definido explicitamente para a tabela filha, ela herdará o TTL do binlog da tabela pai.

    call set_table_property('<table_name>', 'binlog.ttl', '8640000'); -- The unit is seconds.

    table_name é o nome da tabela para a qual você deseja modificar o TTL do binlog.

Consulta de binlogs

Os dados de binlog do Hologres são fortemente tipados. Para consultar os binlogs de uma tabela específica, combine os campos de sistema internos do binlog com as colunas originais da tabela. O Hologres também fornece funções para consultar o binlog mais antigo ou o mais recente, ou ainda buscar informações do binlog por meio de um LSN ou timestamp conhecido.

Consulta por campos internos

Utilize a instrução a seguir para consultar o binlog combinando os campos internos do binlog com os campos originais da tabela.

SELECT hg_binlog_lsn,hg_binlog_event_type,hg_binlog_timestamp_us,* FROM test_message_src;

O código a seguir apresenta um exemplo de resultado.

postgres=# select hg_binlog_lsn, hg_binlog_event_type, hg_binlog_timestamp_us, * from test_message_src ;
 hg_binlog_lsn | hg_binlog_event_type | hg_binlog_timestamp_us | id |  title  |       body
---------------+----------------------+------------------------+----+---------+-------------------
          1081 |                    5 |       1626856018921653 |  1 | title 1 | body 1
          1092 |                    3 |       1626856054284918 |  1 | title 1 | body 1
          1093 |                    7 |       1626856054284918 |  1 | title 1 | body after update
          1095 |                    2 |       1626856059747536 |  1 | title 1 | body after update
(4 rows)

Consulta do binlog mais antigo ou mais recente

Utilize a função hg_get_binlog_cursor para consultar o binlog mais antigo ou mais recente em um shard específico. O código a seguir apresenta a sintaxe.

-- OLDEST: Query the earliest binlog on this shard.
SELECT * FROM hg_get_binlog_cursor('<table_name>','OLDEST',<shard_id>);
-- LATEST: Query the latest binlog on this shard.
SELECT * FROM hg_get_binlog_cursor('<table_name>','LATEST',<shard_id>);

O código a seguir mostra um exemplo de uso.

SELECT * FROM hg_get_binlog_cursor('test_message_src','OLDEST',0);

O código a seguir apresenta um exemplo de resultado.

test=# select * from hg_get_binlog_cursor('test_message_src','OLDEST',0);
 hg_shard_id | hg_binlog_lsn | hg_binlog_timestamp_us
-------------+---------------+------------------------
           0 |           152 |       1716204893791755
(1 row)

Consulta de timestamp por LSN

Utilize a função hg_get_binlog_cursor_by_lsn para consultar o timestamp de um binlog. Essa função retorna informações sobre o primeiro registro de binlog cujo LSN seja maior ou igual ao LSN especificado. Se o LSN especificado não existir, o campo hg_binlog_timestamp_us no resultado retornará a hora atual. O código a seguir apresenta a sintaxe.

SELECT * FROM hg_get_binlog_cursor_by_lsn('<table_name>',<lsn>,<shard_id>);--The LSN value must be of the BIGINT type.

O código a seguir mostra um exemplo de uso.

SELECT * FROM hg_get_binlog_cursor_by_lsn('test_message_src',152,0);

O código a seguir apresenta um exemplo de resultado.

test=# select * from hg_get_binlog_cursor_by_lsn('test_message_src',152,0);
 hg_shard_id | hg_binlog_lsn | hg_binlog_timestamp_us
-------------+---------------+------------------------
           0 |           152 |      1716204893791755
(1 row)

Consulta de LSN por timestamp

Utilize a função hg_get_binlog_cursor_by_timestamp para consultar o LSN de um binlog. Essa função retorna informações sobre o primeiro registro de binlog com timestamp maior ou igual ao horário especificado. Se o horário especificado for posterior à entrada de binlog mais recente, o campo hg_binlog_timestamp_us no resultado retornará a hora atual, e o campo hg_binlog_lsn retornará o LSN que será atribuído à próxima linha inserida. O código a seguir apresenta a sintaxe.

Nota

Se o timestamp fornecido for posterior à hora atual retornada pela função now(), a função lançará uma exceção "get binlog cursor in future time".

SELECT * FROM hg_get_binlog_cursor_by_timestamp('<table_name>',<timestamp>,<shard_id>);

O código a seguir mostra um exemplo de uso.

SELECT *,to_timestamp(hg_binlog_timestamp_us/1000000.0) FROM hg_get_binlog_cursor_by_timestamp('test_message_src','2024-05-20 19:34:53.791+08',0);

O código a seguir apresenta um exemplo de resultado.

test=# select *, to_timestamp(hg_binlog_timestamp_us/1000000.0) from hg_get_binlog_cursor_by_timestamp('test_message_src','2024-05-20 19:34:53.791+08',0);
 hg_shard_id | hg_binlog_lsn | hg_binlog_timestamp_us |          to_timestamp
-------------+---------------+------------------------+-------------------------------
           0 |           152 |    1716204893791755 | 2024-05-20 19:34:53.791755+08
(1 row)

Consumo de binlog em tempo real

Consuma binlogs do Hologres com Flink, Blink e JDBC (incluindo Holo Client). Para mais informações, consulte os tópicos a seguir:

Visualização de tabelas com binlogs ativados

Utilize a instrução SQL a seguir para verificar quais tabelas têm binlogs ativados.

SELECT
    *
FROM
    hologres.hg_table_properties
WHERE
    property_key = 'binlog.level'
    AND property_value = 'replica';

Abaixo está um exemplo de resultado. A consulta retorna quatro colunas: table_namespace, table_name, property_key e property_value. Essas colunas fornecem informações sobre todas as tabelas que possuem binlogs ativados.

Visualização do tamanho de armazenamento do binlog

Desativação de binlogs durante operações DML

Utilize o parâmetro GUC a seguir para impedir que a sessão atual gere binlogs durante operações DML. Defina esse parâmetro no nível da sessão antes de executar uma instrução DML.

-- Enable at the session level.
SET hg_experimental_generate_binlog=off;