Todos os produtos
Search
Central de documentação

Realtime Compute for Apache Flink:MySQL

Última atualização: Jul 10, 2026

Este tópico descreve como utilizar o conector MySQL.

Informações básicas

O conector MySQL é compatível com todos os bancos de dados que seguem o protocolo MySQL, como ApsaraDB RDS for MySQL, PolarDB for MySQL, OceanBase (modo MySQL) e instalações de MySQL autogerenciadas.

Importante

Ao utilizar o conector MySQL para ler dados do OceanBase, certifique-se de que o log binário (binlog) esteja ativado e configurado corretamente. Para mais informações, consulte Operações relacionadas ao Binlog. Este recurso está em visualização pública. Utilize-o com cautela.

O conector MySQL oferece suporte aos seguintes itens:

Categoria

Detalhes

Tipos suportados

Tabelas de origem, tabelas de dimensão, tabelas de destino e fontes de dados para ingestão

Modo de execução

Apenas o modo streaming é suportado.

Formato de dados

Não aplicável

Métricas de monitoramento específicas

Métricas de monitoramento

  • Tabela de origem

    • currentFetchEventTimeLag: Intervalo entre a geração dos dados e sua captura pelo operador Source.

      Esta métrica é válida apenas na fase de log binário. Na fase de snapshot, o valor é sempre 0.

    • currentEmitEventTimeLag: Intervalo entre a geração dos dados e sua saída do operador Source.

      Esta métrica é válida apenas na fase de log binário. Na fase de snapshot, o valor é sempre 0.

    • sourceIdleTime: Duração durante a qual a tabela de origem não gerou novos dados.

  • Tabelas de dimensão e tabelas de destino: Nenhuma.

Nota

Para mais informações sobre as métricas, consulte Descrição das métricas.

Tipos de API

DataStream, SQL e YAML de ingestão de dados

Suporte a atualização ou exclusão de dados em tabelas de destino

Sim

Recursos

Uma tabela de origem de captura de dados de alteração (CDC) do MySQL, também conhecida como tabela de origem streaming do MySQL, lê inicialmente todos os dados históricos do banco de dados. Em seguida, alterna perfeitamente para a leitura de logs binários. Esse processo garante que nenhum dado seja perdido ou duplicado. Mesmo em caso de falha, os dados são processados com semântica exactly-once. A tabela de origem CDC do MySQL permite a leitura simultânea de dados completos. Ela utiliza um algoritmo de snapshot incremental para implementar leitura sem bloqueio e transferência de dados retomável. Para mais informações, consulte Sobre as tabelas de origem CDC do MySQL.

  • Processamento unificado em lote e streaming que permite a leitura de dados completos e incrementais, eliminando a necessidade de manter dois processos separados.

  • Leitura concorrente de dados completos para dimensionamento horizontal de desempenho.

  • Transição contínua da leitura de dados completos para incrementais, com redução automática de escala para economizar recursos computacionais.

  • Transferência de dados retomável durante a fase de leitura completa, aumentando a estabilidade.

  • Leitura de dados completos sem bloqueio, sem impacto nos services online.

  • Compatibilidade com a leitura de logs de backup do ApsaraDB RDS for MySQL.

  • Análise paralela de arquivos de log binário para reduzir a latência de leitura.

Pré-requisitos

Antes de usar uma tabela de origem CDC do MySQL, conclua as operações de pré-requisito descritas em Configurar o MySQL.

ApsaraDB RDS for MySQL

  • Execute uma sonda de rede para garantir a conectividade de rede com o Realtime Compute for Apache Flink.

  • Versão do MySQL: 5.6, 5.7, 8.0.x ou 8.4.

  • O log binário deve estar ativado. Esta configuração vem habilitada por padrão.

  • O formato do log binário deve ser ROW. Este é o formato padrão.

  • O parâmetro binlog_row_image deve estar definido como FULL. Esta é a configuração padrão.

  • A compressão de transações de log binário deve estar desativada. Este recurso foi introduzido no MySQL 8.0.20 e vem desativado por padrão.

  • Um usuário MySQL deve ter sido criado com as permissões SELECT, SHOW DATABASES, REPLICATION SLAVE e REPLICATION CLIENT.

  • Crie um banco de dados e uma tabela MySQL. Para mais informações, consulte Criar um banco de dados e uma conta para uma instância do ApsaraDB RDS for MySQL. Utilize uma conta privilegiada para criar o banco de dados MySQL e evitar falhas operacionais por falta de permissões.

  • Configure uma lista de permissões de endereços IP. Para mais informações, consulte Configurar uma lista de permissões de endereços IP para uma instância do ApsaraDB RDS for MySQL.

PolarDB for MySQL

  • Execute uma sonda de rede para garantir a conectividade de rede com o Realtime Compute for Apache Flink.

  • Versão do MySQL: 5.6, 5.7, 8.0.x ou 8.4.

  • O log binário deve estar ativado. Esta configuração vem desabilitada por padrão.

  • O formato do log binário deve ser ROW. Este é o formato padrão.

  • O parâmetro binlog_row_image deve estar definido como FULL. Esta é a configuração padrão.

  • A compressão de transações de log binário deve estar desativada. Este recurso foi introduzido no MySQL 8.0.20 e vem desativado por padrão.

  • Você deve ter criado um usuário MySQL com as permissões SELECT, SHOW DATABASES, REPLICATION SLAVE e REPLICATION CLIENT.

  • Crie um banco de dados e uma tabela MySQL. Para mais informações, consulte Criar um banco de dados e uma conta para um cluster do PolarDB for MySQL. Utilize uma conta privilegiada para criar o banco de dados MySQL e evitar falhas operacionais por falta de permissões.

  • Configure uma lista de permissões de endereços IP. Para mais informações, consulte Configurar uma lista de permissões de endereços IP para um cluster do PolarDB for MySQL.

Self-managed MySQL

  • Execute uma sonda de rede para garantir a conectividade de rede com o Realtime Compute for Apache Flink.

  • Versão do MySQL: 5.6, 5.7, 8.0.x ou 8.4.

  • O log binário deve estar ativado. Esta configuração vem desabilitada por padrão.

  • O formato do log binário deve ser ROW. O formato padrão é STATEMENT.

  • O parâmetro binlog_row_image deve estar definido como FULL. Esta é a configuração padrão.

  • A compressão de transações de log binário deve estar desativada. Este recurso foi introduzido no MySQL 8.0.20 e vem desativado por padrão.

  • Crie um usuário MySQL e conceda as permissões SELECT, SHOW DATABASES, REPLICATION SLAVE e REPLICATION CLIENT.

  • Crie um banco de dados e uma tabela MySQL. Para mais informações, consulte Criar um banco de dados e uma conta para uma instância de MySQL autogerenciada. Utilize uma conta privilegiada para criar o banco de dados MySQL e evitar falhas operacionais por falta de permissões.

  • Configure uma lista de permissões de endereços IP. Para mais informações, consulte Configurar uma lista de permissões de endereços IP para uma instância de MySQL autogerenciada.

Limites

Limites gerais

  • As tabelas de origem CDC do MySQL não suportam definições de marca d'água.

  • Em jobs Create Table As Select (CTAS) e Create Database As Select (CDAS), as tabelas de origem CDC do MySQL conseguem sincronizar algumas alterações de esquema. Para mais informações sobre os tipos de alteração suportados, consulte Políticas de sincronização de evolução de esquema.

  • O conector CDC do MySQL não suporta o recurso de compressão de transações de log binário. Portanto, ao usar o conector CDC do MySQL para consumir dados incrementais, certifique-se de que a compressão de transações de log binário esteja desativada. Caso contrário, o conector pode falhar ao recuperar dados incrementais.

Limites do ApsaraDB RDS for MySQL

  • No ApsaraDB RDS for MySQL, não leia dados de um banco de dados secundário ou réplica somente leitura. O período de retenção padrão de logs binários para bancos secundários e réplicas somente leitura é curto. Se os logs binários expirarem e forem limpos, o job poderá falhar ao consumir os dados do log binário e gerar um erro.

  • O ApsaraDB RDS for MySQL ativa a sincronização primária/secundária paralela por padrão, mas não garante uma ordem consistente de transações entre as instâncias primária e secundária. Isso pode causar perda de dados durante um failover primário/secundário e recuperação de checkpoint. Para evitar esse problema, ative manualmente a opção slave_preserve_commit_order no ApsaraDB RDS for MySQL.

Limites do PolarDB for MySQL

As tabelas de origem CDC do MySQL não suportam a leitura de dados de clusters com arquitetura Multi-master Cluster do PolarDB for MySQL V1.0.19 e versões anteriores. Para mais informações, consulte O que é um Multi-master Cluster?. Os logs binários gerados por esses clusters podem conter IDs de tabela duplicados. Isso pode causar erros de mapeamento de esquema na tabela de origem CDC, resultando em falhas ao analisar os dados do log binário.

Limites do MySQL open source

Por padrão, o MySQL mantém a ordem das transações durante a replicação de log binário primária/secundária. Se uma réplica MySQL tiver replicação paralela ativada (slave_parallel_workers > 1), mas não tiver slave_preserve_commit_order=ON ativado, a ordem de commit das transações pode ficar inconsistente em relação ao banco de dados primário. Quando o Flink CDC se recupera de um checkpoint, ele pode perder dados devido à sequência desordenada. Defina slave_preserve_commit_order = ON na réplica MySQL. Alternativamente, defina slave_parallel_workers = 1, embora isso sacrifique o desempenho da replicação.

Observações de uso

  • Tabela de origem

    • Cada fonte de dados CDC do MySQL requer um server ID exclusivo.

      Finalidade do Server ID

      Cada fonte de dados CDC do MySQL requer um server ID exclusivo. Se várias fontes de dados CDC do MySQL compartilharem o mesmo server ID e não puderem ser reutilizadas, os deslocamentos do log binário podem ficar desordenados. Isso pode levar à leitura duplicada ou à perda de dados.

      Configuração do Server ID para diferentes cenários

      Especifique o server ID na instrução Data Definition Language (DDL). No entanto, recomendamos configurar o server ID usando dynamic hints em vez de parâmetros DDL.

      • Grau de paralelismo = 1 ou snapshot incremental desativado

        ## If the incremental snapshot framework is disabled or the degree of parallelism is 1, you can specify a specific Server ID.
        SELECT * FROM source_table /*+ OPTIONS('server-id'='123456') */ ;
      • Grau de paralelismo > 1 e snapshot incremental ativado

        ## You must specify a Server ID range. The number of available Server IDs in the range must be greater than or equal to the degree of parallelism. Assume the degree of parallelism is 3.
        SELECT * FROM source_table /*+ OPTIONS('server-id'='123456-123458') */ ;
      • CTAS para sincronização de dados

        Ao usar CTAS para sincronização de dados, se as fontes de dados CDC tiverem a mesma configuração, elas serão reutilizadas automaticamente. Nesse caso, configure o mesmo server ID para várias fontes de dados CDC. Para mais informações, consulte Exemplo 4: Múltiplas instruções CTAS.

      • Várias tabelas de origem não-CTAS que não podem ser reutilizadas

        Se um job contiver várias tabelas de origem CDC do MySQL e não usar instruções CTAS para sincronização, as fontes de dados não poderão ser reutilizadas. Forneça um server ID diferente para cada tabela de origem CDC. Da mesma forma, se o framework de snapshot incremental estiver ativado e o grau de paralelismo for maior que 1, especifique um intervalo de server ID.

        select * from 
          source_table1 /*+ OPTIONS('server-id'='123456-123457') */
        left join 
          source_table2 /*+ OPTIONS('server-id'='123458-123459') */
        on source_table1.id=source_table2.id;
    • Durante a fase de leitura completa de dados, não salve um savepoint, adicione ou remova uma tabela da tabela de origem e reinicie o job a partir do savepoint. Essas operações farão com que o job falhe na leitura dos dados.

  • Tabela de destino

    • Chaves primárias autoincrementais: Não declare chaves primárias autoincrementais no DDL. O MySQL as preenche automaticamente ao gravar dados.

    • Declare pelo menos um campo que não seja chave primária. Caso contrário, um erro será reportado.

    • A restrição NOT ENFORCED no DDL indica que o Flink não impõe a validação da chave primária. Você é responsável por garantir a correção e integridade da chave primária. Para mais informações, consulte Verificação de validade.

  • Tabela de dimensão

    Para acelerar consultas com índice, a ordem dos campos na cláusula JOIN deve corresponder à ordem definida no índice, seguindo a regra do prefixo mais à esquerda. Por exemplo, se o índice for (a, b, c), a condição JOIN será ON t.a = x AND t.b = y.

    O otimizador pode reescrever o SQL gerado pelo Flink. Isso pode impedir que o índice seja utilizado durante a consulta real ao banco de dados. Para confirmar se o índice está sendo usado, verifique o plano de execução (EXPLAIN) ou o log de consultas lentas no MySQL para visualizar a instrução SELECT real executada.

