Este tópico descreve como usar o conector MySQL em jobs SQL.
Informações gerais
O conector MySQL é compatível com todos os bancos de dados que suportam o protocolo MySQL, como ApsaraDB RDS for MySQL, PolarDB for MySQL, OceanBase (modo MySQL) e MySQL autogerenciado.
Ao usar o conector MySQL para ler dados do OceanBase, verifique se o binary logging (binlog) está ativado e configurado corretamente. Para mais informações, consulte Binlog-related operations. Este recurso está em pré-visualização pública. Use-o com cautela.
O conector MySQL oferece suporte aos itens a seguir.
|
Categoria |
Detalhes |
|
Tipos suportados |
Tabelas source, tabelas de dimensão, tabelas sink e fontes de dados de ingestão de dados |
|
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 data ingestion YAML |
|
Suporte a atualização ou exclusão de dados em tabelas sink |
Sim |
Recursos
Uma tabela source de change data capture (CDC) do MySQL, também conhecida como tabela source de streaming do MySQL, primeiro lê todos os dados históricos do banco de dados e, em seguida, alterna de forma transparente para a leitura dos binary logs. 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 source CDC do MySQL suporta leitura concorrente de dados completos, usando um algoritmo de snapshot incremental para implementar leitura sem bloqueio e transferência de dados retomável. Para mais informações, consulte About MySQL CDC source tables.
Processamento unificado de batch e stream, com suporte à leitura de dados completos e incrementais, eliminando a necessidade de manter dois processos separados.
Leitura concorrente de dados completos para dimensionamento horizontal de desempenho.
Alternância transparente da leitura de dados completos para a leitura incremental, com redução automática de escala para economizar recursos computacionais.
Transferência de dados retomável durante a fase de leitura completa, garantindo maior estabilidade.
Leitura de dados completos sem bloqueio, sem impacto nos serviços em produção.
Suporte à leitura de logs de backup do ApsaraDB RDS for MySQL.
Análise paralela de arquivos de binary log para redução da latência de leitura.
Pré-requisitos
Antes de usar uma tabela source CDC do MySQL, conclua as operações de pré-requisito descritas em Configure MySQL.
ApsaraDB RDS for MySQL
Execute network probe 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 binary logging deve estar ativado. Por padrão, já vem ativado.
O formato do binary log deve ser ROW, que é o formato padrão.
O parâmetro
binlog_row_imagedeve ser definido como FULL, que é a configuração padrão.O Binary Log Transaction Compression deve estar desativado. Esse recurso foi introduzido no MySQL 8.0.20 e está desativado por padrão.
Crie 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 Create a database and an account for an ApsaraDB RDS for MySQL instance. Use uma conta privilegiada para criar o banco de dados MySQL e evitar falhas por permissões insuficientes.
Configure uma lista de permissões de endereços IP. Para mais informações, consulte Configure an IP address whitelist for an ApsaraDB RDS for MySQL instance.
PolarDB for MySQL
Execute network probe 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 binary logging deve estar ativado. Por padrão, vem desativado.
O formato do binary log deve ser ROW, que é o formato padrão.
O parâmetro
binlog_row_imagedeve ser definido como FULL, que é a configuração padrão.O Binary Log Transaction Compression deve estar desativado. Esse recurso foi introduzido no MySQL 8.0.20 e está desativado por padrão.
Crie 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 Create a database and an account for a PolarDB for MySQL cluster. Use uma conta privilegiada para criar o banco de dados MySQL e evitar falhas por permissões insuficientes.
Configure uma lista de permissões de endereços IP. Para mais informações, consulte Configure an IP address whitelist for a PolarDB for MySQL cluster.
Self-managed MySQL
Execute network probe 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 binary logging deve estar ativado. Por padrão, vem desativado.
O formato do binary log deve ser ROW. O formato padrão é STATEMENT.
O parâmetro
binlog_row_imagedeve ser definido como FULL, que é a configuração padrão.O Binary Log Transaction Compression deve estar desativado. Esse recurso foi introduzido no MySQL 8.0.20 e está 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 MySQL autogerenciada. Use uma conta privilegiada para criar o banco de dados MySQL e evitar falhas por permissões insuficientes.
Configure uma lista de permissões de endereços IP. Para mais informações, consulte Configure an IP address whitelist for a self-managed MySQL instance.
Limitações
Limitações gerais
As tabelas source CDC do MySQL não suportam definições de watermark.
O conector CDC do MySQL não suporta o recurso Binary Log Transaction Compression. Portanto, ao usar o conector CDC do MySQL para consumir dados incrementais, verifique se o Binary Log Transaction Compression está desativado. Caso contrário, o conector poderá falhar ao recuperar dados incrementais.
ApsaraDB RDS for MySQL limits
No ApsaraDB RDS for MySQL, não leia dados de um banco de dados secundário nem de uma réplica somente leitura. O período de retenção padrão de binary logs em bancos de dados secundários e réplicas somente leitura é curto — se os binary logs expirarem e forem removidos, o job poderá falhar ao consumir esses dados e reportar 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 de transações consistente entre as instâncias primária e secundária. Isso pode causar perda de dados durante um switchover primário/secundário e na recuperação de checkpoint. Para evitar esse problema, ative manualmente a opção
slave_preserve_commit_orderno ApsaraDB RDS for MySQL.
PolarDB for MySQL limits
As tabelas source CDC do MySQL não suportam a leitura de dados de clusters com arquitetura Multi-master do PolarDB for MySQL V1.0.19 e versões anteriores. Para mais informações, consulte What is a Multi-master Cluster?. Os binary logs gerados por esses clusters podem conter IDs de tabela duplicados, o que pode causar erros de mapeamento de schema na tabela source CDC e falhas na análise dos dados de binary log.
Open source MySQL limits
Por padrão, o MySQL mantém a ordem das transações durante a replicação de binary log entre instância primária e secundária. Se uma réplica MySQL tiver a replicação paralela ativada (slave_parallel_workers > 1), mas sem slave_preserve_commit_order=ON ativado, a ordem de commit das transações pode ser inconsistente com a do banco de dados primário. Ao recuperar de um checkpoint, o Flink CDC pode perder dados em razão dessa desordem de sequência. Defina slave_preserve_commit_order = ON na réplica MySQL. Como alternativa, defina slave_parallel_workers = 1, mas essa opção reduz o desempenho da replicação.
Observações de uso
-
Tabela source
Durante a fase de leitura completa dos dados, não é possível salvar um savepoint, adicionar ou remover uma tabela da tabela source e reiniciar o job a partir do savepoint. Executar essas operações fará com que o job falhe na leitura dos dados.
-
Tabela sink
Chaves primárias auto-incrementais: não declare chaves primárias auto-incrementais no DDL. O MySQL as preenche automaticamente ao gravar os 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 valida a chave primária. Você é responsável por garantir a correção e a integridade da chave primária. Para mais informações, consulte Validity Check.
-
Tabela de dimensão
Para usar um índice na aceleração de consultas, 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 de JOIN será
ON t.a = x AND t.b = y.O SQL gerado pelo Flink pode ser reescrito pelo otimizador, o que pode impedir que o índice seja utilizado durante a consulta 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 executada.
SQL
Você pode usar o conector MySQL em jobs SQL como tabela source, tabela de dimensão ou tabela sink.
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 sink, o conector constrói e executa uma instrução SQL para cada registro de dados recebido. A instrução segue a seguinte estrutura:
Para uma tabela sink sem chave primária, é executada uma instrução
INSERT INTO table_name (column1, column2, ...) VALUES (value1, value2, ...);.Para uma tabela sink com chave primária, é executada uma instrução
INSERT INTO table_name (column1, column2, ...) VALUES (value1, value2, ...) ON DUPLICATE KEY UPDATE column1 = VALUES(column1), column2 = VALUES(column2), ...;. Observação: se a tabela física tiver uma restrição de índice único diferente da chave primária, a inserção de dois registros com chaves primárias distintas, mas com o mesmo valor de índice único, causará um conflito de índice único. Isso resulta em dados sendo sobrescritos e perdidos.
Se uma chave primária com incremento automático estiver definida no banco de dados MySQL, não declare o campo de incremento automático no DDL do Flink. O banco de dados preenche esse campo automaticamente durante a gravação dos dados. O conector oferece suporte à gravação e exclusão de dados com campos de incremento automático, mas não suporta a atualização desses dados.
Parâmetros WITH
-
Geral
Parameter
Description
Required
Data type
Default value
Notes
connector
O tipo da tabela.
Yes
STRING
None
Quando usada como tabela source, defina este parâmetro como
mysql-cdcoumysql. Os dois valores são equivalentes. Quando usada como tabela de dimensão ou tabela de destino, o valor deve sermysql.hostname
O endereço IP ou hostname do banco de dados MySQL.
Yes
STRING
None
Recomendamos especificar um endereço de 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 utilize um endpoint público para acessar o banco de dados. Para mais informações, consulte Manage and operate workspaces e How can a fully managed Flink cluster access the Internet?.
username
O nome de usuário do service de banco de dados MySQL.
Yes
STRING
None
Nenhuma observação.
password
A senha do service de banco de dados MySQL.
Yes
STRING
None
Nenhuma observação.
database-name
O nome do banco de dados MySQL.
Yes
STRING
None
-
Quando um banco de dados é usado como tabela source, é possível utilizar uma expressão regular no nome do banco de dados para ler dados de múltiplos bancos.
-
Ao usar expressões regulares, não utilize os símbolos ^ e $ para corresponder ao início e ao fim da string. Para mais informações, consulte as observações do parâmetro table-name.
table-name
O nome da tabela MySQL.
Yes
STRING
None
-
É possível usar uma expressão regular no nome da tabela source para ler dados de múltiplas tabelas.
-
Ao usar expressões regulares, não utilize os símbolos ^ e $ para corresponder ao início e ao fim da string. Para mais informações, consulte a observação a seguir.
NotaQuando uma tabela source CDC do MySQL faz a correspondência de nomes de tabela usando uma expressão regular, o conector concatena os valores de database-name e table-name especificados com a string \\. para formar uma expressão regular de caminho completo. Antes do VVR 8.0.1, o caractere . era utilizado. O conector usa essa expressão regular para corresponder aos nomes completamente qualificados das tabelas no banco de dados MySQL.
Por exemplo, ao definir 'database-name'='db_.' e 'table-name'='tb_.+', o conector aplica a expressão regular db_.\\.tb_.+ para corresponder aos nomes completamente qualificados e determinar quais tabelas serão lidas. Antes do VVR 8.0.1, a expressão regular era db_.*.tb_.+.
port
O número da porta do service de banco de dados MySQL.
No
INTEGER
3306
Nenhuma observação.
-
-
Somente tabela source
Parâmetro
Descrição
Obrigatório
Tipo de dado
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 automaticamente.
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 o formato de intervalo de IDs, como 5400-5408. Quando a leitura incremental está ativa, a leitura simultânea é suportada. Nesse caso, defina um intervalo de IDs para que cada leitor simultâneo utilize um ID diferente. Para mais informações, consulte Use Server ID.
scan.incremental.snapshot.enabled
Indica se os snapshots incrementais devem ser ativados.
Não
BOOLEAN
true
Os snapshots incrementais são ativados por padrão. Trata-se de um novo mecanismo para leitura de snapshots completos de dados. Em comparação com o método antigo, os snapshots incrementais oferecem diversas vantagens, entre elas:
-
O source consegue ler dados completos em paralelo.
-
O source suporta checkpoints em nível de chunk durante a leitura de dados completos.
-
O source não precisa adquirir um bloqueio de leitura global (FLUSH TABLES WITH read lock) durante a leitura de dados completos.
Para que o source suporte leitura simultânea, cada leitor simultâneo precisa de um server ID único. Por isso, o server-id deve ser um intervalo, como 5400-6400, e o tamanho do intervalo deve ser 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
O tamanho de cada chunk em número de linhas.
Não
INTEGER
8096
Quando a leitura incremental de snapshot está ativa, a tabela é dividida em múltiplos chunks para leitura. Os dados de um chunk são armazenados em memória antes de serem lidos por completo.
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 ocasionar erros de out-of-memory (OOM) e diminuir o throughput geral. Por isso, é necessário encontrar um equilíbrio e definir um tamanho de chunk adequado.
scan.snapshot.fetch.size
O número máximo de registros a buscar de uma vez durante a leitura de dados completos 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 ou em uma inicialização sem estado, o conector lê todos os dados históricos completos e, em seguida, passa a ler os dados mais recentes do binary log.
-
latest-offset: Na primeira inicialização ou em uma inicialização sem estado, o conector não lê os dados históricos. A leitura começa a partir do final do binary log, ou seja, somente as alterações mais recentes feitas após o início do conector são lidas.
-
earliest-offset: O conector não lê os dados históricos. A leitura começa a partir do binary log disponível mais antigo.
-
specific-offset: O conector não lê os dados históricos. A leitura começa a partir de um offset específico do binary log. Especifique o offset configurando tanto scan.startup.specific-offset.file quanto scan.startup.specific-offset.pos, ou configure apenas scan.startup.specific-offset.gtid-set para iniciar a partir de um conjunto de GTIDs específico.
-
timestamp: O conector não lê os dados históricos. A leitura do binary log começa a partir de um timestamp especificado, definido em milissegundos pelo parâmetro scan.startup.timestamp-millis.
ImportanteAo utilizar o modo de inicialização earliest-offset, specific-offset ou timestamp, certifique-se de que o schema da tabela correspondente não sofreu alterações entre a posição de consumo do binary log especificada e o momento de inicialização do job. Isso evita erros causados por incompatibilidades de schema.
scan.startup.specific-offset.file
O nome do arquivo de binary log correspondente ao offset de início, usado no modo de inicialização specific-offset.
Não
STRING
Nenhum
Ao usar este parâmetro, defina scan.startup.mode como specific-offset. Exemplo de formato de nome de arquivo:
mysql-bin.000003.scan.startup.specific-offset.pos
O offset dentro do arquivo de binary log especificado, correspondente ao offset de início no 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 de GTIDs correspondente ao offset de início, usado no modo de inicialização specific-offset.
Não
STRING
Nenhum
Ao usar este parâmetro, defina scan.startup.mode como specific-offset. Exemplo de formato de conjunto de GTIDs:
24DA167-0C0C-11E8-8442-00059A3C7B00:1-19.scan.startup.timestamp-millis
O timestamp em milissegundos correspondente ao offset de início, usado no 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.
ImportanteAo especificar um horário, o MySQL CDC tenta ler o evento inicial de cada arquivo de binary log para determinar seu timestamp e, em seguida, localiza o arquivo correspondente ao horário especificado. Certifique-se de que o arquivo de binary log correspondente ao timestamp indicado não foi removido do banco de dados e ainda pode ser lido.
server-time-zone
O fuso horário de sessão utilizado pelo banco de dados.
Não
STRING
Se este parâmetro não for especificado, o sistema utiliza o fuso horário do ambiente de execução do job Flink como fuso horário do servidor de banco de dados. Esse é o fuso horário da zona selecionada.
Exemplo: Asia/Shanghai. Este parâmetro controla como o tipo TIMESTAMP do MySQL é convertido para o tipo STRING. Para mais informações, consulte Debezium temporal values.
debezium.min.row.count.to.stream.results
Quando o número de linhas em uma tabela for maior que este valor, o modo de leitura em lotes é utilizado.
Não
INTEGER
1000
O Flink lê dados de uma tabela source do MySQL de uma das seguintes formas:
-
Leitura completa: lê todos os dados da tabela diretamente na memória. Este método é rápido, mas consome a quantidade correspondente de memória. Se a tabela source for muito grande, há risco de erros OOM.
-
Leitura em lotes: lê os dados em múltiplos lotes, com um determinado número de linhas por lote, até que todos os dados sejam lidos. Este método evita riscos de OOM na leitura de tabelas grandes, porém é relativamente mais lento.
connect.timeout
O tempo máximo de espera por uma conexão ao servidor de banco de dados MySQL antes de uma nova tentativa.
Não
DURATION
30s
Nenhuma.
connect.max-retries
O número máximo de tentativas após uma falha de conexão ao 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 permite reutilizar conexões existentes, reduzindo o número total de conexões abertas.
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 para o Debezium realizar a leitura de binary logs.
Não
STRING
Nenhum
É possível passar parâmetros personalizados para o Debezium. Por exemplo, use 'debezium.event.deserialization.failure.handling.mode'='ignore' para especificar a lógica de tratamento de erros de parsing.
AvisoNão modifique parâmetros do Debezium de forma arbitrária, pois isso pode fazer com que o conector leia dados incorretamente. Por exemplo, o parâmetro debezium.binlog.buffer.size não pode ser configurado.
heartbeat.interval
O intervalo no qual o source avança o offset do binary log por meio de eventos de heartbeat.
Não
DURATION
30s
Os eventos de heartbeat são usados para avançar o offset do binary log no source. Esse recurso é especialmente útil para tabelas do MySQL que são atualizadas com pouca frequência, pois nelas o offset do binary log não avança automaticamente. Os eventos de heartbeat empurram o offset para frente, evitando problemas causados por um offset de binary log expirado — o que pode fazer com que o job falhe de forma irrecuperável e exija uma reinicialização sem estado.
scan.incremental.snapshot.chunk.key-column
Especifica a coluna a ser usada como coluna de divisão para o sharding durante a fase de snapshot.
Consulte a coluna Observações.
STRING
Nenhum
-
Obrigatório para tabelas sem chave primária. A coluna selecionada deve ser do tipo não nulo (NOT NULL).
-
Opcional para tabelas com chave primária. Somente uma coluna pode ser selecionada a partir da chave primária.
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 Regions and zones.
ImportanteComo a string GTID do MySQL CDC é gerada aleatoriamente e não é monotonicamente crescente como os offsets de arquivo de binary log, 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 os recursos que dependem de offsets GTID. Por isso, o recurso de logs arquivados do OSS suporta apenas a inicialização a partir de um timestamp especificado ou de um offset de arquivo de binary log especificado. Ele não suporta a inicialização a partir de um GTID específico, nem cenários com failover primário/secundário nos logs arquivados, pois esses failovers dependem de GTIDs. Avalie cuidadosamente este recurso antes de utilizá-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 How do I view the AccessKey ID and AccessKey secret?.
ImportantePara evitar vazamento das informações do seu AccessKey, use o recurso de gerenciamento de segredos para especificar o AccessKey ID. Para mais informações, consulte Manage variables.
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 How do I view the AccessKey ID and AccessKey secret?
ImportantePara evitar vazamento das informações do seu AccessKey, use o recurso de gerenciamento de segredos para especificar o AccessKey secret. Para mais informações, consulte Manage variables.
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 ApsaraDB RDS for MySQL log backup.
-
Suportado apenas no VVR 8.0.7 e versões posteriores.
NotaSe 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 obtenção de informações de binary log do OSS.
Não
STRING
Nenhum
-
Para mais informações sobre os valores válidos, consulte Endpoints.
-
Suportado apenas no VVR 8.0.8 e versões posteriores.
scan.incremental.close-idle-reader.enabled
Indica se os leitores ociosos devem ser encerrados após a conclusão do snapshot.
Não
BOOLEAN
false
-
Suportado apenas no VVR 8.0.1 e versões posteriores.
-
Para que esta configuração tenha efeito, 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 um fluxo de dados append-only.
Não
BOOLEAN
false
Valores válidos:
-
true: Todos os tipos de mensagens, incluindo INSERT, DELETE, UPDATE_BEFORE e UPDATE_AFTER, são convertidos em mensagens INSERT. Ative esta opção apenas em cenários especiais, como quando é necessário salvar mensagens de exclusão da tabela upstream.
-
false (padrão): Todos os tipos de mensagens são enviados para downstream sem alteração.
NotaSuportado apenas no VVR 8.0.8 e versões posteriores.
scan.only.deserialize.captured.tables.changelog.enabled
Na fase incremental, indica 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 versões posteriores.
Valores válidos:
-
true: Desserializa apenas os dados de alteração das tabelas de destino para acelerar a leitura do binary log.
-
false (padrão): Desserializa os dados de alteração de todas as tabelas.
Nota-
Suportado apenas no VVR 8.0.7 e versões posteriores.
-
Ao usar o VVR 8.0.8 ou versões anteriores, altere o nome do parâmetro para debezium.scan.only.deserialize.captured.tables.changelog.enable.
scan.parse.online.schema.changes.enabled
Na fase incremental, indica se deve haver tentativa de análise dos eventos DDL de alteração sem bloqueio do RDS.
Não
BOOLEAN
false
Valores válidos:
-
true: Analisa os eventos DDL de alteração sem bloqueio do RDS.
-
false (padrão): Não analisa os eventos DDL de alteração sem bloqueio do RDS.
Este é um recurso experimental. Antes de executar uma alteração online sem bloqueio, tire um snapshot do job Flink para fins de recuperação.
NotaSuportado apenas no VVR 11.1 e versões posteriores.
scan.incremental.snapshot.backfill.skip
Indica 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.
O backfill se aplica apenas durante a consulta de snapshot de um único chunk e não abrange toda a fase de leitura completa. Quando o backfill é ignorado, a consulta de snapshot de cada chunk lê os dados mais recentes da tabela naquele instante; atualizações que ocorrem em um chunk após sua leitura não são mescladas durante a fase de leitura completa e são lidas a partir do Binlog ao entrar na fase incremental. Por exemplo, uma atualização no chunk5 que ocorre enquanto ele está sendo capturado no snapshot é refletida diretamente no snapshot do chunk5; se o chunk5 for atualizado depois que o leitor já avançou para o chunk80, a atualização será aplicada posteriormente a partir do Binlog durante a fase incremental.
ImportanteQuando ativado, as alterações que ocorrem durante ou após a varredura de um chunk ainda são entregues pelo Binlog na fase incremental e podem ser duplicadas. Apenas a semântica de at-least-once é garantida. Ative esta opção somente quando o sink downstream suportar escritas idempotentes por chave primária.
NotaSuportado apenas no VVR 11.1 e versões posteriores.
scan.incremental.snapshot.unbounded-chunk-first.enabled
Indica se os chunks ilimitados devem ser despachados primeiro durante a fase de leitura de snapshot.
Não
BOOELEAN
false
Valores válidos:
-
true: Despacha os chunks ilimitados primeiro durante a fase de leitura de snapshot.
-
false (padrão): Não despacha os 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 durante a sincronização do último chunk na fase de snapshot. Adicione este parâmetro antes da primeira inicialização do job.
NotaSuportado apenas no VVR 11.1 e versões posteriores.
binlog.session.network.timeout
O timeout de leitura/gravação de rede para a conexão de binary log.
Não
DURATION
10m
Se definido como 0s, o timeout padrão do servidor MySQL é utilizado.
NotaSuportado apenas no VVR 11.5 e versões posteriores.
scan.rate-limit.records-per-second
Limita o número máximo de registros enviados pelo source por segundo.
Não
LONG
Nenhum
Aplicável a cenários onde é necessário limitar a taxa de leitura de dados. Este limite é efetivo tanto na fase completa quanto na fase incremental.
A métrica
numRecordsOutPerSeconddo 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 de dados completos, geralmente é necessário reduzir o número de linhas lidas em cada lote. Para isso, reduza o valor do parâmetro
scan.incremental.snapshot.chunk.size.NotaSuportado apenas no VVR 11.5 e versões posteriores.
scan.binlog.tolerate.gtid-holes
Ao ativar este parâmetro, as lacunas na sequência GTID são ignoradas, permitindo que o job contorne eventos descontínuos e continue em execução.
Não
BOOLEAN
false
Antes de ativar este parâmetro, certifique-se de que o offset de início do job não expirou. Se o job iniciar a partir de um offset GTID já removido ou expirado, o motor silenciosamente ignorará os logs ausentes, o que resultará em perda de dados.
NotaEste parâmetro é suportado apenas no VVR 11.6 e versões posteriores.
scan.filter-unchanged-row.enabled
Indica se os eventos de alteração de campos não referenciados no SQL devem ser filtrados.
Não
BOOLEAN
false
Ao definir este parâmetro como true, uma tabela source CDC compara apenas as colunas referenciadas na instrução SQL ao receber um evento UPDATE. Se os valores das colunas referenciadas não mudarem, o evento não é enviado para downstream. Este parâmetro é efetivo em cenários de JOIN com múltiplos fluxos. Se uma tabela upstream atualizar um campo não referenciado na instrução SQL, eventos DELETE e INSERT desnecessários não são gerados. Isso reduz a amplificação de dados e a oscilação de resultados nos operadores downstream.
NotaEste parâmetro é suportado apenas no VVR 11.8 e versões posteriores.
scan.projection-pushdown.enabled
Indica se o pushdown de projeção deve ser ativado.
Não
BOOLEAN
false
Ao definir este parâmetro como true, uma tabela source CDC analisa e transmite apenas as colunas referenciadas na instrução SQL. As colunas não referenciadas não são serializadas nem transmitidas pela rede, reduzindo a sobrecarga de I/O e processamento. Este parâmetro é mais eficaz quando usado em conjunto com
scan.filter-unchanged-row.enabled: o pushdown de projeção primeiro reduz o volume de dados, e em seguida as linhas sem alteração são filtradas, aliviando ainda mais a carga nos operadores downstream.NotaEste parâmetro é suportado apenas no VVR 11.8 e versões posteriores.
-
-
Parâmetros específicos de tabela de dimensão
Parâmetro
Descrição
Obrigatório
Tipo de dado
Valor padrão
Observações
url
A URL JDBC do MySQL.
Não
STRING
Nenhum
O formato da URL é:
jdbc:mysql://<endpoint>:<port>/<database_name>.lookup.max-retries
O número máximo de tentativas após uma falha na leitura de dados.
Não
INTEGER
3
Compatível apenas com VVR 6.0.7 e versões posteriores.
lookup.cache.strategy
A 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 Dimension table JOIN statements.
NotaAo usar a política de cache LRU, você também deve configurar o parâmetro lookup.cache.max-rows.
lookup.cache.max-rows
O número máximo de linhas em cache.
Não
INTEGER
100000
-
Se a política de cache LRU for selecionada, defina o tamanho do cache.
-
Se a política de cache ALL for selecionada, não é necessário definir o tamanho do cache.
lookup.cache.ttl
O tempo de vida (TTL) do cache.
Não
DURATION
10 s
A configuração de lookup.cache.ttl depende de lookup.cache.strategy:
-
Se lookup.cache.strategy estiver definido como None, não é necessário configurar lookup.cache.ttl. Isso significa que o cache não expira.
-
Se lookup.cache.strategy estiver definido como LRU, lookup.cache.ttl representa o TTL do cache. Por padrão, o cache não expira.
-
Se lookup.cache.strategy estiver definido como ALL, lookup.cache.ttl representa o tempo de carregamento do cache. Por padrão, o cache não é recarregado.
Use um formato de tempo, como 1min ou 10s.
lookup.max-join-rows
O número máximo 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
Especifica se o filter pushdown deve ser ativado para a tabela de dimensão.
Não
BOOLEAN
false
Valores válidos:
-
true: Ativa o filter pushdown 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 filter pushdown para a tabela de dimensão. Ao carregar dados da tabela do banco de dados MySQL, a tabela de dimensão carrega todos os dados.
NotaCompatível apenas com 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 source do MySQL não suportam a ativação de filter pushdown. Se uma tabela Flink for usada tanto como tabela source quanto como tabela de dimensão e o filter pushdown estiver ativado para a tabela de dimensão, você deve definir explicitamente este item de configuração como false para a tabela source usando SQL Hints. Caso contrário, o job pode apresentar comportamento anormal.
lookup.cache.cache-empty
Especifica se resultados de consulta vazios devem ser armazenados em cache.
Não
BOOLEAN
true
Aplica-se apenas quando a política de cache for
LRU. Valores válidos:-
true (padrão): se uma consulta não retornar dados, um resultado vazio é armazenado em cache e retornado diretamente nas consultas subsequentes.
-
false: se uma consulta não retornar dados, nenhum resultado é armazenado em cache e a próxima consulta busca os dados novamente.
NotaEste parâmetro é compatível apenas com VVR 11.9.0 e versões posteriores.
-
-
Apenas para tabelas sink
Parâmetro
Descrição
Obrigatório
Tipo de dado
Valor padrão
Observações
url
A URL JDBC do MySQL.
Não
STRING
Nenhum
O formato da URL é:
jdbc:mysql://<endpoint>:<port>/<database_name>.sink.max-retries
O número máximo de tentativas após uma falha na gravação de dados.
Não
INTEGER
3
Nenhuma.
sink.buffer-flush.batch-size
O número de linhas em uma única gravação em lote.
Não
INTEGER
4096
Nenhuma.
sink.buffer-flush.max-rows
O 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
O intervalo para liberação do cache. Se os dados em cache não atenderem às condições de saída após o tempo de espera especificado, o sistema grava automaticamente todos os dados do cache.
Não
DURATION
1s
Nenhuma.
sink.ignore-delete
Especifica se as operações DELETE de dados devem ser ignoradas.
Não
BOOLEAN
false
Quando o stream gerado pelo Flink SQL inclui registros de delete ou update-before, se múltiplas tarefas de saída atualizam campos diferentes da mesma tabela simultaneamente, pode ocorrer inconsistência de dados.
Por exemplo, após a exclusão de um registro, outra tarefa atualiza apenas alguns campos. Os campos não atualizados passam a ser nulos ou assumem valores padrão, causando erros nos dados.
Ao definir sink.ignore-delete como true, você ignora as 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 "retratar" o valor antigo em uma operação de atualização.
-
Quando ignoreDelete = true, todos os registros do tipo DELETE e UPDATE_BEFORE são ignorados. Apenas os registros INSERT e UPDATE_AFTER são processados.
sink.ignore-delete-mode
A estratégia para tratar registros do tipo delete após as operações DELETE serem ignoradas.
Não
STRING
ALL
Valores válidos:
-
ALL: Ignora os registros -D e -U.
-
REAL_DELETE: Ignora apenas os registros -D.
-
UPDATE_BEFORE: Ignora apenas os registros -U.
Nota-
Esta opção é compatível apenas com o engine Realtime Compute VVR 11.8 e versões posteriores.
-
Válido somente quando sink.ignore-delete=true. Configurar este parâmetro isoladamente resulta em erro.
sink.ignore-null-when-update
Ao atualizar dados, especifica se o campo correspondente deve ser atualizado para nulo ou se a atualização desse campo deve ser ignorada quando o valor do campo de entrada for nulo.
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:
-
Para VVR 8.0.6 e versões anteriores, a tabela sink não suporta gravação em lote.
-
Para VVR 8.0.7 e versões posteriores, a tabela sink suporta gravação em lote.
A gravação em lote pode melhorar significativamente a eficiência de gravação e o throughput geral, mas introduz latência nos dados e risco de erros de OOM. Portanto, avalie essa opção com base no seu cenário de negócios.
-
-
false: Atualiza o campo para nulo.
NotaEste parâmetro é compatível apenas com VVR 8.0.5 e versões posteriores.
sink.force-batch-on-non-primary-table
Especifica se os registros devem ser obrigatoriamente armazenados em buffer e inseridos em lotes via JDBC Batch ao gravar dados em uma tabela sink do MySQL que não possui chave primária.
Não
BOOLEAN
false
Este parâmetro só entra em vigor em tabelas sem chave primária. Ao definir este parâmetro como true, os eventos DELETE e UPDATE_BEFORE são descartados silenciosamente, e os eventos INSERT e UPDATE_AFTER são gravados em lote como instruções INSERT. Recomenda-se ativar este parâmetro somente se os dados forem apenas de inserção (append-only) ou se a semântica descrita for aceitável para o seu caso.
Nota-
Este parâmetro é compatível apenas com VVR 11.8 e versões posteriores.
-
Ative este parâmetro somente se os dados forem apenas de inserção (append-only) ou se a semântica descrita for aceitável para o seu caso. Caso contrário, os dados podem ficar inconsistentes.
-
Mapeamento de tipos
-
Tabelas source CDC
MySQL CDC field type
Flink field type
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 CDC do MySQL mapeia TINYINT(1) para o tipo BOOLEAN no Flink por padrão. Isso pode causar imprecisões nos dados. Para usar o tipo TINYINT(1) para armazenar valores diferentes de 0 e 1, consulte o parâmetro de configuração catalog.table.treat-tinyint1-as-boolean.
-
Tabelas de dimensão e tabelas sink
MySQL field type
Flink field type
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)
Notawhere 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
ImportanteFlink only supports MySQL BLOB type records that are less than or equal to 2,147,483,647 (2^31 - 1) bytes.
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; -
Fonte de dados para ingestão de dados
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 CDC do MySQL
-
Como funciona
Ao iniciar uma tabela source CDC do MySQL, o sistema realiza uma varredura completa da tabela, divide-a em múltiplos chunks com base na chave primária e registra o offset atual do binary log. A tabela source utiliza um algoritmo de snapshot incremental para ler os dados de cada chunk por meio de instruções SELECT. O job realiza checkpoints periódicos para registrar os chunks concluídos. Em caso de failover, o job retoma a leitura a partir dos chunks não finalizados. Após a leitura de todos os chunks, o job inicia a leitura de registros de alterações incrementais a partir do offset do binary log registrado anteriormente. O job do Flink continua realizando checkpoints periódicos para registrar o offset do binary log. Se ocorrer um failover, o processamento é retomado a partir do último offset registrado, garantindo semântica exactly-once.
Para uma explicação mais detalhada do algoritmo de snapshot incremental, consulte MySQL CDC Connector.
-
Metadados
Os metadados são úteis em cenários onde dados de bancos de dados e tabelas fragmentados (sharded) são mesclados e sincronizados. Após a mesclagem, as aplicações frequentemente precisam identificar o banco de dados e a tabela de origem de cada registro. As colunas de metadados permitem acessar o nome do banco de dados e da tabela de origem. Dessa forma, é possível mesclar diversas tabelas fragmentadas em uma única tabela de destino com facilidade.
O MySQL CDC Source oferece suporte à sintaxe de colunas de metadados. Os metadados a seguir podem ser acessados por meio dessas colunas.
Metadata key
Metadata type
Descrição
database_name
STRING NOT NULL
O nome do banco de dados que contém a linha.
table_name
STRING NOT NULL
O nome da tabela que contém a linha.
op_ts
TIMESTAMP_LTZ(3) NOT NULL
O momento em que a linha foi alterada no banco de dados. Se o registro provém dos dados históricos da tabela em vez do binary log, esse valor é sempre 0.
NotaEste campo tem precisão de apenas um segundo.
op_type
STRING NOT NULL
O tipo de alteração da linha.
-
+I: mensagem INSERT
-
-D: mensagem DELETE
-
-U: mensagem UPDATE_BEFORE
-
+U: mensagem UPDATE_AFTER
NotaDisponível apenas no VVR 8.0.7 e versões posteriores.
query_log
STRING NOT NULL
Permite ler o registro de query log do MySQL para esta linha.
NotaO MySQL precisa ter o parâmetro binlog_rows_query_log_events ativado para registrar query logs.
O exemplo de código a seguir mostra como mesclar e sincronizar múltiplas tabelas de pedidos de diferentes 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:Quando a chave primária da tabela downstream é
order_id, o resultado contém apenas a última alteração de cada chave primária na tabela upstream. Para dados cuja última alteração foi uma operação de exclusão, aparecerá um registro na tabela downstream com a mesma chave primária eop_typeigual a -D.Quando a chave primária da tabela downstream é composta por
order_id,operation_tseop_type, o resultado contém o histórico completo de alterações de cada chave primária na tabela upstream.
-
-
Suporte a expressões regulares
A tabela source CDC do MySQL oferece suporte ao uso de expressões regulares no nome da tabela ou do banco de dados para corresponder a múltiplas tabelas ou bancos de dados. O exemplo de código a seguir mostra como especificar múltiplas 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 a seguir:
^(test).*é um exemplo de correspondência por prefixo. Essa expressão corresponde a nomes de banco de dados que começam com "test", como "test1" ou "test2"..*[p$]é um exemplo de correspondência por sufixo. Essa expressão corresponde a nomes de banco de dados que terminam com "p", como "cdcp" ou "edcp".txcé uma correspondência exata, capturando apenas bancos de dados com o nome "txc".
Ao corresponder a um nome de tabela totalmente qualificado, o MySQL CDC utiliza o padrão
database-name.table-namepara identificar a tabela de forma exclusiva. 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 aceitam vírgula (,) para especificar múltiplas tabelas ou bancos de dados.Para corresponder a múltiplas tabelas ou usar múltiplas expressões regulares, conecte-as com uma barra vertical (|) e envolva-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 de barra vertical (|). Por exemplo, a expressão
mytable_\d{1, 2}deve ser reescrita como a equivalente(mytable_\d{1}|mytable_\d{2})para evitar o uso de vírgula.
-
Controle de concorrência
O conector MySQL oferece suporte à leitura multithreaded 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 realiza o scale-in automaticamente durante a fase incremental após a conclusão da leitura multithreaded, economizando recursos de computação.
No console de desenvolvimento do Realtime Compute for Apache Flink, defina a concorrência de um job no modo básico ou no modo especialista na página Resource Configuration.
-
A concorrência definida no modo básico é a concorrência global para todo o job.
Por exemplo, quando o parallelism é definido como
8no basic mode, oserver-idna cláusula SQL WITH deve ser configurado como um intervalo contínuo (como'404-412'). 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 Configure deployment information for a job.
ImportanteNos modos básico e 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, há nove server IDs únicos, portanto a concorrência máxima do job é 9. Jobs diferentes para a mesma instância MySQL não devem ter intervalos de server ID sobrepostos — cada job deve ser explicitamente configurado com um server ID ou intervalo de server ID diferente. -
-
Scale-in automático com Autopilot
A fase de dados completos acumula grande volume de dados históricos. Para melhorar a eficiência de leitura, esses dados costumam ser lidos em paralelo. Na fase incremental de binary log, como o volume de dados é menor e a ordem global deve ser preservada, a leitura single-threaded geralmente é suficiente. Os diferentes requisitos de recursos das fases completa e incremental podem ser balanceados entre desempenho e recursos por meio do recurso de ajuste automático.
O ajuste automático monitora o tráfego de cada tarefa do MySQL CDC Source. 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 reduz automaticamente a contagem de CUs e a concorrência da source. Para ativar o ajuste automático, defina o modo de ajuste automático como Active na página de O&M do job.
NotaO intervalo mínimo padrão para redução de concorrência é de 24 horas. Para mais informações sobre parâmetros e detalhes do ajuste automático, consulte Configure automatic tuning.
-
Modos de inicialização
Use o item de configuração
scan.startup.modepara especificar o modo de inicialização da tabela source CDC do MySQL. As opções disponíveis são:initial (padrão): Na primeira inicialização ou em uma inicialização sem estado, realiza a leitura completa da tabela do banco de dados e, em seguida, alterna 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 as 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 e posição do arquivo de 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 especificado.
Uma inicialização sem estado não reutiliza nenhum estado. O conector source a trata como uma primeira inicialização, portanto o scan.startup.mode entra em vigor novamente. Para mais informações sobre modos de inicialização de deployment, consulte Start a deployment.
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. ... )ImportanteDurante um checkpoint, a source MySQL registra o offset atual no log no nível INFO. O prefixo desse 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 sendo lida passou por alterações de esquema, iniciar a partir de
earliest-offset,specific-offsetoutimestamppode causar um erro. Isso ocorre porque o leitor Debezium armazena internamente o esquema mais recente da tabela, e dados anteriores com esquema incompatível não podem ser interpretados corretamente.
-
Sobre tabelas source CDC sem chave primária
Para usar uma tabela sem chave primária, defina
scan.incremental.snapshot.chunk.key-column, e apenas uma coluna não nula pode ser selecionada.-
A semântica de processamento de uma tabela source CDC sem chave primária é determinada pelo comportamento da coluna especificada em
scan.incremental.snapshot.chunk.key-column:Se a coluna especificada não for atualizada, a semântica exactly-once pode ser garantida.
Se a coluna especificada for atualizada, apenas a semântica at-least-once pode ser garantida. Ainda assim, a consistência dos dados pode ser assegurada combinando com o downstream, especificando uma chave primária downstream e utilizando operações idempotentes.
-
Leitura de logs de backup do ApsaraDB RDS for MySQL da Alibaba Cloud
A tabela source CDC do MySQL oferece suporte à leitura de logs de backup do ApsaraDB RDS for MySQL da Alibaba Cloud. Esse recurso é útil em cenários onde a fase de dados completos demora muito e os arquivos locais de binary log foram excluídos automaticamente, mas os arquivos de backup enviados automática ou manualmente ainda existem.
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 o reuso de CDC Source
No mesmo job, múltiplas tabelas source CDC do MySQL iniciam múltiplos 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 MySQL CDC FAQ.
Solução
O VVR 8.0.7 e versões posteriores oferecem suporte ao reuso de CDC Source do MySQL. Esse recurso mescla tabelas source CDC do MySQL que podem ser combinadas. 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 CDC do MySQL 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 o reuso ativado por padrão.
Inicie o job sem estado. Como modificar a configuração de reuso de source altera a topologia do job, inicie o job sem estado. Caso contrário, o job poderá falhar ao iniciar ou ocorrer perda de dados. Se uma source for mesclada, um nó
MergetableSourceScanficará visível na topologia.
ImportanteApós ativar o reuso, 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á a sobrecarga.No VVR 8.0.7, desativar o encadeamento de operadores causa problemas de serialização.
-
Acelerar a leitura do binary log
Ao usar o conector MySQL como tabela source ou fonte de dados para ingestão, ele analisa arquivos de binary log para gerar diversas mensagens de alteração durante a fase incremental. Os arquivos de binary log registram todas as alterações de tabela em formato binário. A análise desses arquivos pode ser acelerada das seguintes formas.
-
Ative a análise paralela e os filtros de análise (este recurso requer o Realtime Compute for Apache Flink com Ververica Runtime (VVR) 8.0.7 ou posterior; não está disponível na edição comunitária do conector MySQL CDC)
Ative a opção
scan.only.deserialize.captured.tables.changelog.enabledpara analisar eventos de alteração apenas das tabelas especificadas.Ative a opção
scan.parallel-deserialize-changelog.enabledpara usar múltiplas threads na análise do arquivo de binary log e entregar os eventos à fila do consumidor em ordem. Ao ativar essa opção, geralmente é necessário aumentar também oTaskManager CPU.
-
Otimize os parâmetros do Debezium
debezium.max.queue.size: 162580 debezium.max.batch.size: 40960 debezium.poll.interval.ms: 50debezium.max.queue.size: O 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, os eventos são colocados em uma fila de bloqueio antes de serem enviados downstream. O valor padrão é 8192.debezium.max.batch.size: O número máximo de eventos processados pelo conector em cada iteração. O valor padrão é 2048.debezium.poll.interval.ms: O número de milissegundos que o conector aguarda antes de solicitar novos eventos de alteração. O valor padrão é 1000 milissegundos, ou 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 edição Enterprise do MySQL CDC é de 85 MB/s, aproximadamente o dobro da versão open source comunitária. Quando a velocidade de geração dos 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 após a redução da velocidade de geração dos arquivos. Se um arquivo de binary log contiver uma transação grande, a latência de processamento poderá aumentar temporariamente, diminuindo após a conclusão da leitura do log dessa transação.
Diagnosticar latência de dados para otimizar o throughput do job
Ao enfrentar latência de dados durante a fase incremental, analise o problema seguindo estes passos:
-
Verifique as métricas
currentFetchEventTimeLagecurrentEmitEventTimeLagna página Overview. A métricacurrentFetchEventTimeLagrepresenta a latência na leitura de dados do binary log. Já a métricacurrentEmitEventTimeLagrepresenta a latência na leitura de dados das tabelas relevantes para o job a partir do binary log.Cenário
Descrição
currentFetchEventTimeLagé baixo, enquantocurrentEmitEventTimeLagé alto e raramente se atualiza.Um
currentFetchEventTimeLagbaixo indica que a extração do binary log do banco de dados é eficiente. Porém, o binary log contém poucos dados para as tabelas que o job precisa ler, por issocurrentEmitEventTimeLagraramente se atualiza. Esse é o comportamento esperado.Tanto
currentFetchEventTimeLagquantocurrentEmitEventTimeLagestão altos.Indica que a tabela source apresenta baixo desempenho de leitura. Prossiga com as etapas subsequentes desta seção para otimização.
O backpressure pode reduzir a taxa com que a source envia dados para os operadores downstream. Você pode observar que o sourceIdleTime aumenta periodicamente e que tanto currentFetchEventTimeLag quanto currentEmitEventTimeLag crescem continuamente. Para resolver isso, aumente o paralelismo do nó onde o backpressure se origina.
Verifique a métrica TM CPU Usage na página CPU e a métrica TM GC Time na página JVM para determinar se há insuficiência de recursos de CPU ou memória. Aumente os recursos do job para otimizar o desempenho de leitura. Ative também os parâmetros mini-batch para melhorar o throughput. Para mais informações, consulte High-Performance Flink SQL Optimization Techniques.
Se o job contiver um operador SinkUpsertMaterializer com um estado grande, isso pode afetar o desempenho de leitura. Considere aumentar o paralelismo do job ou evitar o operador SinkUpsertMaterializer. Para mais informações, consulte Avoid using SinkUpsertMaterializer. Remover o operador SinkUpsertMaterializer de um job existente requer uma reinicialização sem estado, pois a topologia do job é alterada e iniciar a partir do estado existente pode causar falha no job ou perda de dados.
Definir o server ID para evitar conflitos de binlog
Cada cliente que sincroniza dados de um banco de dados possui um ID exclusivo chamado server ID. Se jobs diferentes usarem o mesmo server ID, podem ocorrer conflitos e falhas nos jobs. Recomendamos atribuir um server ID diferente para cada fonte de dados CDC do MySQL.
-
Como configurar o server ID
Especifique o server ID em uma instrução DDL de tabela Flink ou usando SQL Hints.
Recomendamos usar SQL Hints para configurar o server ID em vez de especificá-lo na cláusula WITH do DDL da tabela. Para mais informações, consulte SQL Hints.
-
Configuração do server ID para diferentes cenários
-
Snapshot incremental desativado ou paralelismo igual a 1
Se o snapshot incremental estiver desativado ou o paralelismo for 1, especifique um único server ID.
SELECT * FROM source_table /*+ OPTIONS('server-id'='123456') */ ; -
Snapshot incremental ativado e paralelismo maior que 1
Quando o snapshot incremental está ativado e o paralelismo é maior que 1, especifique um intervalo de server ID. O número de server IDs disponíveis no intervalo deve ser pelo menos igual ao paralelismo. Por exemplo, com paralelismo 3, use a seguinte configuração:
SELECT * FROM source_table /*+ OPTIONS('server-id'='123456-123458') */ ; -
Job Flink SQL com múltiplas tabelas source CDC do MySQL
Se um job Flink SQL contiver múltiplas tabelas source CDC do MySQL e o reuso de source estiver desativado, forneça um server ID diferente para cada tabela source CDC. Da mesma forma, se o snapshot incremental estiver ativado e o 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;
-
Definir parâmetros de chunk para otimizar o uso de memória
Ao iniciar uma tabela source CDC do MySQL, o sistema realiza uma varredura completa da tabela, divide-a em múltiplos chunks com base na chave primária e registra a posição atual do binary log. O job então usa um algoritmo de snapshot incremental para ler os dados de cada chunk sequencialmente por meio de instruções SELECT. Checkpoints periódicos registram os chunks concluídos. Em caso de failover, a leitura é retomada a partir do primeiro chunk não finalizado. Após a leitura de todos os chunks, o job alterna para a leitura de alterações incrementais a partir da posição de binary log registrada anteriormente. O job Flink realiza checkpoints periódicos para salvar a posição do binary log. Se ocorrer um failover, o processamento é retomado a partir da última posição salva, garantindo semântica exactly-once.
Para mais detalhes sobre o algoritmo de snapshot incremental, consulte MySQL CDC Connector.
Para tabelas com chave primária de coluna única, os chunks são divididos com base nessa chave por padrão. Para tabelas com chave primária composta, a primeira coluna da chave primária é usada para a divisão por padrão. O Ververica Runtime (VVR) 6.0.7 e versões posteriores oferecem suporte à leitura de tabelas source sem chave primária. Nesse caso, defina o parâmetro scan.incremental.snapshot.chunk.key-column para especificar uma coluna não nula para a divisão.
Otimização de parâmetros de chunk
Os dados e metadados de chunk são armazenados em memória, o que pode ocasionar erros de falta de memória (OOM). Ajuste os parâmetros com base no componente que apresenta o erro OOM:
-
JobManager
O JobManager armazena os metadados de todos os chunks. Um número excessivo de chunks pode causar erro OOM. Para resolver, aumente o valor de
scan.incremental.snapshot.chunk.sizepara reduzir o número de chunks. Como alternativa, aumente a memória heap do JobManager definindojobmanager.memory.heap.sizena sua configuração de runtime. Para mais informações, consulte Flink Parameter Configuration. -
TaskManager
O TaskManager lê os dados de cada chunk. Se um chunk contiver muitas linhas, pode ocorrer erro OOM. Para resolver, reduza o valor de
scan.incremental.snapshot.chunk.sizepara diminuir o número de linhas por chunk. Também é possível aumentar a memória heap do TaskManager incrementando o valor deTaskManager Memoryna configuração de runtime.No VVR 8.0.8 e versões anteriores, o último chunk pode conter grande volume de dados, causando erro OOM no TaskManager. Recomendamos atualizar para o VVR 8.0.9 ou posterior para evitar esse problema.
Em tabelas source CDC do MySQL com chave primária composta, os chunks são divididos pela primeira coluna da chave por padrão. Se os dados estiverem significativamente distorcidos, com muitas linhas compartilhando o mesmo valor nessa coluna, o chunk para esse valor pode se tornar muito grande e causar erro OOM no TaskManager. Defina
scan.incremental.snapshot.chunk.key-columnpara especificar uma coluna diferente da chave primária para a divisão.
Acelerar leituras na fase de snapshot
Durante a fase de snapshot, a tabela source MySQL lê os dados do snapshot por meio de uma conexão JDBC. Use os métodos a seguir para acelerar as leituras nessa fase.
Aumente o paralelismo da source para acelerar as leituras durante a fase de snapshot.
Aumente o valor de
scan.incremental.snapshot.chunk.sizepara buscar mais dados em um único chunk.Se a tabela de resultado downstream tiver chave primária e oferecer suporte a gravações idempotentes, ative
scan.incremental.snapshot.backfill.skippara ignorar a leitura do binary log na parte de backfill, acelerando o processamento durante a fase de snapshot.
Ativar o reuso de source para reduzir conexões de binlog
Quando um job inclui múltiplas tabelas source MySQL, ative o reuso de source para reduzir a carga no banco de dados compartilhando uma única conexão de binary log. Este recurso está disponível apenas no Realtime Compute for Apache Flink e não é compatível com a edição comunitária do conector MySQL CDC.
Ative o recurso de reuso de source em um job SQL usando o comando SET:
SET 'table.optimizer.source-merge.enabled' = 'true';
Recomendamos ativar o reuso de source apenas para jobs novos. Ao ativá-lo em um job existente, realize uma reinicialização sem estado, pois o reuso de source altera a topologia do job e iniciar a partir de um estado existente pode causar falha no job ou perda de dados.
Após ativar o reuso de source, as tabelas source MySQL com os mesmos parâmetros de configuração são mescladas. Se todas as tabelas source do job compartilharem a mesma configuração, o número de conexões de binary log é calculado da seguinte forma:
Durante a fase de snapshot, o número de conexões de binary log é igual ao paralelismo da source.
Durante a fase incremental, o número de conexões de binary log é 1.
No VVR 8.0.8 e 8.0.9, ao ativar o reuso de CDC Source, defina também
SET 'sql-gateway.exec-plan.enabled' = 'false';.Após ativar o reuso de CDC Source, não defina a opção de job
pipeline.operator-chainingcomo false. Quebrar a cadeia de operadores adiciona sobrecarga de serialização e desserialização para dados enviados da source para os operadores downstream. Quanto mais sources forem mescladas, maior será a sobrecarga.No Ververica Runtime (VVR) 8.0.7, definir
pipeline.operator-chainingcomo false causa um problema de serialização.
Ler binlogs arquivados do OSS
Ao usar uma instância ApsaraDB RDS for MySQL como fonte de dados, leia os backups de log armazenados no OSS. Se o arquivo correspondente ao timestamp ou posição de binary log especificados estiver armazenado no OSS, o Flink extrai automaticamente o arquivo de log do OSS para o cluster. Se o arquivo estiver armazenado localmente no banco de dados, o Flink alterna automaticamente para a leitura por meio de uma conexão com o banco de dados. Este recurso está disponível apenas no Realtime Compute for Apache Flink e não é compatível com a edição comunitária do conector MySQL CDC.
Para ativar a leitura a partir de backups de log no OSS, configure os parâmetros de conexão do ApsaraDB RDS for MySQL. Exemplo:
CREATE TABLE mysql_source (...) WITH (
'connector' = 'mysql-cdc',
'rds.region-id' = 'cn-beijing',
'rds.access-key-id' = 'your_access_key_id',
'rds.access-key-secret' = 'your_access_key_secret',
'rds.db-instance-id' = 'rm-xxxxxxxx', // The ID of the database instance.
'rds.main-db-id' = '12345678', // The ID of the primary database.
'rds.endpoint' = 'rds.aliyuncs.com'
...
)
FAQ
Para mais informações sobre problemas que podem ocorrer ao usar tabelas source CDC, consulte CDC FAQ.