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.
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 | |
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_imagedeve 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_imagedeve 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_imagedeve 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_orderno 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
-
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 ENFORCEDno 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>'
);
-
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-cdcoumysql. Ambos são equivalentes. Para tabelas de dimensão ou sink, o valor deve sermysql.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).
NotaSe 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.
NotaQuando 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.
NotaEste 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.
ImportanteAo 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.
ImportanteAo 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.
AvisoEvite 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.
ImportanteComo 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?.
ImportantePara 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?
ImportantePara 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
Para saber como obter o número do banco de dados principal, consulte Backup de logs do ApsaraDB RDS for MySQL.
Suportado apenas no VVR 8.0.7 e versões posteriores.
NotaSe 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.
NotaCompatí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.
NotaRecurso 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.
NotaDisponí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.
ImportanteIgnorar 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.
NotaSuportado 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.
NotaDisponí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.
NotaCompatí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
numRecordsOutPerSecondda 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.NotaRecurso 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.
NotaParâ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.
NotaAo 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.
NotaSuportado apenas no VVR 8.0.7 e versões posteriores.
ImportanteO 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.
NotaUPDATE_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.
NotaEste 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
ImportanteNã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)
Notaonde 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
ImportanteO 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 |
Nota
|
tables.exclude | As tabelas a serem excluídas da sincronização. | Não | STRING | Nenhum |
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:
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: |
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: |
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 |
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 |
| Valores válidos:
|
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:
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 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 Importante
|
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.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 |
|
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:
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:
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:
|
treat-timestamp-as-datetime-enabled | Define se o tipo TIMESTAMP deve ser tratado como um tipo DATETIME. | Não | BOOLEAN | false | Valores válidos:
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:
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:
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 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 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
|
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.
NotaEste 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
NotaSuportado 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.
NotaO 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.enabledestiver 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 eop_typeigual a -D.Caso a chave primária da tabela downstream inclua
order_id,operation_tseop_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-namepara identificar unicamente uma tabela. Por exemplo, o padrão(^(test).|^(tpc).|txc|.*[p$]|t{2}).(t[ 5-8]|tt)pode corresponder a tabelas comotxc.ttetest2.test5no banco de dados.ImportanteNa configuração de um job SQL, os parâmetros
table-nameedatabase-namenã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
usereproduct, definatable-namecomo(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.

Para mais informações sobre configuração de recursos, consulte Configurar informações de implantação para um job.
ImportanteIndependentemente 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.
NotaO 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.modepara 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. ... )ImportanteA 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-offsetoutimestamppode 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
-
Use o comando
SETno 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.
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ó
MergetableSourceScanaparecerá na topologia.
ImportanteApós ativar a reutilização, não desative o encadeamento de operadores. Definir
pipeline.operator-chainingcomofalseaumenta 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.enabledpara 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: 50debezium.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
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 |
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:
|
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: 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: 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.