SQL

Utilize o conector MySQL em jobs SQL como tabela de origem, tabela de dimensão ou tabela de destino.

Sintaxe

CREATE TEMPORARY TABLE mysqlcdc_source (
   order_id INT,
   order_date TIMESTAMP(0),
   customer_name STRING,
   price DECIMAL(10, 5),
   product_id INT,
   order_status BOOLEAN,
   PRIMARY KEY(order_id) NOT ENFORCED
) WITH (
  'connector' = 'mysql',
  'hostname' = '<yourHostname>',
  'port' = '3306',
  'username' = '<yourUsername>',
  'password' = '<yourPassword>',
  'database-name' = '<yourDatabaseName>',
  'table-name' = '<yourTableName>'
);
Nota
  • Ao gravar em uma tabela de destino, o conector constrói e executa uma instrução SQL para cada registro de dados recebido. A instrução segue esta estrutura:

    • Para uma tabela de destino sem chave primária, executa-se uma instrução INSERT INTO table_name (column1, column2, ...) VALUES (value1, value2, ...);.

    • Para uma tabela de destino com chave primária, executa-se uma instrução INSERT INTO table_name (column1, column2, ...) VALUES (value1, value2, ...) ON DUPLICATE KEY UPDATE column1 = VALUES(column1), column2 = VALUES(column2), ...;. Nota: Se a tabela física tiver uma restrição de índice único além da chave primária, inserir dois registros com chaves primárias diferentes, mas com o mesmo valor de índice único, causará conflito de índice único. Isso resulta em sobrescrita e perda de dados.

  • Se uma chave primária autoincremental estiver definida no banco de dados MySQL, não declare o campo autoincremental no DDL do Flink. O banco de dados preenche esse campo automaticamente ao gravar dados. O conector suporta gravação e exclusão de dados com campos autoincrementais, mas não suporta a atualização desses dados.

Parâmetros WITH

  • Geral

    Parâmetro

    Descrição

    Obrigatório

    Tipo de dados

    Valor padrão

    Observações

    connector

    O tipo da tabela.

    Sim

    STRING

    Nenhum

    Ao usar como tabela source, defina este parâmetro como mysql-cdc ou mysql. Ambos são equivalentes. Para tabelas de dimensão ou sink, o valor deve ser mysql.

    hostname

    O endereço IP ou hostname do banco de dados MySQL.

    Sim

    STRING

    Nenhum

    Recomendamos especificar um endereço de virtual private cloud (VPC).

    Nota

    Se o banco de dados MySQL e o Realtime Compute for Apache Flink não estiverem na mesma VPC, estabeleça uma conexão de rede entre VPCs ou use um endpoint público para acessar o banco de dados. Para mais informações, consulte Gerenciar e operar workspaces e Como um cluster Flink totalmente gerenciado acessa a Internet?.

    username

    O nome de usuário do service de banco de dados MySQL.

    Sim

    STRING

    Nenhum

    Nenhuma.

    password

    A senha do service de banco de dados MySQL.

    Sim

    STRING

    Nenhum

    Nenhuma.

    database-name

    O nome do banco de dados MySQL.

    Sim

    STRING

    Nenhum

    • Para bancos de dados usados como tabela source, utilize expressões regulares no nome do banco para ler dados de múltiplos bancos.

    • Ao empregar expressões regulares, evite os símbolos ^ e $ para corresponder ao início e fim da string. Consulte as observações do parâmetro table-name para mais detalhes.

    table-name

    O nome da tabela MySQL.

    Sim

    STRING

    Nenhum

    • É possível aplicar expressões regulares ao nome da tabela source para extrair dados de várias tabelas.

      Na leitura de múltiplas tabelas MySQL, envie várias instruções CTAS como um único job. Essa prática evita a ativação de múltiplos listeners de log binário, melhorando a performance e a eficiência. Para saber mais, veja Múltiplas instruções CTAS: Envio como job único.

    • No uso de expressões regulares, não inclua os símbolos ^ e $ para delimitar o início e o fim da string. Veja a nota abaixo para mais informações.

    Nota

    Quando uma tabela source MySQL CDC corresponde nomes de tabelas via expressão regular, ela concatena database-name e table-name especificados com a string \\., formando uma expressão regular de caminho completo. Antes da VVR 8.0.1, utilizava-se o caractere .. O connector aplica essa expressão regular para identificar os nomes totalmente qualificados das tabelas no banco de dados MySQL.

    Por exemplo, ao definir 'database-name'='db_.' e 'table-name'='tb_.+', o connector utiliza a expressão regular db_.\\.tb_.+ para verificar os nomes completos das tabelas e determinar quais devem ser lidas. Em versões anteriores à VVR 8.0.1, a expressão regular era db_.*.tb_.+.

    port

    O número da porta do service de banco de dados MySQL.

    Não

    INTEGER

    3306

    Nenhuma.

  • Exclusivo para tabela source

    Parâmetro

    Descrição

    Obrigatório

    Tipo de dados

    Valor padrão

    Observações

    server-id

    ID numérico do cliente de banco de dados.

    Não

    STRING

    Um valor aleatório entre 5400 e 6400 é gerado.

    Este ID deve ser globalmente único no cluster MySQL. Defina um ID diferente para cada job que se conecta ao mesmo banco de dados.

    Este parâmetro também aceita um formato de intervalo de ID, como 5400-5408. Quando a leitura incremental está ativada, há suporte para leitura simultânea. Nesse caso, defina um intervalo de IDs para que cada leitor simultâneo utilize um ID distinto. Para mais informações, consulte Usar Server ID.

    scan.incremental.snapshot.enabled

    Define se os snapshots incrementais devem ser ativados.

    Não

    BOOLEAN

    true

    Os snapshots incrementais vêm ativados por padrão. Esse mecanismo moderno de leitura de snapshots completos oferece diversas vantagens em relação ao método antigo:

    • Leitura paralela dos dados completos pela source.

    • Suporte a checkpoints no nível de chunk durante a leitura completa.

    • Dispensa a aquisição de bloqueio global de leitura (FLUSH TABLES WITH read lock) na leitura completa.

    Para habilitar a leitura simultânea na source, cada leitor concorrente precisa de um server ID exclusivo. Por isso, o server-id deve ser definido como um intervalo, como 5400-6400, cujo tamanho seja maior ou igual à concorrência configurada.

    Nota

    Este item de configuração foi removido no Ververica Runtime (VVR) 11.1 e versões posteriores.

    scan.incremental.snapshot.chunk.size

    Tamanho de cada chunk, medido em número de linhas.

    Não

    INTEGER

    8096

    Com a leitura de snapshot incremental ativada, a tabela é dividida em vários chunks para processamento. Os dados de cada chunk permanecem em cache na memória até que a leitura seja concluída.

    Chunks com menos linhas aumentam o número total de divisões na tabela. Embora isso reduza a granularidade da recuperação de falhas, pode provocar erros de falta de memória (OOM) e diminuir o throughput geral. Portanto, avalie as compensações e configure um tamanho de chunk adequado.

    scan.snapshot.fetch.size

    Quantidade máxima de registros buscados por vez durante a leitura completa da tabela.

    Não

    INTEGER

    1024

    Nenhuma.

    scan.startup.mode

    Modo de inicialização para consumo de dados.

    Não

    STRING

    initial

    Valores válidos:

    • initial (padrão): Na primeira execução, o conector varre todos os dados históricos e depois lê os dados mais recentes do log binário.

    • latest-offset: O conector ignora os dados históricos na primeira execução. A leitura começa pelo final do log binário, capturando apenas as alterações ocorridas após o início do conector.

    • earliest-offset: Sem varredura de dados históricos. A leitura inicia no log binário mais antigo disponível.

    • specific-offset: Ignora dados históricos e começa a partir de um offset específico do log binário. É possível definir esse ponto configurando scan.startup.specific-offset.file e scan.startup.specific-offset.pos, ou usando apenas scan.startup.specific-offset.gtid-set para iniciar a partir de um conjunto GTID específico.

    • timestamp: Não lê dados históricos. Inicia a leitura do log binário a partir de um carimbo de data/hora definido pelo parâmetro scan.startup.timestamp-millis, em milissegundos.

    Importante

    Ao utilizar os modos de inicialização earliest-offset, specific-offset ou timestamp, garanta que o schema da tabela correspondente não sofra alterações entre a posição de consumo especificada no log binário e o momento de início do job. Essa precaução evita erros decorrentes de incompatibilidade de schema.

    scan.startup.specific-offset.file

    Nome do arquivo de log binário que define o offset inicial no modo specific-offset.

    Não

    STRING

    Nenhum

    O uso deste parâmetro exige que scan.startup.mode esteja definido como specific-offset. Exemplo de formato de nome de arquivo: mysql-bin.000003.

    scan.startup.specific-offset.pos

    Posição dentro do arquivo de log binário especificado para definir o offset inicial no modo specific-offset.

    Não

    INTEGER

    Nenhum

    Para usar este parâmetro, defina scan.startup.mode como specific-offset.

    scan.startup.specific-offset.gtid-set

    Conjunto GTID que determina o offset inicial no modo specific-offset.

    Não

    STRING

    Nenhum

    Este parâmetro requer que scan.startup.mode esteja configurado como specific-offset. Exemplo de formato de conjunto GTID: 24DA167-0C0C-11E8-8442-00059A3C7B00:1-19.

    scan.startup.timestamp-millis

    Carimbo de data/hora em milissegundos para o offset inicial no modo timestamp.

    Não

    LONG

    Nenhum

    Ao utilizar este parâmetro, configure scan.startup.mode como timestamp. A unidade do carimbo de data/hora é milissegundos.

    Importante

    Ao especificar um horário, o MySQL CDC tenta ler o evento inicial de cada arquivo de log binário para identificar seu carimbo de data/hora e localizar o arquivo correspondente. Certifique-se de que o arquivo de log binário referente ao carimbo especificado não tenha sido limpo do banco de dados e ainda esteja acessível para leitura.

    server-time-zone

    Fuso horário da sessão utilizado pelo banco de dados.

    Não

    STRING

    Se omitido, o sistema adota o fuso horário do ambiente de execução do job Flink como fuso horário do servidor de banco de dados, correspondendo à zona selecionada.

    Exemplo: Asia/Shanghai. Este parâmetro controla a conversão do tipo TIMESTAMP do MySQL para o tipo STRING. Para mais detalhes, consulte Valores temporais do Debezium.

    debezium.min.row.count.to.stream.results

    Quando a quantidade de linhas da tabela excede este valor, o sistema utiliza o modo de leitura em lote.

    Não

    INTEGER

    1000

    O Flink lê dados de uma tabela source MySQL de duas formas:

    • Leitura completa: Carrega todos os dados da tabela diretamente na memória. É rápida, mas consome memória proporcional ao volume. Tabelas muito grandes podem causar erros de OOM.

    • Leitura em lote: Processa os dados em lotes sucessivos com um número definido de linhas até concluir a leitura. Evita riscos de OOM em tabelas extensas, embora seja mais lenta.

    connect.timeout

    Tempo máximo de espera para estabelecer conexão com o servidor MySQL antes de tentar novamente.

    Não

    DURATION

    30s

    Nenhuma.

    connect.max-retries

    Número máximo de tentativas após falha na conexão com o serviço de banco de dados MySQL.

    Não

    INTEGER

    3

    Nenhuma.

    connection.pool.size

    Tamanho do pool de conexões do banco de dados.

    Não

    INTEGER

    20

    O pool de conexões permite reutilizar conexões existentes, reduzindo o número total de conexões abertas no banco de dados.

    jdbc.properties.*

    Parâmetros de conexão personalizados na URL JDBC.

    Não

    STRING

    Nenhum

    É possível passar parâmetros de conexão personalizados. Por exemplo, para desativar o protocolo SSL, configure 'jdbc.properties.useSSL' = 'false'.

    Para consultar todos os parâmetros de conexão suportados, veja Propriedades de Configuração do MySQL.

    debezium.*

    Parâmetros personalizados do Debezium para leitura de logs binários.

    Não

    STRING

    Nenhum

    Permite a passagem de parâmetros personalizados do Debezium. Por exemplo, use 'debezium.event.deserialization.failure.handling.mode'='ignore' para definir a lógica de tratamento de erros de parsing.

    Aviso

    Evite modificar parâmetros do Debezium indiscriminadamente, pois isso pode levar à leitura incorreta de dados pelo conector. Por exemplo, não é permitido configurar o parâmetro debezium.binlog.buffer.size.

    heartbeat.interval

    Intervalo em que a source avança o offset do log binário por meio de eventos de heartbeat.

    Não

    DURATION

    30s

    Eventos de heartbeat mantêm o offset do log binário atualizado na source, sendo essenciais para tabelas MySQL com baixa frequência de atualização. Nessas tabelas, o offset não avança automaticamente. Os heartbeats forçam esse avanço, prevenindo problemas causados pela expiração do offset. Um offset expirado pode tornar o job irrecuperável, exigindo reinício sem estado.

    scan.incremental.snapshot.chunk.key-column

    Define a coluna usada como chave de divisão para sharding durante a fase de snapshot.

    Consulte a coluna Observações.

    STRING

    Nenhum

    • Obrigatório para tabelas sem chave primária. A coluna escolhida deve ser do tipo não nulo (NOT NULL).

    • Opcional para tabelas com chave primária. Apenas uma coluna da chave primária pode ser selecionada.

    rds.region-id

    ID da região da instância Alibaba Cloud ApsaraDB RDS for MySQL.

    Obrigatório ao usar o recurso de leitura de logs arquivados do OSS.

    STRING

    Nenhum

    Para obter a lista de IDs de região, consulte Regiões e zonas.

    Importante

    Como a string GTID do MySQL CDC é gerada aleatoriamente e não cresce monotonicamente como os offsets de arquivos de log binário, localizar um GTID exige baixar e analisar todos os logs arquivados no OSS. Esse processo consome muitos recursos e tempo, inviabilizando funcionalidades baseadas em offsets GTID. Assim, o recurso de logs arquivados do OSS suporta apenas início por carimbo de data/hora ou offset de arquivo de log binário. Não há suporte para início por GTID nem para cenários com failover primário/secundário nos logs arquivados, já que tais operações dependem de GTIDs. Avalie cuidadosamente antes de utilizar.

    rds.access-key-id

    AccessKey ID da conta Alibaba Cloud ApsaraDB RDS for MySQL.

    Obrigatório ao usar o recurso de leitura de logs arquivados do OSS.

    STRING

    Nenhum

    Para mais informações, consulte Como visualizar o AccessKey ID e o AccessKey secret?.

    Importante

    Para evitar vazamento das suas credenciais, utilize o recurso de gerenciamento de segredos para especificar o AccessKey ID. Consulte Gerenciar variáveis.

    rds.access-key-secret

    AccessKey secret da conta Alibaba Cloud ApsaraDB RDS for MySQL.

    Obrigatório ao usar o recurso de leitura de logs arquivados do OSS.

    STRING

    Nenhum

    Para mais informações, consulte Como visualizar o AccessKey ID e o AccessKey secret?

    Importante

    Para proteger suas credenciais contra vazamentos, utilize o recurso de gerenciamento de segredos para informar o AccessKey secret. Veja Gerenciar variáveis.

    rds.db-instance-id

    ID da instância Alibaba Cloud ApsaraDB RDS for MySQL.

    Obrigatório ao usar o recurso de leitura de logs arquivados do OSS.

    STRING

    Nenhum

    Nenhuma.

    rds.main-db-id

    Número do banco de dados principal da instância Alibaba Cloud ApsaraDB RDS for MySQL.

    Não

    STRING

    Nenhum

    Nota

    Se este parâmetro não for especificado, o VVR 11.1 e versões posteriores consultam automaticamente o número do banco de dados principal com base nas informações de conexão do ApsaraDB RDS for MySQL.

    rds.download.timeout

    Tempo limite para download de um único log arquivado do OSS.

    Não

    DURATION

    60s

    Nenhuma.

    rds.endpoint

    Endpoint de serviço para obtenção de informações de log binário do OSS.

    Não

    STRING

    Nenhum

    • Para verificar os valores válidos, consulte Endpoints.

    • Disponível apenas no VVR 8.0.8 e versões posteriores.

    scan.incremental.close-idle-reader.enabled

    Define se leitores ociosos devem ser fechados após a conclusão do snapshot.

    Não

    BOOLEAN

    false

    • Recurso disponível somente no VVR 8.0.1 e superior.

    • Para que esta configuração funcione, defina execution.checkpointing.checkpoints-after-tasks-finish.enabled como true.

    scan.read-changelog-as-append-only.enabled

    Indica se o fluxo de dados de changelog deve ser convertido para append-only.

    Não

    BOOLEAN

    false

    Valores aceitos:

    • true: Converte todas as mensagens (INSERT, DELETE, UPDATE_BEFORE e UPDATE_AFTER) em mensagens INSERT. Ative esta opção apenas em cenários específicos, como quando for necessário preservar mensagens de exclusão da tabela upstream.

    • false (padrão): Encaminha todos os tipos de mensagem downstream sem alteração.

    Nota

    Compatível apenas com VVR 8.0.8 ou superior.

    scan.only.deserialize.captured.tables.changelog.enabled

    Na fase incremental, define se apenas os eventos de alteração das tabelas especificadas devem ser desserializados.

    Não

    BOOLEAN

    • O valor padrão é false nas versões VVR 8.x.

    • O valor padrão passa a ser true a partir do VVR 11.1.

    Opções disponíveis:

    • true: Desserializa exclusivamente os dados de alteração das tabelas-alvo, acelerando a leitura do log binário.

    • false (padrão): Desserializa os dados de alteração de todas as tabelas.

    Nota
    • Recurso introduzido no VVR 8.0.7.

    • No VVR 8.0.8 ou anterior, altere o nome do parâmetro para debezium.scan.only.deserialize.captured.tables.changelog.enable.

    scan.parse.online.schema.changes.enabled

    Durante a fase incremental, indica se o sistema deve tentar analisar eventos DDL de alteração sem bloqueio do RDS.

    Não

    BOOLEAN

    false

    Valores possíveis:

    • true: Analisa eventos DDL de alteração sem bloqueio do RDS.

    • false (padrão): Ignora a análise de eventos DDL de alteração sem bloqueio do RDS.

    Trata-se de um recurso experimental. Antes de executar uma alteração online sem bloqueio, crie um snapshot do job Flink para fins de recuperação.

    Nota

    Disponível apenas no VVR 11.1 e versões posteriores.

    scan.incremental.snapshot.backfill.skip

    Define se o backfill deve ser ignorado durante a fase de leitura de snapshot.

    Não

    BOOLEAN

    false

    Valores válidos:

    • true: Ignora o backfill na fase de leitura de snapshot.

    • false (padrão): Executa o backfill normalmente durante a leitura de snapshot.

    Ao pular o backfill, as alterações ocorridas na tabela durante a fase de snapshot são lidas posteriormente na fase incremental, em vez de serem mescladas ao snapshot.

    Importante

    Ignorar o backfill pode resultar em inconsistência de dados, pois alterações da fase de snapshot podem ser reprocessadas. Apenas a semântica at-least-once é garantida.

    Nota

    Suportado somente a partir do VVR 11.1.

    scan.incremental.snapshot.unbounded-chunk-first.enabled

    Determina se chunks ilimitados devem ser despachados primeiro na fase de leitura de snapshot.

    Não

    BOOELEAN

    false

    Opções:

    • true: Prioriza o despacho de chunks ilimitados na leitura de snapshot.

    • false (padrão): Não prioriza chunks ilimitados na fase de snapshot.

    Recurso experimental. Sua ativação pode reduzir o risco de erros OOM no TaskManager ao sincronizar o último chunk durante o snapshot. Adicione este parâmetro antes da primeira execução do job.

    Nota

    Disponível apenas no VVR 11.1 e superior.

    binlog.session.network.timeout

    Timeout de leitura/gravação de rede para a conexão do log binário.

    Não

    DURATION

    10m

    Se definido como 0s, utiliza o timeout padrão do servidor MySQL.

    Nota

    Compatível apenas com VVR 11.5 ou posterior.

    scan.rate-limit.records-per-second

    Limita o número máximo de registros enviados pela source por segundo.

    Não

    LONG

    Nenhum

    Aplica-se a cenários que exigem limitação na leitura de dados. O limite vigora tanto na fase completa quanto na incremental.

    A métrica numRecordsOutPerSecond da source reflete a quantidade de registros emitidos por todo o fluxo de dados por segundo. Utilize essa métrica como base para ajustar este parâmetro.

    Na fase de leitura completa, geralmente é necessário reduzir o número de linhas lidas por lote. Diminua o valor do parâmetro scan.incremental.snapshot.chunk.size.

    Nota

    Recurso disponível apenas no VVR 11.5 e versões posteriores.

    scan.binlog.tolerate.gtid-holes

    Ativar este parâmetro faz com que lacunas na sequência GTID sejam ignoradas, permitindo que o job contorne eventos descontínuos e continue executando.

    Não

    BOOLEAN

    false

    Antes de ativar este parâmetro, certifique-se de que o offset inicial do job não expirou. Se o job iniciar a partir de um offset GTID limpo ou expirado, o engine ignorará silenciosamente os logs ausentes, causando perda de dados.

    Nota

    Parâmetro suportado apenas no VVR 11.6 e versões posteriores.

  • Parâmetros específicos para tabela de dimensão

    Parâmetro

    Descrição

    Obrigatório

    Tipo de dados

    Valor padrão

    Observações

    url

    URL JDBC do MySQL.

    Não

    STRING

    Nenhum

    Formato da URL: jdbc:mysql://<endpoint>:<port>/<database_name>.

    lookup.max-retries

    Número máximo de tentativas após falha na leitura de dados.

    Não

    INTEGER

    3

    Suportado apenas no VVR 6.0.7 e versões posteriores.

    lookup.cache.strategy

    Política de cache.

    Não

    STRING

    Nenhum

    As políticas de cache suportadas são None, LRU e ALL. Para mais informações sobre os valores, consulte Instruções JOIN de tabela de dimensão.

    Nota

    Ao usar a política de cache LRU, também é necessário configurar o parâmetro lookup.cache.max-rows.

    lookup.cache.max-rows

    Número máximo de linhas em cache.

    Não

    INTEGER

    100000

    • Se você selecionar a política de cache LRU, defina o tamanho do cache.

    • Caso opte pela política de cache ALL, não é preciso definir o tamanho do cache.

    lookup.cache.ttl

    Tempo de vida (TTL) do cache.

    Não

    DURATION

    10 s

    A configuração de lookup.cache.ttl depende de lookup.cache.strategy:

    • Quando lookup.cache.strategy estiver definido como None, não configure lookup.cache.ttl. Isso significa que o cache não expira.

    • Se lookup.cache.strategy for LRU, lookup.cache.ttl representa o TTL do cache. Por padrão, o cache não expira.

    • Com lookup.cache.strategy definido como ALL, lookup.cache.ttl indica o tempo de carregamento do cache. Por padrão, o cache não é recarregado.

    Utilize um formato de tempo, como 1min ou 10s.

    lookup.max-join-rows

    Quantidade máxima de resultados retornados quando um registro da tabela principal corresponde a registros na tabela de dimensão.

    Não

    INTEGER

    1024

    Nenhuma.

    lookup.filter-push-down.enabled

    Define se o pushdown de filtro deve ser ativado para a tabela de dimensão.

    Não

    BOOLEAN

    false

    Valores válidos:

    • true: Ativa o pushdown de filtro para a tabela de dimensão. Ao carregar dados da tabela do banco de dados MySQL, a tabela de dimensão filtra os dados antecipadamente com base nas condições definidas no job SQL.

    • false (padrão): Desativa o pushdown de filtro para a tabela de dimensão. Durante o carregamento de dados da tabela do banco de dados MySQL, a tabela de dimensão carrega todos os dados.

    Nota

    Suportado apenas no VVR 8.0.7 e versões posteriores.

    Importante

    O pushdown de tabela de dimensão deve ser ativado somente quando uma tabela Flink for usada como tabela de dimensão. Tabelas de origem MySQL não suportam a ativação de pushdown de filtro. Se uma tabela Flink funcionar simultaneamente como tabela de origem e de dimensão, e o pushdown de filtro estiver ativado para a tabela de dimensão, defina explicitamente este item de configuração como false para a tabela de origem usando SQL Hints. Caso contrário, o job pode apresentar execução anormal.

  • Apenas para tabelas sink

    Parâmetro

    Descrição

    Obrigatório

    Tipo de dados

    Valor padrão

    Observações

    url

    URL JDBC do MySQL.

    Não

    STRING

    Nenhum

    Formato da URL: jdbc:mysql://<endpoint>:<port>/<database_name>.

    sink.max-retries

    Número máximo de tentativas após falha na gravação de dados.

    Não

    INTEGER

    3

    Nenhuma.

    sink.buffer-flush.batch-size

    Quantidade de linhas em uma única gravação em lote.

    Não

    INTEGER

    4096

    Nenhuma.

    sink.buffer-flush.max-rows

    Número de linhas de dados armazenadas em cache na memória.

    Não

    INTEGER

    10000

    Este parâmetro só entra em vigor após a especificação de uma chave primária.

    sink.buffer-flush.interval

    Intervalo para liberação do cache. Se os dados no cache não atenderem às condições de saída após o tempo de espera especificado, o sistema libera automaticamente todos os dados do cache.

    Não

    DURATION

    1s

    Nenhuma.

    sink.ignore-delete

    Define se as operações DELETE de dados devem ser ignoradas.

    Não

    BOOLEAN

    false

    Quando o stream gerado pelo Flink SQL inclui registros delete ou update-before, podem ocorrer inconsistências de dados se múltiplas tarefas de saída atualizarem campos diferentes da mesma tabela simultaneamente.

    Por exemplo, após a exclusão de um registro, outra tarefa atualiza apenas alguns campos. Os campos não atualizados assumirão valores nulos ou padrão, causando erros nos dados.

    Definir sink.ignore-delete como true permite ignorar operações DELETE e UPDATE_BEFORE upstream para evitar esses problemas.

    Nota
    • UPDATE_BEFORE faz parte do mecanismo de retração do Flink, usado para "retrair" o valor antigo em uma operação de atualização.

    • Com ignoreDelete = true, todos os registros do tipo DELETE e UPDATE_BEFORE são ignorados. Apenas registros INSERT e UPDATE_AFTER são processados.

    sink.ignore-null-when-update

    Durante a atualização de dados, define se o campo correspondente deve ser atualizado para null ou se a atualização desse campo deve ser ignorada caso o valor do campo de dados recebido seja null.

    Não

    BOOLEAN

    false

    Valores válidos:

    • true: Não atualiza o campo. Este parâmetro só pode ser definido como true quando uma chave primária estiver configurada para a tabela Flink. Quando definido como true:

      • No VVR 8.0.6 e versões anteriores, a tabela sink não suporta gravação em lote.

      • No VVR 8.0.7 e versões posteriores, a tabela sink suporta gravação em lote.

        A gravação em lote melhora significativamente a eficiência de escrita e o throughput geral, mas introduz latência de dados e risco de erros OOM. Portanto, avalie o custo-benefício com base no seu cenário de negócios.

    • false: Atualiza o campo para null.

    Nota

    Este parâmetro é suportado apenas no VVR 8.0.5 e versões posteriores.

Mapeamento de tipos

  • Tabelas source CDC

    Tipo de campo MySQL CDC

    Tipo de campo Flink

    TINYINT

    TINYINT

    SMALLINT

    SMALLINT

    TINYINT UNSIGNED

    TINYINT UNSIGNED ZEROFILL

    INT

    INT

    MEDIUMINT

    SMALLINT UNSIGNED

    SMALLINT UNSIGNED ZEROFILL

    BIGINT

    BIGINT

    INT UNSIGNED

    INT UNSIGNED ZEROFILL

    MEDIUMINT UNSIGNED

    MEDIUMINT UNSIGNED ZEROFILL

    BIGINT UNSIGNED

    DECIMAL(20, 0)

    BIGINT UNSIGNED ZEROFILL

    SERIAL

    FLOAT [UNSIGNED] [ZEROFILL]

    FLOAT

    DOUBLE [UNSIGNED] [ZEROFILL]

    DOUBLE

    DOUBLE PRECISION [UNSIGNED] [ZEROFILL]

    REAL [UNSIGNED] [ZEROFILL]

    NUMERIC(p, s) [UNSIGNED] [ZEROFILL]

    DECIMAL(p, s)

    DECIMAL(p, s) [UNSIGNED] [ZEROFILL]

    BOOLEAN

    BOOLEAN

    TINYINT(1)

    DATE

    DATE

    TIME [(p)]

    TIME [(p)] [WITHOUT TIME ZONE]

    DATETIME [(p)]

    TIMESTAMP [(p)] [WITHOUT TIME ZONE]

    TIMESTAMP [(p)]

    TIMESTAMP [(p)]

    TIMESTAMP [(p)] WITH LOCAL TIME ZONE

    CHAR(n)

    STRING

    VARCHAR(n)

    TEXT

    BINARY

    BYTES

    VARBINARY

    BLOB

    Importante

    Não utilize o tipo TINYINT(1) no MySQL para armazenar valores diferentes de 0 e 1. Quando property-version=0, a tabela source MySQL CDC mapeia TINYINT(1) para o tipo BOOLEAN no Flink por padrão, o que pode causar imprecisões nos dados. Para utilizar o tipo TINYINT(1) com valores distintos de 0 e 1, consulte o parâmetro de configuração catalog.table.treat-tinyint1-as-boolean.

  • Tabelas de dimensão e tabelas sink

    Tipo de campo MySQL

    Tipo de campo Flink

    TINYINT

    TINYINT

    SMALLINT

    SMALLINT

    TINYINT UNSIGNED

    INT

    INT

    MEDIUMINT

    SMALLINT UNSIGNED

    BIGINT

    BIGINT

    INT UNSIGNED

    BIGINT UNSIGNED

    DECIMAL(20, 0)

    FLOAT

    FLOAT

    DOUBLE

    DOUBLE

    DOUBLE PRECISION

    NUMERIC(p, s)

    DECIMAL(p, s)

    Nota

    onde p <= 38.

    DECIMAL(p, s)

    BOOLEAN

    BOOLEAN

    TINYINT(1)

    DATE

    DATE

    TIME [(p)]

    TIME [(p)] [WITHOUT TIME ZONE]

    DATETIME [(p)]

    TIMESTAMP [(p)] [WITHOUT TIME ZONE]

    TIMESTAMP [(p)]

    CHAR(n)

    CHAR(n)

    VARCHAR(n)

    VARCHAR(n)

    BIT(n)

    BINARY(⌈n/8⌉)

    BINARY(n)

    BINARY(n)

    VARBINARY(N)

    VARBINARY(N)

    TINYTEXT

    STRING

    TEXT

    MEDIUMTEXT

    LONGTEXT

    TINYBLOB

    BYTES

    Importante

    O Flink suporta apenas registros do tipo BLOB do MySQL com tamanho igual ou inferior a 2.147.483.647 (2^31 - 1) bytes.

    BLOB

    MEDIUMBLOB

    LONGBLOB

Ingestão de dados

Utilize o conector MySQL como source de dados em um job YAML de ingestão de dados.

Sintaxe

source:
   type: mysql
   name: MySQL Source
   hostname: localhost
   port: 3306
   username: <username>
   password: <password>
   tables: adb.\.*, bdb.user_table_[0-9]+, [app|web].order_\.*
   server-id: 5401-5404

sink:
  type: xxx

Itens de configuração

Parâmetro

Descrição

Obrigatório

Tipo de dados

Valor padrão

Observações

type

O tipo da source de dados.

Sim

STRING

Nenhum

O valor deve ser mysql.

name

O nome da source de dados.

Não

STRING

Nenhum

Nenhuma.

hostname

O endereço IP ou hostname do banco de dados MySQL.

Sim

STRING

Nenhum

Recomendamos especificar um endereço de VPC.

Nota

Se o banco de dados MySQL e o Realtime Compute for Apache Flink não estiverem na mesma VPC, estabeleça uma conexão de rede entre VPCs ou use um endpoint público para acessar o banco de dados. Para mais informações, consulte Gerenciar e operar workspaces e Como um cluster Flink totalmente gerenciado acessa a Internet?.

username

O nome de usuário do service de banco de dados MySQL.

Sim

STRING

Nenhum

Nenhuma.

password

A senha do service de banco de dados MySQL.

Sim

STRING

Nenhum

Nenhuma.

tables

As tabelas de dados do MySQL a serem sincronizadas.

Sim

STRING

Nenhum

  • Este parâmetro aceita expressões regulares para ler dados de várias tabelas.

  • Use vírgulas para separar múltiplas expressões regulares.

Nota
  • Não utilize os caracteres de correspondência de início de string ^ e fim de string $ na expressão regular. No VVR 11.2, o ponto é usado para dividir a expressão regular e obter a parte do banco de dados. Os caracteres de início e fim tornarão a expressão regular resultante do banco de dados inutilizável. Por exemplo, altere ^db.user_[0-9]+$ para db.user_[0-9]+.

  • O ponto separa o nome do banco de dados e o nome da tabela. Para usar um ponto como coringa (match any character), escape-o com uma barra invertida. Exemplo: db0.\., db1.user_table_[0-9]+, db[1-2].[app|web]order_\..

tables.exclude

As tabelas a serem excluídas da sincronização.

Não

STRING

Nenhum

  • Este parâmetro aceita expressões regulares para excluir múltiplas tabelas.

  • Use vírgulas para separar múltiplas expressões regulares.

Nota

O ponto separa o nome do banco de dados e o nome da tabela. Para usar um ponto como coringa, escape-o com uma barra invertida. Exemplo: db0.\., db1.user_table_[0-9]+, db[1-2].[app|web]order_\..

port

O número da porta do service de banco de dados MySQL.

Não

INTEGER

3306

Nenhuma.

schema-change.enabled

Define se eventos de alteração de schema devem ser enviados.

Não

BOOLEAN

true

Nenhuma.

server-id

Um ID numérico ou intervalo para o cliente de banco de dados usado na sincronização.

Não

STRING

Um valor aleatório entre 5400 e 6400 é gerado.

Este ID deve ser globalmente único dentro do cluster MySQL. Defina um ID diferente para cada job que se conecta ao mesmo banco de dados.

Este parâmetro também aceita um formato de intervalo de ID, como 5400-5408. Quando a leitura incremental está ativada, a leitura simultânea é suportada. Nesse caso, defina um intervalo de IDs para que cada leitor simultâneo use um ID diferente.

jdbc.properties.*

Parâmetros de conexão personalizados na URL JDBC.

Não

STRING

Nenhum

É possível passar parâmetros de conexão personalizados. Por exemplo, para não usar o protocolo SSL, configure 'jdbc.properties.useSSL' = 'false'.

Para mais informações sobre os parâmetros de conexão suportados, consulte MySQL Configuration Properties.

debezium.*

Parâmetros personalizados do Debezium para leitura de logs binários.

Não

STRING

Nenhum

É possível passar parâmetros personalizados do Debezium. Por exemplo, use 'debezium.event.deserialization.failure.handling.mode'='ignore' para definir a lógica de tratamento de erros de parsing.

Aviso

Não modifique parâmetros do Debezium arbitrariamente. Isso pode fazer com que o conector leia dados incorretamente. Por exemplo, não é permitido configurar o parâmetro debezium.binlog.buffer.size.

scan.incremental.snapshot.chunk.size

O tamanho de cada chunk em número de linhas.

Não

INTEGER

8096

As tabelas do MySQL são divididas em vários chunks para leitura. Os dados de um chunk são armazenados em cache na memória antes da leitura completa.

Quanto menos linhas cada chunk contiver, maior será o número total de chunks na tabela. Embora isso reduza a granularidade da recuperação de falhas, pode levar a erros OOM e diminuir o throughput geral. Portanto, faça uma avaliação e defina um tamanho de chunk adequado.

scan.snapshot.fetch.size

O número máximo de registros a serem buscados por vez durante a leitura completa dos dados de uma tabela.

Não

INTEGER

1024

Nenhuma.

scan.startup.mode

O modo de inicialização para consumo de dados.

Não

STRING

initial

Valores válidos:

  • initial (padrão): Na primeira inicialização, o conector varre todos os dados históricos e depois lê os dados mais recentes do log binário.

  • latest-offset: Na primeira inicialização, o conector não varre os dados históricos. Ele começa a ler a partir do final do log binário, ou seja, lê apenas as alterações mais recentes feitas após o início do conector.

  • earliest-offset: O conector não varre os dados históricos. Ele começa a ler a partir do log binário disponível mais antigo.

  • specific-offset: O conector não varre os dados históricos. Ele inicia a partir de um offset específico do log binário. Especifique o offset configurando tanto scan.startup.specific-offset.file quanto scan.startup.specific-offset.pos, ou configurando apenas scan.startup.specific-offset.gtid-set para iniciar a partir de um conjunto GTID específico.

  • timestamp: O conector não varre os dados históricos. Ele começa a ler o log binário a partir de um timestamp especificado. O timestamp é definido por scan.startup.timestamp-millis em milissegundos.

Importante

Para os modos de inicialização earliest-offset, specific-offset e timestamp, se o schema da tabela no momento da inicialização for diferente do schema no momento do offset inicial especificado, o job reportará um erro devido à incompatibilidade de schema. Em outras palavras, ao usar esses três modos de inicialização, garanta que o schema da tabela correspondente não mude entre a posição de consumo do log binário especificada e o momento de inicialização do job.

scan.startup.specific-offset.file

O nome do arquivo de log binário para o offset inicial ao usar o modo de inicialização specific-offset.

Não

STRING

Nenhum

Ao usar este parâmetro, defina scan.startup.mode como specific-offset. Formato de exemplo de nome de arquivo: mysql-bin.000003.

scan.startup.specific-offset.pos

O offset dentro do arquivo de log binário especificado para o offset inicial ao usar o modo de inicialização specific-offset.

Não

INTEGER

Nenhum

Ao usar este parâmetro, defina scan.startup.mode como specific-offset.

scan.startup.specific-offset.gtid-set

O conjunto GTID para o offset inicial ao usar o modo de inicialização specific-offset.

Não

STRING

Nenhum

Ao usar este parâmetro, defina scan.startup.mode como specific-offset. Formato de exemplo de conjunto GTID: 24DA167-0C0C-11E8-8442-00059A3C7B00:1-19.

scan.startup.timestamp-millis

O timestamp em milissegundos para o offset inicial ao usar o modo de inicialização timestamp.

Não

LONG

Nenhum

Ao usar este parâmetro, defina scan.startup.mode como timestamp. A unidade do timestamp é milissegundos.

Importante

Ao especificar um horário, o MySQL CDC tenta ler o evento inicial de cada arquivo de log binário para determinar seu timestamp. Em seguida, localiza o arquivo de log binário correspondente ao horário especificado. Certifique-se de que o arquivo de log binário correspondente ao timestamp especificado não foi limpo do banco de dados e pode ser lido.

server-time-zone

O fuso horário da sessão usado pelo banco de dados.

Não

STRING

Se você não especificar este parâmetro, o sistema usa o fuso horário do ambiente de execução do job Flink como o fuso horário do servidor de banco de dados. Este é o fuso horário da zona selecionada.

Exemplo: Asia/Shanghai. Este parâmetro controla como o tipo TIMESTAMP no MySQL é convertido para o tipo STRING. Para mais informações, consulte Debezium temporal values.

scan.startup.specific-offset.skip-events

O número de eventos de log binário a serem ignorados ao ler a partir de um offset especificado.

Não

INTEGER

Nenhum

Ao usar este parâmetro, defina scan.startup.mode como specific-offset.

scan.startup.specific-offset.skip-rows

O número de alterações de linha a serem ignoradas ao ler a partir de um offset especificado. Um único evento de log binário pode corresponder a múltiplas alterações de linha.

Não

INTEGER

Nenhum

Ao usar este parâmetro, defina scan.startup.mode como specific-offset.

connect.timeout

O tempo máximo de espera para timeout de conexão com o servidor de banco de dados MySQL antes de tentar novamente.

Não

DURATION

30 s

Nenhuma.

connect.max-retries

O número máximo de tentativas após uma falha de conexão com o service de banco de dados MySQL.

Não

INTEGER

3

Nenhuma.

connection.pool.size

O tamanho do pool de conexões do banco de dados.

Não

INTEGER

20

O pool de conexões do banco de dados reutiliza conexões, o que reduz o número total de conexões ativas.

heartbeat.interval

O intervalo em que a source avança o offset do log binário usando eventos de heartbeat.

Não

DURATION

30s

Eventos de heartbeat avançam o offset do log binário na source. Isso é muito útil para tabelas no MySQL que são atualizadas com pouca frequência. Para tais tabelas, o offset do log binário não avança automaticamente. Eventos de heartbeat empurram o offset do log binário para frente, evitando problemas causados por um offset expirado. Um offset de log binário expirado pode causar falha irrecuperável no job, exigindo uma reinicialização sem estado.

rds.region-id

O ID da região da instância Alibaba Cloud ApsaraDB RDS for MySQL.

Obrigatório ao usar o recurso de leitura de logs arquivados do OSS.

STRING

Nenhum

Para mais informações sobre IDs de região, consulte Regiões e zonas.

Importante

Como a string GTID para MySQL CDC é gerada aleatoriamente e não aumenta monotonicamente como os offsets de arquivo de log binário, localizar um GTID em um arquivo exige baixar e analisar todos os logs arquivados do OSS. Esse processo consome muitos recursos e tempo, tornando inviáveis recursos que dependem de offsets GTID. Portanto, o recurso de log arquivado do OSS suporta apenas iniciar a partir de um timestamp especificado ou de um offset de arquivo de log binário especificado. Ele não suporta iniciar a partir de um GTID especificado, nem cenários com failovers primário/secundário nos logs arquivados, pois failovers primário/secundário do MySQL dependem de GTIDs. Avalie cuidadosamente este recurso antes de usá-lo.

rds.access-key-id

O AccessKey ID da conta Alibaba Cloud ApsaraDB RDS for MySQL.

Obrigatório ao usar o recurso de leitura de logs arquivados do OSS.

STRING

Nenhum

Para mais informações, consulte Como visualizo o AccessKey ID e o AccessKey secret?

Importante

Para evitar vazamento das suas informações de AccessKey, use o recurso de gerenciamento de segredos para especificar o AccessKey ID. Para mais informações, consulte Gerenciar variáveis.

rds.access-key-secret

O AccessKey secret da conta Alibaba Cloud ApsaraDB RDS for MySQL.

Obrigatório ao usar o recurso de leitura de logs arquivados do OSS.

STRING

Nenhum

Para mais informações, consulte Como visualizo o AccessKey ID e o AccessKey secret?

Importante

Para evitar vazamento das suas informações de AccessKey, use o recurso de gerenciamento de segredos para especificar o AccessKey secret. Para mais informações, consulte Gerenciar variáveis.

rds.db-instance-id

O ID da instância Alibaba Cloud ApsaraDB RDS for MySQL.

Obrigatório ao usar o recurso de leitura de logs arquivados do OSS.

STRING

Nenhum

Nenhuma.

rds.main-db-id

O número do banco de dados primário da instância Alibaba Cloud ApsaraDB RDS for MySQL.

Não

STRING

Nenhum

Para mais informações sobre como obter o número do banco de dados primário, consulte Backup de logs do ApsaraDB RDS for MySQL.

Nota

Se este parâmetro não for especificado, o VVR 11.7 e versões posteriores consultam automaticamente o número do banco de dados primário com base nas informações de conexão do ApsaraDB RDS for MySQL.

rds.download.timeout

O período de timeout para baixar um único log arquivado do OSS.

Não

DURATION

60s

Nenhuma.

rds.endpoint

O endpoint de service para obter informações de log binário do OSS.

Não

STRING

Nenhum

Para mais informações sobre os valores válidos, consulte Endpoints.

rds.binlog-directory-prefix

O prefixo de diretório para armazenar arquivos de log binário.

Não

STRING

rds-binlog-

Nenhuma.

rds.use-intranet-link

Define se a rede interna deve ser usada para baixar arquivos de log binário.

Não

BOOLEAN

true

Nenhuma.

rds.binlog-directories-parent-path

O caminho absoluto do diretório pai para armazenar arquivos de log binário.

Não

STRING

Nenhum

Nenhuma.

chunk-meta.group.size

O tamanho dos metadados do chunk.

Não

INTEGER

1000

Se os metadados forem maiores que este valor, eles serão divididos em várias partes para transmissão.

chunk-key.even-distribution.factor.lower-bound

O limite inferior do fator de distribuição de chunks para sharding uniforme.

Não

DOUBLE

0.05

Se o fator de distribuição for menor que este valor, o sharding não uniforme será usado.

Fator de distribuição de chunks = (MAX(chunk-key) - MIN(chunk-key) + 1) / Número total de linhas de dados.

chunk-key.even-distribution.factor.upper-bound

O limite superior do fator de distribuição de chunks para sharding uniforme.

Não

DOUBLE

1000.0

Se o fator de distribuição for maior que este valor, o sharding não uniforme será usado.

Fator de distribuição de chunks = (MAX(chunk-key) - MIN(chunk-key) + 1) / Número total de linhas de dados.

scan.incremental.close-idle-reader.enabled

Define se leitores ociosos devem ser fechados após a conclusão do snapshot.

Não

BOOLEAN

false

Para que esta configuração tenha efeito, defina execution.checkpointing.checkpoints-after-tasks-finish.enabled como true.

scan.only.deserialize.captured.tables.changelog.enabled

Na fase incremental, define se apenas os eventos de alteração das tabelas especificadas devem ser desserializados.

Não

BOOLEAN

  • O valor padrão é false nas versões VVR 8.x.

  • O valor padrão é true no VVR 11.1 e posteriores.

Valores válidos:

  • true: Desserializa apenas os dados de alteração das tabelas alvo para acelerar a leitura do log binário.

  • false (padrão): Desserializa os dados de alteração de todas as tabelas.

scan.parallel-deserialize-changelog.enabled

Na fase incremental, define se múltiplas threads devem ser usadas para analisar eventos de alteração.

Não

BOOLEAN

false

Valores válidos:

  • true: Usa múltiplas threads na fase de desserialização de eventos de alteração, mantendo a ordem dos eventos de log binário para acelerar a leitura.

  • false (padrão): Usa uma única thread na fase de desserialização de eventos.

Nota

Suportado apenas no VVR 8.0.11 e posteriores.

scan.parallel-deserialize-changelog.handler.size

O número de manipuladores de eventos ao usar múltiplas threads para analisar eventos de alteração.

Não

INTEGER

2

Nota

Suportado apenas no VVR 8.0.11 e posteriores.

metadata-column.include-list

As colunas de metadados a serem passadas para o downstream.

Não

STRING

Nenhum

Os metadados disponíveis incluem op_ts, es_ts, query_log, file e pos. Use vírgulas para separar múltiplas colunas de metadados.

Nota

O conector YAML do MySQL CDC não requer nem suporta a adição de colunas de metadados de nome do banco de dados, nome da tabela e op_type. Use diretamente __data_event_type__ em uma expressão Transform para obter o tipo de dados de alteração, ou use __schema_name__ e __table_name__ para obter o nome do banco de dados e o nome da tabela.

Importante
  • A coluna de metadados file representa o arquivo de log binário onde os dados estão localizados. É "" durante a fase completa e o nome do arquivo de log binário durante a fase incremental. A coluna de metadados pos representa o offset dos dados no arquivo de log binário. É "0" durante a fase completa e o offset dos dados no arquivo de log binário durante a fase incremental. Essas duas colunas de metadados são suportadas a partir do VVR 11.5.

  • A coluna de metadados es_ts representa a hora de início da transação correspondente para o changelog no MySQL. É suportada apenas para MySQL 8.0.x. Não adicione esta coluna de metadados ao usar versões anteriores do MySQL.

  • O timestamp op_ts tem precisão de segundos, enquanto o timestamp es_ts tem precisão de milissegundos.

scan.newly-added-table.enabled

Ao reiniciar a partir de um checkpoint, define se tabelas recém-adicionadas que não foram correspondidas na inicialização anterior devem ser sincronizadas, ou se tabelas que não correspondem mais devem ser removidas do estado.

Não

BOOLEAN

false

Isso entra em vigor ao reiniciar a partir de um checkpoint ou savepoint.

Importante

Durante a fase de leitura completa de dados, não é possível salvar um savepoint, adicionar uma nova tabela ou excluir uma tabela da tabela de origem e, em seguida, reiniciar o job a partir do savepoint. Isso causará falha na leitura de dados do job.

scan.binlog.newly-added-table.enabled

Na fase incremental, define se dados de tabelas recém-adicionadas que forem correspondidas devem ser enviados.

Não

BOOLEAN

false

Não pode ser ativado simultaneamente com scan.newly-added-table.enabled.

scan.incremental.snapshot.chunk.key-column

Especifica uma coluna de determinadas tabelas para ser usada como coluna de divisão para sharding durante a fase de snapshot.

Não

STRING

Nenhum

  • Use dois pontos : para conectar o nome da tabela e o nome da coluna e definir uma regra. O nome da tabela pode ser uma expressão regular. Defina múltiplas regras separando-as com ponto e vírgula ;. Exemplo: db1.user_table_[0-9]+:col1;db[1-2].[app|web]_order_\\.*:col2.

  • Obrigatório para tabelas sem chave primária. A coluna selecionada deve ser de um tipo não nulo (NOT NULL). Opcional para tabelas com chave primária. Apenas uma coluna pode ser selecionada da chave primária.

scan.parse.online.schema.changes.enabled

Na fase incremental, define se deve tentar analisar eventos DDL de alteração sem bloqueio do RDS.

Não

BOOLEAN

false

Valores válidos:

  • true: Analisa eventos DDL de alteração sem bloqueio do RDS.

  • false (padrão): Não analisa eventos DDL de alteração sem bloqueio do RDS.

Este é um recurso experimental. Antes de executar uma alteração online sem bloqueio, faça um snapshot do job Flink para recuperação.

Nota

Suportado apenas no VVR 11.0 e posteriores.

scan.incremental.snapshot.backfill.skip

Define se o backfill deve ser ignorado durante a fase de leitura de snapshot.

Não

BOOLEAN

false

Valores válidos:

  • true: Ignora o backfill durante a fase de leitura de snapshot.

  • false (padrão): Não ignora o backfill durante a fase de leitura de snapshot.

Se o backfill for ignorado, as alterações na tabela durante a fase de snapshot serão lidas na fase incremental posterior, em vez de serem mescladas no snapshot.

Importante

Ignorar o backfill pode levar à inconsistência de dados, pois as alterações ocorridas durante a fase de snapshot podem ser reproduzidas. Apenas a semântica at-least-once é garantida.

Nota

Suportado apenas no VVR 11.1 e posteriores.

treat-tinyint1-as-boolean.enabled

Define se o tipo TINYINT(1) deve ser tratado como um tipo Boolean.

Não

BOOLEAN

true

Valores válidos:

  • true (padrão): Trata o tipo TINYINT(1) como um tipo Boolean.

  • false: Não trata o tipo TINYINT(1) como um tipo Boolean.

treat-timestamp-as-datetime-enabled

Define se o tipo TIMESTAMP deve ser tratado como um tipo DATETIME.

Não

BOOLEAN

false

Valores válidos:

  • true: Trata o tipo TIMESTAMP do MySQL como um tipo DATETIME e o mapeia para o tipo TIMESTAMP do CDC.

  • false (padrão): Mapeia o tipo TIMESTAMP do MySQL para o tipo TIMESTAMP_LTZ do CDC.

O tipo TIMESTAMP do MySQL armazena tempo UTC e é afetado pelo fuso horário. O tipo DATETIME do MySQL armazena tempo literal e não é afetado pelo fuso horário.

Quando ativado, este parâmetro converte dados do tipo TIMESTAMP do MySQL para o tipo DATETIME com base no server-time-zone.

include-comments.enabled

Define se comentários de tabelas e colunas devem ser sincronizados.

Não

BOOELEAN

false

Valores válidos:

  • true: Sincroniza comentários de tabelas e colunas.

  • false (padrão): Não sincroniza comentários de tabelas e colunas.

Ativar esta opção aumenta o uso de memória do job.

scan.incremental.snapshot.unbounded-chunk-first.enabled

Define se chunks ilimitados devem ser despachados primeiro durante a fase de leitura de snapshot.

Não

BOOELEAN

false

Valores válidos:

  • true: Despacha chunks ilimitados primeiro durante a fase de leitura de snapshot.

  • false (padrão): Não despacha chunks ilimitados primeiro durante a fase de leitura de snapshot.

Este é um recurso experimental. Ativá-lo pode reduzir o risco de erros OOM no TaskManager ao sincronizar o último chunk durante a fase de snapshot. Adicione este parâmetro antes da primeira inicialização do job.

Nota

Suportado apenas no VVR 11.1 e posteriores.

binlog.session.network.timeout

O timeout de rede para a conexão de log binário.

Não

DURATION

10m

Se definido como 0s, o timeout padrão do servidor MySQL é usado.

Nota

Suportado apenas no VVR 11.5 e posteriores.

scan.rate-limit.records-per-second

Limita o número máximo de registros enviados pela source por segundo.

Não

LONG

Nenhum

Aplicável a cenários onde a leitura de dados precisa ser limitada. Esse limite é efetivo tanto nas fases completa quanto incremental.

A métrica numRecordsOutPerSecond da source reflete o número de registros produzidos por todo o fluxo de dados por segundo. Ajuste este parâmetro com base nessa métrica.

Na fase de leitura completa de dados, geralmente é necessário reduzir o número de linhas lidas em cada lote. Reduza o valor do parâmetro scan.incremental.snapshot.chunk.size.

Nota

Suportado apenas no VVR 11.5 e posteriores.

include-binlog-meta.enable

Define se as informações originais do log binário do MySQL, como GTID e offset do log binário, devem ser incluídas na mensagem.

Não

Boolean

false

Aplicável a cenários de sincronização original de log binário, como substituir um link de sincronização Canal existente.

Nota

Suportado apenas no VVR 11.6 e posteriores.

scan.binlog.tolerate.gtid-holes

Ativar este parâmetro ignora lacunas na sequência GTID, permitindo que o job contorne eventos descontínuos e continue executando.

Não

Boolean

false

Antes de ativar este parâmetro, garanta que o offset inicial do job não tenha expirado. Se o job iniciar a partir de um offset GTID limpo ou expirado, o mecanismo ignorará silenciosamente os logs ausentes, o que levará à perda de dados.

Nota

Este parâmetro é suportado apenas no VVR 11.6 e posteriores.

scan.emit.create-table-events.in-batch.enabled

Define se schemas de tabela devem ser enviados em lote durante a fase de inicialização do job.

Não

Boolean

false

Este é um recurso experimental. Ative esta opção quando um único job sincroniza muitas tabelas.

Nota

Este parâmetro é suportado apenas no VVR 11.4 e posteriores.

Reutilizar um catálogo existente

A partir do VVR 11.5, é possível referenciar diretamente um catálogo MySQL integrado criado na página Data Management em um job de ingestão de dados do Flink CDC. Isso reduz o esforço manual na escrita das propriedades de conexão.

source:
  type: mysql
  using.built-in-catalog: mysql_rds_catalog

Atualmente, os jobs de ingestão de dados suportam a reutilização automática dos seguintes parâmetros de catálogo MySQL:

  • hostname

  • port

  • username

  • password

  • catalog.table.metadata-columns

  • catalog.table.treat-tinyint1-as-boolean

Para substituir qualquer um desses parâmetros reutilizados automaticamente, escreva explicitamente o parâmetro YAML correspondente. O parâmetro escrito explicitamente tem prioridade maior.

Mapeamento de tipos

A tabela a seguir apresenta o mapeamento de tipos de dados para ingestão de dados.

Tipo de campo MySQL CDC

Tipo de campo CDC

TINYINT(n)

TINYINT

SMALLINT

SMALLINT

TINYINT UNSIGNED

TINYINT UNSIGNED ZEROFILL

YEAR

INT

INT

MEDIUMINT

MEDIUMINT UNSIGNED

MEDIUMINT UNSIGNED ZEROFILL

SMALLINT UNSIGNED

SMALLINT UNSIGNED ZEROFILL

BIGINT

BIGINT

INT UNSIGNED

INT UNSIGNED ZEROFILL

BIGINT UNSIGNED

DECIMAL(20, 0)

BIGINT UNSIGNED ZEROFILL

SERIAL

FLOAT [UNSIGNED] [ZEROFILL]

FLOAT

DOUBLE [UNSIGNED] [ZEROFILL]

DOUBLE

DOUBLE PRECISION [UNSIGNED] [ZEROFILL]

REAL [UNSIGNED] [ZEROFILL]

NUMERIC(p, s) [UNSIGNED] [ZEROFILL] and p <= 38

DECIMAL(p, s)

DECIMAL(p, s) [UNSIGNED] [ZEROFILL] and p <= 38

FIXED(p, s) [UNSIGNED] [ZEROFILL] and p <= 38

BOOLEAN

BOOLEAN

BIT(1)

TINYINT(1)

DATE

DATE

TIME [(p)]

TIME [(p)]

DATETIME [(p)]

TIMESTAMP [(p)]

TIMESTAMP [(p)]

O mapeamento depende do valor do parâmetro treat-timestamp-as-datetime-enabled:

true:TIMESTAMP[(p)]

false:TIMESTAMP_LTZ[(p)]

CHAR(n)

CHAR(n)

VARCHAR(n)

VARCHAR(n)

BIT(n)

BINARY(⌈(n + 7) / 8⌉)

BINARY(n)

BINARY(n)

VARBINARY(N)

VARBINARY(N)

NUMERIC(p, s) [UNSIGNED] [ZEROFILL] and 38 < p <= 65

STRING

Nota

No MySQL, o tipo de dados decimal tem precisão de até 65, mas no Flink a precisão é limitada a 38. Portanto, se você definir uma coluna decimal com precisão superior a 38, mapeie-a para string para evitar perda de precisão.

DECIMAL(p, s) [UNSIGNED] [ZEROFILL] and 38 < p <= 65

FIXED(p, s) [UNSIGNED] [ZEROFILL] and 38 < p <= 65

TINYTEXT

STRING

TEXT

MEDIUMTEXT

LONGTEXT

ENUM

JSON

STRING

Nota

O tipo de dados JSON é convertido em uma string formatada em JSON no Flink.

GEOMETRY

STRING

Nota

Os tipos de dados espaciais no MySQL são convertidos em strings com formato JSON fixo. Para mais informações, consulte Mapeamento de tipos de dados espaciais do MySQL.

POINT

LINESTRING

POLYGON

MULTIPOINT

MULTILINESTRING

MULTIPOLYGON

GEOMETRYCOLLECTION

TINYBLOB

BYTES

Nota

Para o tipo de dados BLOB no MySQL, apenas blobs com comprimento não superior a 2.147.483.647 (2**31-1) são suportados.

BLOB

MEDIUMBLOB

LONGBLOB

Exemplos de uso

  • Tabela source CDC

    CREATE TEMPORARY TABLE mysqlcdc_source (
       order_id INT,
       order_date TIMESTAMP(0),
       customer_name STRING,
       price DECIMAL(10, 5),
       product_id INT,
       order_status BOOLEAN,
       PRIMARY KEY(order_id) NOT ENFORCED
    ) WITH (
      'connector' = 'mysql',
      'hostname' = '<yourHostname>',
      'port' = '3306',
      'username' = '<yourUsername>',
      'password' = '<yourPassword>',
      'database-name' = '<yourDatabaseName>',
      'table-name' = '<yourTableName>'
    );
    
    CREATE TEMPORARY TABLE blackhole_sink(
      order_id INT,
      customer_name STRING
    ) WITH (
      'connector' = 'blackhole'
    );
    
    INSERT INTO blackhole_sink
    SELECT order_id, customer_name FROM mysqlcdc_source;
  • Tabela de dimensão

    CREATE TEMPORARY TABLE datagen_source(
      a INT,
      b BIGINT,
      c STRING,
      `proctime` AS PROCTIME()
    ) WITH (
      'connector' = 'datagen'
    );
    
    CREATE TEMPORARY TABLE mysql_dim (
      a INT,
      b VARCHAR,
      c VARCHAR
    ) WITH (
      'connector' = 'mysql',
      'hostname' = '<yourHostname>',
      'port' = '3306',
      'username' = '<yourUsername>',
      'password' = '<yourPassword>',
      'database-name' = '<yourDatabaseName>',
      'table-name' = '<yourTableName>'
    );
    
    CREATE TEMPORARY TABLE blackhole_sink(
      a INT,
      b STRING
    ) WITH (
      'connector' = 'blackhole'
    );
    
    INSERT INTO blackhole_sink
    SELECT T.a, H.b
    FROM datagen_source AS T JOIN mysql_dim FOR SYSTEM_TIME AS OF T.`proctime` AS H ON T.a = H.a;
  • Tabela sink

    CREATE TEMPORARY TABLE datagen_source (
      `name` VARCHAR,
      `age` INT
    ) WITH (
      'connector' = 'datagen'
    );
    
    CREATE TEMPORARY TABLE mysql_sink (
      `name` VARCHAR,
      `age` INT
    ) WITH (
      'connector' = 'mysql',
      'hostname' = '<yourHostname>',
      'port' = '3306',
      'username' = '<yourUsername>',
      'password' = '<yourPassword>',
      'database-name' = '<yourDatabaseName>',
      'table-name' = '<yourTableName>'
    );
    
    INSERT INTO mysql_sink
    SELECT * FROM datagen_source;
  • Source de dados de ingestão

    source:
      type: mysql
      name: MySQL Source
      hostname: ${mysql.hostname}
      port: ${mysql.port}
      username: ${mysql.username}
      password: ${mysql.password}
      tables: ${mysql.source.table}
      server-id: 7601-7604
    
    sink:
      type: values
      name: Values Sink
      print.enabled: true
      sink.print.logger: true

Sobre tabelas source MySQL CDC

  • Funcionamento

    Quando uma tabela source MySQL CDC inicia, ela verifica toda a tabela, divide-a em vários chunks com base na chave primária e registra o offset atual do binary log. Em seguida, a tabela source utiliza um algoritmo de snapshot incremental para ler os dados de cada chunk por meio de instruções SELECT. O job executa checkpoints periodicamente para registrar os chunks concluídos. Se ocorrer um failover, o job continua a leitura dos dados a partir dos chunks não finalizados. Após a leitura de todos os chunks, o job começa a ler registros de alterações incrementais a partir do offset do binary log registrado anteriormente. O job do Flink continua executando checkpoints periódicos para registrar o offset do binary log. Em caso de failover, o processamento é retomado a partir do último offset registrado, garantindo a semântica exactly-once.

    Para uma explicação mais detalhada sobre o algoritmo de snapshot incremental, consulte Conector MySQL CDC.

  • Metadados

    Os metadados são úteis em cenários onde dados de bancos de dados e tabelas fragmentados são mesclados e sincronizados. Após a mesclagem, as aplicações geralmente precisam distinguir o banco de dados e a tabela de origem de cada registro. As colunas de metadados permitem acessar as informações de nome do banco de dados e da tabela de origem. Assim, é possível mesclar facilmente várias tabelas fragmentadas em uma única tabela de destino usando colunas de metadados.

    A Source MySQL CDC suporta a sintaxe de colunas de metadados. Você pode acessar os seguintes metadados por meio dessas colunas.

    Chave de metadados

    Tipo de metadados

    Descrição

    database_name

    STRING NOT NULL

    Nome do banco de dados que contém a linha.

    table_name

    STRING NOT NULL

    Nome da tabela que contém a linha.

    op_ts

    TIMESTAMP_LTZ(3) NOT NULL

    Momento em que a linha foi alterada no banco de dados. Se o registro for proveniente dos dados históricos da tabela e não do binary log, este valor será sempre 0.

    Nota

    Este campo tem precisão apenas até o segundo.

    op_type

    STRING NOT NULL

    Tipo de alteração da linha.

    • +I: mensagem INSERT

    • -D: mensagem DELETE

    • -U: mensagem UPDATE_BEFORE

    • +U: mensagem UPDATE_AFTER

    Nota

    Suportado apenas no VVR 8.0.7 e versões posteriores.

    query_log

    STRING NOT NULL

    Permite ler o registro de log de consulta do MySQL para esta linha.

    Nota

    O MySQL precisa ter o parâmetro binlog_rows_query_log_events ativado para registrar logs de consulta.

    O exemplo de código a seguir mostra como mesclar e sincronizar várias tabelas de pedidos de múltiplos bancos de dados fragmentados em uma instância MySQL para uma tabela holo_orders no Hologres.

    CREATE TEMPORARY TABLE mysql_orders (
      db_name STRING METADATA FROM 'database_name' VIRTUAL,  -- Read the database name.
      table_name STRING METADATA  FROM 'table_name' VIRTUAL, -- Read the table name.
      operation_ts TIMESTAMP_LTZ(3) METADATA FROM 'op_ts' VIRTUAL, -- Read the change time.
      op_type STRING METADATA FROM 'op_type' VIRTUAL, -- Read the change type.
      order_id INT,
      order_date TIMESTAMP(0),
      customer_name STRING,
      price DECIMAL(10, 5),
      product_id INT,
      order_status BOOLEAN,
      PRIMARY KEY(order_id) NOT ENFORCED
    ) WITH (
      'connector' = 'mysql-cdc',
      'hostname' = 'localhost',
      'port' = '3306',
      'username' = 'flinkuser',
      'password' = 'flinkpw',
      'database-name' = 'mydb_.*', -- Regular expression to match multiple sharded databases.
      'table-name' = 'orders_.*'   -- Regular expression to match multiple sharded tables.
    );
    
    INSERT INTO holo_orders SELECT * FROM mysql_orders;

    Com base no código acima, se o parâmetro scan.read-changelog-as-append-only.enabled estiver definido como true na cláusula WITH, o resultado de saída varia conforme a configuração da chave primária da tabela downstream:

    • Se a chave primária da tabela downstream for order_id, o resultado conterá apenas a última alteração de cada chave primária na tabela upstream. Para dados cuja última alteração foi uma exclusão, haverá um registro na tabela downstream com a mesma chave primária e op_type igual a -D.

    • Caso a chave primária da tabela downstream inclua order_id, operation_ts e op_type, o resultado conterá todas as alterações completas de cada chave primária na tabela upstream.

  • Suporte a expressões regulares

    A tabela source MySQL CDC permite o uso de expressões regulares no nome da tabela ou do banco de dados para corresponder a múltiplas tabelas ou bancos. O exemplo de código abaixo demonstra como especificar várias tabelas usando uma expressão regular.

    CREATE TABLE products (
      db_name STRING METADATA FROM 'database_name' VIRTUAL,
      table_name STRING METADATA  FROM 'table_name' VIRTUAL,
      operation_ts TIMESTAMP_LTZ(3) METADATA FROM 'op_ts' VIRTUAL,
      order_id INT,
      order_date TIMESTAMP(0),
      customer_name STRING,
      price DECIMAL(10, 5),
      product_id INT,
      order_status BOOLEAN,
      PRIMARY KEY(order_id) NOT ENFORCED
    ) WITH (
      'connector' = 'mysql-cdc',
      'hostname' = 'localhost',
      'port' = '3306',
      'username' = 'root',
      'password' = '123456',
      'database-name' = '(^(test).*|^(tpc).*|txc|.*[p$]|t{2})', -- Regular expression to match multiple databases.
      'table-name' = '(t[5-8]|tt)' -- Regular expression to match multiple tables.
    );

    As expressões regulares do exemplo são explicadas da seguinte forma:

    • ^(test).* é um exemplo de correspondência por prefixo. Esta expressão corresponde a nomes de bancos de dados que começam com "test", como "test1" ou "test2".

    • .*[p$] representa uma correspondência por sufixo. Corresponde a nomes de bancos de dados que terminam com "p", como "cdcp" ou "edcp".

    • txc é uma correspondência exata. Corresponde apenas ao nome de banco de dados que seja exatamente "txc".

    Ao corresponder a um nome de tabela totalmente qualificado, o MySQL CDC usa o padrão database-name.table-name para identificar unicamente uma tabela. Por exemplo, o padrão (^(test).|^(tpc).|txc|.*[p$]|t{2}).(t[ 5-8]|tt) pode corresponder a tabelas como txc.tt e test2.test5 no banco de dados.

    Importante

    Na configuração de um job SQL, os parâmetros table-name e database-name não suportam o uso de vírgula (,) para especificar múltiplas tabelas ou bancos de dados.

    • Para corresponder a várias tabelas ou usar múltiplas expressões regulares, conecte-as com uma barra vertical (|) e coloque-as entre parênteses. Por exemplo, para ler as tabelas user e product, defina table-name como (user|product).

    • Se uma expressão regular contiver vírgula, reescreva-a usando o operador barra vertical (|). Por exemplo, a expressão regular mytable_\d{1, 2} deve ser reescrita como (mytable_\d{1}|mytable_\d{2}) para evitar o uso da vírgula.

  • Controle de concorrência

    O conector MySQL suporta leitura multithread de dados completos, o que melhora a eficiência do carregamento. Em conjunto com o recurso de ajuste automático Autopilot no console do Realtime Compute for Apache Flink, o conector pode reduzir automaticamente a escala durante a fase incremental após a conclusão da leitura multithread, economizando recursos computacionais.

    No console de desenvolvimento do Realtime Compute for Apache Flink, você pode definir a concorrência de um job no modo básico ou especialista na página Resource Configuration. As diferenças são as seguintes:

    • A concorrência definida no modo básico aplica-se globalmente a todo o job.基础模式

    • O modo especialista permite definir a concorrência para um VERTEX específico conforme necessário.vertex并发

    Para mais informações sobre configuração de recursos, consulte Configurar informações de implantação para um job.

    Importante

    Independentemente do modo básico ou especialista, ao definir a concorrência, o intervalo de server ID declarado na tabela deve ser maior ou igual à concorrência do job. Por exemplo, se o intervalo de server ID for 5404-5412, existem nove server IDs únicos. Logo, a concorrência máxima do job pode ser 9. Jobs diferentes para a mesma instância MySQL não devem ter intervalos de server ID sobrepostos. Cada job deve ser configurado explicitamente com um server ID ou intervalo de server ID distinto.

  • Redução automática de escala pelo Autopilot

    A fase de dados completos acumula um grande volume de dados históricos. Para melhorar a eficiência, esses dados são geralmente lidos em paralelo. Já na fase incremental de binary log, como o volume é menor e é necessária uma ordem global, a leitura single-thread costuma ser suficiente. O recurso de ajuste automático equilibra os diferentes requisitos de recursos das fases completa e incremental, otimizando desempenho e consumo.

    O ajuste automático monitora o tráfego de cada tarefa da Source MySQL CDC. Ao entrar na fase de binary log, se apenas uma tarefa estiver responsável pela leitura e as demais estiverem ociosas, o ajuste automático reduzirá a contagem de CU e a concorrência da source. Para ativar esse recurso, defina o modo de ajuste automático como Active na página de O&M do job.

    Nota

    O intervalo mínimo padrão para acionar a redução de concorrência é de 24 horas. Para mais detalhes sobre os parâmetros de ajuste automático, consulte Configurar ajuste automático.

  • Modos de inicialização

    Use o item de configuração scan.startup.mode para especificar o modo de inicialização da tabela source MySQL CDC. As opções incluem:

    • initial (padrão): Na primeira inicialização, realiza uma leitura completa da tabela do banco de dados e depois muda para o modo incremental para ler o binary log.

    • earliest-offset: Ignora a fase de snapshot e inicia a leitura a partir do offset mais antigo disponível no binary log.

    • latest-offset: Ignora a fase de snapshot e inicia a leitura a partir do final do binary log. Neste modo, a tabela source lê apenas alterações de dados ocorridas após o início do job.

    • specific-offset: Ignora a fase de snapshot e inicia a leitura a partir de um offset específico do binary log. O offset pode ser especificado pelo nome do arquivo e posição do binary log, ou por um conjunto GTID.

    • timestamp: Ignora a fase de snapshot e inicia a leitura de eventos do binary log a partir de um timestamp específico.

    Exemplo de uso:

    CREATE TABLE mysql_source (...) WITH (
        'connector' = 'mysql-cdc',
        'scan.startup.mode' = 'earliest-offset', -- Start from the earliest offset.
        'scan.startup.mode' = 'latest-offset', -- Start from the latest offset.
        'scan.startup.mode' = 'specific-offset', -- Start from a specific offset.
        'scan.startup.mode' = 'timestamp', -- Start from a specific timestamp.
        'scan.startup.specific-offset.file' = 'mysql-bin.000003', -- Specify the binary log filename in specific-offset mode.
        'scan.startup.specific-offset.pos' = '4', -- Specify the binary log position in specific-offset mode.
        'scan.startup.specific-offset.gtid-set' = '24DA167-0C0C-11E8-8442-00059A3C7B00:1-19', -- Specify the GTID set in specific-offset mode.
        'scan.startup.timestamp-millis' = '1667232000000' -- Specify the startup timestamp in timestamp mode.
        ...
    )
    Importante
    • A source MySQL imprime o offset atual no log com nível INFO durante um checkpoint. O prefixo do log é Binlog offset on checkpoint {checkpoint-id}. Esse log ajuda a iniciar um job a partir de um offset de checkpoint específico.

    • Se a tabela lida sofreu alterações de schema, iniciar a partir de earliest-offset, specific-offset ou timestamp pode causar erro. Isso ocorre porque o leitor Debezium salva internamente o schema mais recente da tabela, e dados antigos com schema incompatível não podem ser analisados corretamente.

  • Sobre tabelas source CDC sem chaves primárias

    • O uso de uma tabela sem chave primária exige a definição de scan.incremental.snapshot.chunk.key-column, sendo permitido selecionar apenas uma coluna não nula.

    • A semântica de processamento para uma tabela source CDC sem chave primária depende do comportamento da coluna especificada por scan.incremental.snapshot.chunk.key-column:

      • Se a coluna especificada não for atualizada, a semântica exactly-once é garantida.

      • Caso a coluna especificada seja atualizada, apenas a semântica at-least-once é garantida. No entanto, é possível assegurar a integridade dos dados combinando-a com o downstream, definindo uma chave primária no destino e utilizando operações idempotentes.

  • Ler logs de backup do Alibaba Cloud ApsaraDB RDS for MySQL

    A tabela source MySQL CDC suporta a leitura de logs de backup do Alibaba Cloud ApsaraDB RDS for MySQL. Esse recurso é útil em cenários onde a fase de dados completos demora muito e os arquivos locais de binary log foram limpos automaticamente, mas os arquivos de backup enviados automática ou manualmente ainda estão disponíveis.

    Exemplo de uso:

    CREATE TABLE mysql_source (...) WITH (
        'connector' = 'mysql-cdc',
        'rds.region-id' = 'cn-beijing',
        'rds.access-key-id' = 'xxxxxxxxx', 
        'rds.access-key-secret' = 'xxxxxxxxx', 
        'rds.db-instance-id' = 'rm-xxxxxxxxxxxxxxxxx', 
        'rds.main-db-id' = '12345678',
        'rds.download.timeout' = '60s'
        ...
    )
  • Ativar reutilização de Source CDC

    No mesmo job, múltiplas tabelas source MySQL CDC iniciam vários clientes de binary log. Se todas as tabelas source estiverem na mesma instância, isso aumenta a carga no banco de dados. Para mais informações, consulte Perguntas frequentes sobre MySQL CDC.

    Solução

    O VVR 8.0.7 e versões posteriores suportam a reutilização de source MySQL CDC. Este recurso mescla tabelas source MySQL CDC compatíveis. A mesclagem ocorre quando as configurações das tabelas source são idênticas, exceto pelo nome do banco de dados, nome da tabela e server-id. O engine mescla automaticamente as sources MySQL CDC dentro do mesmo job.

    Procedimento

    1. Use o comando SET no seu job SQL:

      SET 'table.optimizer.source-merge.enabled' = 'true';
      
      # (For VVR 8.0.8 and 8.0.9) Also set this item:
      SET 'sql-gateway.exec-plan.enabled' = 'false';
      O VVR 11.1 e versões posteriores têm a reutilização ativada por padrão.
    2. Inicie o job sem estado. Como modificar a configuração de reutilização de source altera a topologia do job, é obrigatório iniciá-lo sem estado. Caso contrário, o job pode falhar ao iniciar ou pode haver perda de dados. Se uma source for mesclada, um nó MergetableSourceScan aparecerá na topologia.

    Importante
    • Após ativar a reutilização, não desative o encadeamento de operadores. Definir pipeline.operator-chaining como false aumenta a sobrecarga de serialização e desserialização de dados. Quanto mais sources forem mescladas, maior será essa sobrecarga.

    • No VVR 8.0.7, desativar o encadeamento de operadores causa problemas de serialização.

Acelerar a leitura de binary log

Ao usar o conector MySQL como tabela source ou fonte de dados de ingestão, ele analisa arquivos de binary log para gerar mensagens de alteração durante a fase incremental. Os arquivos de binary log registram todas as alterações de tabela em formato binário. É possível acelerar a análise desses arquivos das seguintes maneiras:

  • Ativar configuração de filtro de análise

    • Utilize o item de configuração scan.only.deserialize.captured.tables.changelog.enabled para analisar apenas os eventos de alteração das tabelas especificadas.

  • Otimizar parâmetros do Debezium

    debezium.max.queue.size: 162580
    debezium.max.batch.size: 40960
    debezium.poll.interval.ms: 50
    • debezium.max.queue.size: Número máximo de registros que a fila de bloqueio pode armazenar. Quando o Debezium lê um fluxo de eventos do banco de dados, ele os coloca nessa fila antes de gravá-los no downstream. O valor padrão é 8192.

    • debezium.max.batch.size: Quantidade máxima de eventos que o conector processa em cada iteração. O valor padrão é 2048.

    • debezium.poll.interval.ms: Tempo em milissegundos que o conector deve aguardar antes de solicitar novos eventos de alteração. O valor padrão é 1000 milissegundos (1 segundo).

Exemplo de uso:

CREATE TABLE mysql_source (...) WITH (
    'connector' = 'mysql-cdc',
    -- Debezium configuration
    'debezium.max.queue.size' = '162580',
    'debezium.max.batch.size' = '40960',
    'debezium.poll.interval.ms' = '50',
    -- Enable parsing filter
    'scan.only.deserialize.captured.tables.changelog.enabled' = 'true',  -- Parse only the change events of specified tables.
    ...
)
source:
  type: mysql
  name: MySQL Source
  hostname: ${mysql.hostname}
  port: ${mysql.port}
  username: ${mysql.username}
  password: ${mysql.password}
  tables: ${mysql.source.table}
  server-id: 7601-7604
  # Debezium configuration
  debezium.max.queue.size: 162580
  debezium.max.batch.size: 40960
  debezium.poll.interval.ms: 50
  # Enable parsing filter
  scan.only.deserialize.captured.tables.changelog.enabled: true

A capacidade de consumo de binary log da Enterprise Edition do MySQL CDC é de 85 MB/s, aproximadamente o dobro da versão open source da comunidade. Quando a velocidade de geração de arquivos de binary log excede 85 MB/s (ou seja, um arquivo de 512 MB a cada 6 segundos), a latência do job Flink aumenta continuamente. A latência de processamento diminui gradualmente assim que a velocidade de geração desacelera. Se um arquivo de binary log contiver uma transação grande, a latência pode aumentar temporariamente, voltando a cair após a leitura do log dessa transação.

API DataStream do MySQL CDC

Importante

Ao ler e gravar dados por meio da API DataStream, é necessário utilizar o conector DataStream correspondente para se conectar ao Flink. Para obter mais informações sobre como configurar o conector DataStream, consulte Como usar o conector DataStream.

Crie um programa de API DataStream e utilize o MySqlSource. Os exemplos de código e dependências do pom estão disponíveis abaixo:

import org.apache.flink.api.common.eventtime.WatermarkStrategy;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import com.ververica.cdc.debezium.JsonDebeziumDeserializationSchema;
import com.ververica.cdc.connectors.mysql.source.MySqlSource;
public class MySqlSourceExample {
  public static void main(String[] args) throws Exception {
    MySqlSource<String> mySqlSource = MySqlSource.<String>builder()
        .hostname("yourHostname")
        .port(yourPort)
        .databaseList("yourDatabaseName") // set captured database
        .tableList("yourDatabaseName.yourTableName") // set captured table
        .username("yourUsername")
        .password("yourPassword")
        .deserializer(new JsonDebeziumDeserializationSchema()) // converts SourceRecord to JSON String
        .build();
    StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
    // enable checkpoint
    env.enableCheckpointing(3000);
    env
      .fromSource(mySqlSource, WatermarkStrategy.noWatermarks(), "MySQL Source")
      // set 4 parallel source tasks
      .setParallelism(4)
      .print().setParallelism(1); // use parallelism 1 for sink to keep message ordering
    env.execute("Print MySQL Snapshot + Binlog");
  }
}
<dependency>
    <groupId>org.apache.flink</groupId>
    <artifactId>flink-core</artifactId>
    <version>${flink.version}</version>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>org.apache.flink</groupId>
    <artifactId>flink-streaming-java</artifactId>
    <version>${flink.version}</version>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>org.apache.flink</groupId>
    <artifactId>flink-connector-base</artifactId>
    <version>${flink.version}</version>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>org.apache.flink</groupId>
    <artifactId>flink-table-common</artifactId>
    <version>${flink.version}</version>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>org.apache.flink</groupId>
    <artifactId>flink-clients</artifactId>
    <version>${flink.version}</version>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>org.apache.flink</groupId>
    <artifactId>flink-table-api-java-bridge</artifactId>
    <version>${flink.version}</version>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>com.alibaba.ververica</groupId>
    <artifactId>ververica-connector-mysql</artifactId>
    <version>${vvr.version}</version>
</dependency>

Ao compilar o MySqlSource, especifique os seguintes parâmetros no código:

Parâmetro

Descrição

hostname

Endereço IP ou nome do host do banco de dados MySQL.

port

Número da porta do service de banco de dados MySQL.

databaseList

Nome do banco de dados MySQL.

Nota

Este parâmetro aceita expressões regulares para leitura de dados em vários bancos. Utilize .* para corresponder a todos os bancos de dados.

username

Nome de usuário do service de banco de dados MySQL.

password

Senha do service de banco de dados MySQL.

deserializer

Desserializador que converte registros do tipo SourceRecord para um tipo específico. Valores válidos:

  • RowDataDebeziumDeserializeSchema: Converte SourceRecord na estrutura de dados interna RowData do Flink Table ou SQL.

  • JsonDebeziumDeserializationSchema: Converte SourceRecord em uma string formatada em JSON.

As dependências do pom devem especificar os seguintes parâmetros:

${vvr.version}

Versão do mecanismo do Alibaba Cloud Realtime Compute for Apache Flink, por exemplo: 1.17-vvr-8.0.4-3.

Nota

Utilize o número de versão exibido no Maven, pois versões de hotfix podem ser lançadas sem aviso prévio em outros canais.

${flink.version}

Versão do Apache Flink, por exemplo: 1.17.2.

Importante

Utilize a versão do Apache Flink correspondente à versão do mecanismo do Alibaba Cloud Realtime Compute for Apache Flink para evitar problemas de incompatibilidade durante a execução do job. Para mais detalhes sobre o mapeamento de versões, consulte Versões do mecanismo.

Perguntas frequentes

Para mais informações sobre problemas comuns ao usar tabelas de origem CDC, consulte Perguntas frequentes sobre CDC.