Todos los productos
Search
Centro de documentos

Realtime Compute for Apache Flink:Conector SQL de MySQL

Última actualización: Sep 18, 2026

En este tema se describe cómo usar el conector de MySQL en trabajos SQL.

Contexto

El conector de MySQL es compatible con todas las bases de datos que admiten el protocolo MySQL, como ApsaraDB RDS for MySQL, PolarDB for MySQL, OceanBase (modo MySQL) y MySQL autogestionado.

Importante

Cuando use el conector de MySQL para leer datos de OceanBase, asegúrese de que el registro binario (binlog) esté habilitado y configurado correctamente. Para obtener más información, consulte Binlog-related operations. Esta función se encuentra en versión preliminar pública. Úsela con precaución.

El conector de MySQL admite lo siguiente:

Categoría

Detalles

Tipos compatibles

Tablas de origen, tablas de dimensiones, tablas de destino y orígenes de datos para la ingesta de datos

Modo de ejecución

Solo se admite el modo streaming.

Formato de datos

No aplicable

Métricas de monitoreo específicas

Métricas de monitoreo

  • Tabla de origen

    • currentFetchEventTimeLag: intervalo desde que se generan los datos hasta que el operador Source los extrae.

      Esta métrica solo es válida durante la fase de registro binario. En la fase de instantánea, el valor siempre es 0.

    • currentEmitEventTimeLag: intervalo desde que se generan los datos hasta que salen del operador Source.

      Esta métrica solo es válida durante la fase de registro binario. En la fase de instantánea, el valor siempre es 0.

    • sourceIdleTime: tiempo durante el cual la tabla de origen no ha generado datos nuevos.

  • Tablas de dimensiones y tablas de destino: Ninguna.

Nota

Para obtener más información sobre las métricas, consulte Metric description.

Tipos de API

DataStream, SQL y YAML de ingesta de datos

Admite actualizar o eliminar datos en tablas de destino

Sí

Funciones

Una tabla de origen de captura de datos modificados (CDC) de MySQL, también conocida como tabla de origen de streaming de MySQL, primero lee todos los datos históricos de la base de datos. Después, cambia sin interrupciones a la lectura de registros binarios. Este proceso garantiza que no se omitan ni se dupliquen datos. Incluso si ocurre un error, los datos se procesan con semántica de exactamente una vez. Una tabla de origen CDC de MySQL permite la lectura simultánea de datos completos. Utiliza un algoritmo de instantánea incremental para implementar la lectura sin bloqueos y la transferencia de datos reanudable. Para obtener más información, consulte About MySQL CDC source tables.

  • Procesamiento unificado por lotes y en streaming que permite leer tanto datos completos como incrementales. Esto elimina la necesidad de mantener dos procesos separados.

  • Lectura simultánea de datos completos para escalar horizontalmente el rendimiento.

  • Cambio fluido entre la lectura de datos completos y la de datos incrementales, con reducción automática de escala para ahorrar recursos de cómputo.

  • Transferencia de datos reanudable durante la fase de lectura completa, lo que mejora la estabilidad.

  • Lectura de datos completos sin bloqueos, que no afecta los servicios en línea.

  • Compatibilidad con la lectura de registros de copia de seguridad de ApsaraDB RDS for MySQL.

  • Análisis sintáctico paralelo de archivos de registro binario para reducir la latencia de lectura.

Requisitos previos

Antes de usar una tabla de origen CDC de MySQL, debe completar las operaciones descritas en Configure MySQL.

ApsaraDB RDS for MySQL

  • Realice una network probe para garantizar la conectividad de red con Realtime Compute for Apache Flink.

  • Versión de MySQL: 5.6, 5.7, 8.0.x u 8.4.

  • El registro binario debe estar habilitado. Se habilita de forma predeterminada.

  • El formato del registro binario debe ser ROW. Este es el formato predeterminado.

  • El parámetro binlog_row_image debe establecerse en FULL. Esta es la configuración predeterminada.

  • La compresión de transacciones de registro binario debe estar deshabilitada. Esta función se introdujo en MySQL 8.0.20 y está deshabilitada de forma predeterminada.

  • Debe haber creado un usuario de MySQL con los permisos SELECT, SHOW DATABASES, REPLICATION SLAVE y REPLICATION CLIENT.

  • Cree una base de datos y una tabla de MySQL. Para obtener más información, consulte Create a database and an account for an ApsaraDB RDS for MySQL instance. Use una cuenta con privilegios para crear la base de datos de MySQL y evitar errores por permisos insuficientes.

  • Configure una lista blanca de direcciones IP. Para obtener más información, consulte Configure an IP address whitelist for an ApsaraDB RDS for MySQL instance.

PolarDB for MySQL

  • Realice una network probe para garantizar la conectividad de red con Realtime Compute for Apache Flink.

  • Versión de MySQL: 5.6, 5.7, 8.0.x u 8.4.

  • El registro binario debe estar habilitado. Está deshabilitado de forma predeterminada.

  • El formato del registro binario debe ser ROW. Este es el formato predeterminado.

  • El parámetro binlog_row_image debe establecerse en FULL. Esta es la configuración predeterminada.

  • La compresión de transacciones de registro binario debe estar deshabilitada. Esta función se introdujo en MySQL 8.0.20 y está deshabilitada de forma predeterminada.

  • Debe haber creado un usuario de MySQL con los permisos SELECT, SHOW DATABASES, REPLICATION SLAVE y REPLICATION CLIENT.

  • Cree una base de datos y una tabla de MySQL. Para obtener más información, consulte Create a database and an account for a PolarDB for MySQL cluster. Use una cuenta con privilegios para crear la base de datos de MySQL y evitar errores por permisos insuficientes.

  • Configure una lista blanca de direcciones IP. Para obtener más información, consulte Configure an IP address whitelist for a PolarDB for MySQL cluster.

Self-managed MySQL

  • Realice una network probe para garantizar la conectividad de red con Realtime Compute for Apache Flink.

  • Versión de MySQL: 5.6, 5.7, 8.0.x u 8.4.

  • El registro binario debe estar habilitado. Está deshabilitado de forma predeterminada.

  • El formato del registro binario debe ser ROW. El formato predeterminado es STATEMENT.

  • El parámetro binlog_row_image debe establecerse en FULL. Esta es la configuración predeterminada.

  • La compresión de transacciones de registro binario debe estar deshabilitada. Esta función se introdujo en MySQL 8.0.20 y está deshabilitada de forma predeterminada.

  • Cree un usuario de MySQL y otórguele los permisos SELECT, SHOW DATABASES, REPLICATION SLAVE y REPLICATION CLIENT.

  • Cree una base de datos y una tabla de MySQL. Para obtener más información, consulte Crear una base de datos y una cuenta para una instancia de MySQL autogestionada. Use una cuenta con privilegios para crear la base de datos de MySQL y evitar errores por permisos insuficientes.

  • Configure una lista blanca de direcciones IP. Para obtener más información, consulte Configure an IP address whitelist for a self-managed MySQL instance.

Límites

Límites generales

  • Las tablas de origen CDC de MySQL no admiten definiciones de marcas de agua.

  • El conector CDC de MySQL no es compatible con la función de compresión de transacciones de registro binario. Por lo tanto, cuando use este conector para consumir datos incrementales, asegúrese de que dicha compresión esté deshabilitada. De lo contrario, el conector podría fallar al recuperar los datos incrementales.

ApsaraDB RDS for MySQL límites

  • En ApsaraDB RDS for MySQL, no lea datos de una base de datos secundaria ni de una réplica de solo lectura. El periodo de retención predeterminado de los registros binarios en estos componentes es corto. Si los registros binarios caducan y se eliminan, el trabajo podría fallar al consumirlos y generar un error.

  • ApsaraDB RDS for MySQL habilita de forma predeterminada la sincronización paralela entre instancias principal y secundaria, pero no garantiza un orden de transacciones consistente entre ellas. Esto puede provocar que se omitan datos durante un cambio de rol entre instancias y la recuperación de puntos de control. Para evitar este problema, habilite manualmente la opción slave_preserve_commit_order en ApsaraDB RDS for MySQL.

PolarDB for MySQL límites

Las tablas de origen CDC de MySQL no permiten leer datos de clústeres con arquitectura Multi-master Cluster de PolarDB for MySQL V1.0.19 y versiones anteriores. Para obtener más información, consulte What is a Multi-master Cluster?. Los registros binarios generados por estos clústeres pueden contener identificadores de tabla duplicados. Esto provoca errores de mapeo de esquemas en la tabla de origen CDC, lo que genera fallos al analizar sintácticamente los datos del registro binario.

MySQL de código abierto límites

De forma predeterminada, MySQL mantiene el orden de las transacciones durante la replicación de registros binarios entre instancias principal y secundaria. Si una réplica de MySQL tiene habilitada la replicación paralela (slave_parallel_workers > 1), pero no tiene habilitada la opción slave_preserve_commit_order=ON, su orden de confirmación de transacciones podría no coincidir con el de la base de datos principal. Cuando Flink CDC se recupera de un punto de control, es posible que omita datos debido a esta secuencia desordenada. Establezca slave_preserve_commit_order = ON en la réplica de MySQL. Como alternativa, establezca slave_parallel_workers = 1, aunque esto reduce el rendimiento de la replicación.

Notas de uso

  • Tabla de origen

    • Durante la fase de lectura de datos completos, no es posible guardar un savepoint, agregar o eliminar una tabla de la tabla de origen y luego reiniciar el trabajo desde ese savepoint. Si ejecuta estas operaciones, el trabajo fallará al leer los datos.

  • Tabla de destino

    • Claves principales de incremento automático: no declare claves principales de incremento automático en la DDL. MySQL las llena automáticamente al escribir datos.

    • Debe declarar como mínimo un campo que no sea clave principal. De lo contrario, se reporta un error.

    • La restricción NOT ENFORCED en la DDL indica que Flink no aplica la validación de la clave principal. Usted es responsable de garantizar la exactitud e integridad de dicha clave. Para obtener más información, consulte Comprobación de validez.

  • Tabla de dimensiones

    Si desea usar un índice para acelerar las consultas, el orden de los campos en la cláusula JOIN debe coincidir con el definido en el índice. Esto se basa en la regla del prefijo más a la izquierda. Por ejemplo, si el índice es (a, b, c), la condición JOIN es ON t.a = x AND t.b = y.

    El optimizador puede reescribir el SQL generado por Flink. Esto impide que se utilice el índice durante la consulta real a la base de datos. Para confirmar si se usa el índice, revise el plan de ejecución (EXPLAIN) o el registro de consultas lentas en MySQL y verifique la instrucción SELECT que realmente se ejecutó.

SQL

Puede usar el conector de MySQL en trabajos SQL como tabla de origen, tabla de dimensiones o tabla de destino.

Sintaxis

CREATE TEMPORARY TABLE mysqlcdc_source (
   order_id INT,
   order_date TIMESTAMP(0),
   customer_name STRING,
   price DECIMAL(10, 5),
   product_id INT,
   order_status BOOLEAN,
   PRIMARY KEY(order_id) NOT ENFORCED
) WITH (
  'connector' = 'mysql',
  'hostname' = '<yourHostname>',
  'port' = '3306',
  'username' = '<yourUsername>',
  'password' = '<yourPassword>',
  'database-name' = '<yourDatabaseName>',
  'table-name' = '<yourTableName>'
);

Nota
  • Al escribir en una tabla de destino, el conector construye y ejecuta una instrucción SQL por cada registro de datos recibido. La instrucción tiene la siguiente estructura:

    • Para una tabla de destino sin clave principal, se ejecuta una instrucción INSERT INTO table_name (column1, column2, ...) VALUES (value1, value2, ...);.

    • Para una tabla de destino con clave principal, se ejecuta una instrucción INSERT INTO table_name (column1, column2, ...) VALUES (value1, value2, ...) ON DUPLICATE KEY UPDATE column1 = VALUES(column1), column2 = VALUES(column2), ...;. Nota: si la tabla física tiene una restricción de índice único distinta de la clave principal, insertar dos registros con claves principales diferentes pero el mismo valor de índice único genera un conflicto de índice único. Esto provoca que los datos se sobrescriban y se pierdan.

  • Si la base de datos de MySQL define una clave principal de incremento automático, no declare el campo correspondiente en la DDL de Flink. La base de datos llena este campo automáticamente al escribir datos. El conector permite escribir y eliminar datos con campos de incremento automático, pero no admite actualizarlos.

Parámetros WITH

  • General

    Parámetro

    Descripción

    Obligatorio

    Tipo de dato

    Valor predeterminado

    Notas

    connector

    El tipo de tabla.

    Sí

    STRING

    Ninguna

    Cuando se usa como tabla de origen, establezca este parámetro en mysql-cdc o mysql. Ambos valores son equivalentes. Si la utiliza como tabla de dimensiones o tabla de destino, el valor debe ser mysql.

    hostname

    La dirección IP o el nombre de host de la base de datos MySQL.

    Sí

    STRING

    Ninguna

    Se recomienda especificar una dirección de red privada virtual (VPC).

    Nota

    Si la base de datos MySQL y Realtime Compute for Apache Flink no están en la misma VPC, debe establecer una conexión de red entre distintas VPC o usar un endpoint público para acceder a la base de datos. Para obtener más información, consulte Manage and operate workspaces y How can a fully managed Flink cluster access the Internet?.

    username

    El nombre de usuario del servicio de base de datos MySQL.

    Sí

    STRING

    Ninguna

    Ninguna.

    password

    La contraseña del servicio de base de datos MySQL.

    Sí

    STRING

    Ninguna

    Ninguna.

    database-name

    El nombre de la base de datos MySQL.

    Sí

    STRING

    Ninguna

    • Cuando se utiliza una base de datos como tabla de origen, puede usar una expresión regular en el nombre de la base de datos para leer datos de varias bases de datos.

    • Al usar expresiones regulares, no utilice los símbolos ^ ni $ para coincidir con el inicio y el final de la cadena. Para obtener más información, consulte las notas del parámetro table-name.

    table-name

    El nombre de la tabla MySQL.

    Sí

    STRING

    Ninguna

    • Puede usar una expresión regular en el nombre de la tabla de origen para leer datos de varias tablas.

    • Al usar expresiones regulares, no utilice los símbolos ^ ni $ para coincidir con el inicio y el final de la cadena. Para obtener más información, consulte la siguiente nota.

    Nota

    Cuando una tabla de origen MySQL CDC coincide con nombres de tablas mediante una expresión regular, concatena los valores de database-name y table-name que usted especifique con la cadena \\. para formar una expresión regular de ruta completa. Antes de VVR 8.0.1, se usaba el carácter .. Después, el conector utiliza esta expresión regular para coincidir con los nombres completos de las tablas en la base de datos MySQL.

    Por ejemplo, si establece 'database-name'='db_.' y 'table-name'='tb_.+', el conector usa la expresión regular db_.\\.tb_.+ para coincidir con los nombres completos de las tablas y determinar cuáles leer. Antes de VVR 8.0.1, la expresión regular era db_.*.tb_.+.

    port

    El número de puerto del servicio de base de datos MySQL.

    No

    INTEGER

    3306

    Ninguna.

  • Solo tabla de origen

    Parámetro

    Descripción

    Obligatorio

    Tipo de dato

    Valor predeterminado

    Notas

    server-id

    Identificador numérico del cliente de la base de datos.

    No

    STRING

    Se genera un valor aleatorio entre 5400 y 6400.

    Este identificador debe ser único a nivel global dentro del clúster de MySQL. Establezca un identificador distinto para cada trabajo que se conecte a la misma base de datos.

    Este parámetro también admite un formato de rango de identificadores, por ejemplo, 5400-5408. Cuando se habilita la lectura incremental, se admite la lectura concurrente. En este caso, establezca un rango de identificadores para que cada lector concurrente utilice uno distinto. Para obtener más información, consulte Use Server ID.

    scan.incremental.snapshot.enabled

    Indica si se habilitan las instantáneas incrementales.

    No

    BOOLEAN

    true

    Las instantáneas incrementales están habilitadas de forma predeterminada. Este es un mecanismo nuevo para leer instantáneas de datos completos. En comparación con el método anterior de lectura de instantáneas, ofrece varias ventajas, entre ellas:

    • El origen puede leer los datos completos en paralelo.

    • El origen admite puntos de control a nivel de fragmento durante la lectura de datos completos.

    • El origen no necesita adquirir un bloqueo de lectura global (FLUSH TABLES WITH read lock) al leer los datos completos.

    Si desea que el origen admita lectura concurrente, cada lector requiere un identificador de servidor único. Por lo tanto, server-id debe definirse como un rango, por ejemplo, 5400-6400, y su tamaño debe ser mayor o igual que el nivel de concurrencia.

    Nota

    Este elemento de configuración se eliminó en Ververica Runtime (VVR) 11.1 y versiones posteriores.

    scan.incremental.snapshot.chunk.size

    Tamaño de cada fragmento, expresado en número de filas.

    No

    INTEGER

    8096

    Cuando se habilita la lectura de instantáneas incrementales, la tabla se divide en varios fragmentos para su lectura. Los datos de un fragmento se almacenan en caché en memoria hasta que se leen por completo.

    Cuantas menos filas contenga cada fragmento, mayor será el número total de fragmentos en la tabla. Aunque esto mejora la granularidad de la recuperación ante errores, puede provocar errores de falta de memoria (OOM) y reducir el rendimiento general. Por lo tanto, evalúe ambos factores y establezca un tamaño de fragmento adecuado.

    scan.snapshot.fetch.size

    Número máximo de registros que se extraen a la vez al leer los datos completos de una tabla.

    No

    INTEGER

    1024

    Ninguna.

    scan.startup.mode

    Modo de inicio para el consumo de datos.

    No

    STRING

    initial

    Valores válidos:

    • initial (predeterminado): en el primer inicio o en un inicio sin estado, el conector examina todos los datos históricos y luego lee los datos más recientes del registro binario.

    • latest-offset: en el primer inicio o en un inicio sin estado, el conector no examina los datos históricos. Comienza a leer desde el final del registro binario, por lo que solo procesa los cambios más recientes generados después de su arranque.

    • earliest-offset: el conector no examina los datos históricos. Inicia la lectura desde el registro binario disponible más antiguo.

    • specific-offset: el conector no examina los datos históricos. Comienza desde un desplazamiento específico del registro binario. Puede especificar el desplazamiento mediante la configuración conjunta de scan.startup.specific-offset.file y scan.startup.specific-offset.pos, o bien configurar únicamente scan.startup.specific-offset.gtid-set para iniciar desde un conjunto GTID específico.

    • timestamp: el conector no examina los datos históricos. Inicia la lectura del registro binario desde una marca de tiempo específica, definida en milisegundos mediante scan.startup.timestamp-millis.

    Importante

    Cuando utilice los modos de inicio earliest-offset, specific-offset o timestamp, asegúrese de que el esquema de la tabla correspondiente no cambie entre la posición de consumo del registro binario indicada y el momento de inicio del trabajo. Esto evita errores por discrepancias de esquema.

    scan.startup.specific-offset.file

    Nombre del archivo de registro binario que define el desplazamiento inicial cuando se utiliza el modo de inicio specific-offset.

    No

    STRING

    Ninguno

    Al usar este parámetro, debe establecer scan.startup.mode en specific-offset. Ejemplo de formato de nombre de archivo: mysql-bin.000003.

    scan.startup.specific-offset.pos

    Desplazamiento dentro del archivo de registro binario indicado que define la posición inicial cuando se utiliza el modo de inicio specific-offset.

    No

    INTEGER

    Ninguno

    Al usar este parámetro, debe establecer scan.startup.mode en specific-offset.

    scan.startup.specific-offset.gtid-set

    Conjunto GTID que define el desplazamiento inicial cuando se utiliza el modo de inicio specific-offset.

    No

    STRING

    Ninguno

    Al usar este parámetro, debe establecer scan.startup.mode en specific-offset. Ejemplo de formato de conjunto GTID: 24DA167-0C0C-11E8-8442-00059A3C7B00:1-19.

    scan.startup.timestamp-millis

    Marca de tiempo en milisegundos que define el desplazamiento inicial cuando se utiliza el modo de inicio timestamp.

    No

    LONG

    Ninguno

    Al usar este parámetro, debe establecer scan.startup.mode en timestamp. La unidad de la marca de tiempo es milisegundos.

    Importante

    Cuando se especifica una hora, MySQL CDC intenta leer el evento inicial de cada archivo de registro binario para determinar su marca de tiempo. Después, localiza el archivo correspondiente a la hora indicada. Asegúrese de que el archivo de registro binario asociado a dicha marca de tiempo no se haya eliminado de la base de datos y esté disponible para su lectura.

    server-time-zone

    Zona horaria de sesión que utiliza la base de datos.

    No

    STRING

    Si no especifica este parámetro, el sistema utiliza la zona horaria del entorno de ejecución del trabajo de Flink como zona horaria del servidor de la base de datos. Esta corresponde a la zona horaria de la región seleccionada.

    Ejemplo: Asia/Shanghai. Este parámetro controla cómo se convierte el tipo TIMESTAMP de MySQL al tipo STRING. Para obtener más información, consulte Debezium temporal values.

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

    Cuando el número de filas de una tabla supera este valor, se utiliza el modo de lectura por lotes.

    No

    INTEGER

    1000

    Flink lee los datos de una tabla de origen de MySQL de una de las siguientes maneras:

    • Lectura completa: carga directamente en memoria todos los datos de la tabla. Este método es rápido, pero consume una cantidad proporcional de memoria. Si la tabla de origen es muy grande, existe riesgo de errores OOM.

    • Lectura por lotes: procesa los datos en varios lotes, con una cantidad determinada de filas por lote, hasta completar la lectura. Evita los riesgos de OOM en tablas grandes, aunque resulta más lento.

    connect.timeout

    Tiempo máximo de espera antes de que expire la conexión con el servidor de la base de datos MySQL y se intente de nuevo.

    No

    DURATION

    30s

    Ninguna.

    connect.max-retries

    Número máximo de reintentos tras un error de conexión con el servicio de base de datos MySQL.

    No

    INTEGER

    3

    Ninguna.

    connection.pool.size

    Tamaño del pool de conexiones de la base de datos.

    No

    INTEGER

    20

    El pool de conexiones permite reutilizarlas, lo que reduce la cantidad total de conexiones a la base de datos.

    jdbc.properties.*

    Parámetros de conexión personalizados en la URL de JDBC.

    No

    STRING

    Ninguno

    Puede pasar parámetros de conexión personalizados. Por ejemplo, para no utilizar el protocolo SSL, configure 'jdbc.properties.useSSL' = 'false'.

    Para obtener más información sobre los parámetros de conexión compatibles, consulte MySQL Configuration Properties.

    debezium.*

    Parámetros personalizados para que Debezium lea los registros binarios.

    No

    STRING

    Ninguno

    Puede pasar parámetros personalizados de Debezium. Por ejemplo, utilice 'debezium.event.deserialization.failure.handling.mode'='ignore' para definir la lógica de manejo de errores de análisis sintáctico.

    Aviso

    No modifique los parámetros de Debezium de forma arbitraria, ya que esto podría provocar que el conector lea los datos de manera incorrecta. Por ejemplo, no se permite configurar el parámetro debezium.binlog.buffer.size.

    heartbeat.interval

    Intervalo con el que el origen avanza el desplazamiento del registro binario mediante eventos de latido.

    No

    DURATION

    30s

    Los eventos de latido permiten avanzar el desplazamiento del registro binario en el origen. Resultan especialmente útiles para las tablas de MySQL que se actualizan con poca frecuencia, ya que en esos casos el desplazamiento no avanza de forma automática. Estos eventos empujan el desplazamiento hacia adelante y evitan problemas derivados de su expiración. Un desplazamiento expirado puede hacer que el trabajo falle de manera irrecuperable y requiera un reinicio sin estado.

    scan.incremental.snapshot.chunk.key-column

    Define la columna que se utilizará para dividir los datos en fragmentos durante la fase de instantánea.

    Consulte la columna Notas.

    STRING

    Ninguno

    • Obligatorio para tablas sin clave primaria. La columna seleccionada debe ser de un tipo no nulo (NOT NULL).

    • Opcional para tablas con clave primaria. Solo se puede seleccionar una columna de dicha clave.

    rds.region-id

    Identificador de la región de la instancia de Alibaba Cloud ApsaraDB RDS for MySQL.

    Obligatorio cuando se utiliza la función de lectura de registros archivados desde OSS.

    STRING

    Ninguno

    Para obtener más información sobre los identificadores de región, consulte Regions and zones.

    Importante

    La cadena GTID de MySQL CDC se genera de forma aleatoria y no aumenta de manera monótona como los desplazamientos de los archivos de registro binario. Por ello, localizar un GTID en un archivo exige descargar y analizar sintácticamente todos los registros archivados de OSS. Este proceso consume muchos recursos y tiempo, lo que hace inviables las funciones basadas en desplazamientos GTID. En consecuencia, la función de registros archivados de OSS solo admite iniciar desde una marca de tiempo específica o desde un desplazamiento concreto del archivo de registro binario. No permite comenzar desde un GTID determinado ni admite escenarios con conmutaciones entre nodos primario y secundario en los registros archivados, ya que dichas conmutaciones en MySQL dependen de los GTID. Evalúe detenidamente esta función antes de utilizarla.

    rds.access-key-id

    AccessKey ID de la cuenta de Alibaba Cloud ApsaraDB RDS for MySQL.

    Obligatorio cuando se utiliza la función de lectura de registros archivados desde OSS.

    STRING

    Ninguno

    Para obtener más información, consulte How do I view the AccessKey ID and AccessKey secret?.

    Importante

    Para evitar que se filtre su información de AccessKey, utilice la función de gestión de secretos al especificar el AccessKey ID. Para obtener más información, consulte Manage variables.

    rds.access-key-secret

    AccessKey secret de la cuenta de Alibaba Cloud ApsaraDB RDS for MySQL.

    Obligatorio cuando se utiliza la función de lectura de registros archivados desde OSS.

    STRING

    Ninguno

    Para obtener más información, consulte How do I view the AccessKey ID and AccessKey secret?

    Importante

    Para evitar que se filtre su información de AccessKey, utilice la función de gestión de secretos al especificar el AccessKey secret. Para obtener más información, consulte Manage variables.

    rds.db-instance-id

    Identificador de la instancia de Alibaba Cloud ApsaraDB RDS for MySQL.

    Obligatorio cuando se utiliza la función de lectura de registros archivados desde OSS.

    STRING

    Ninguno

    Ninguna.

    rds.main-db-id

    Número de la base de datos principal de la instancia de Alibaba Cloud ApsaraDB RDS for MySQL.

    No

    STRING

    Ninguno

    • Para obtener más información sobre cómo consultar el número de la base de datos principal, consulte ApsaraDB RDS for MySQL log backup.

    • Compatible únicamente con VVR 8.0.7 y versiones posteriores.

    Nota

    Si no se especifica este parámetro, VVR 11.1 y versiones posteriores consultan automáticamente el número de la base de datos principal a partir de la información de conexión de ApsaraDB RDS for MySQL.

    rds.download.timeout

    Tiempo de espera máximo para descargar un registro archivado individual desde OSS.

    No

    DURATION

    60s

    Ninguna.

    rds.endpoint

    Endpoint del servicio para obtener la información de registros binarios de OSS.

    No

    STRING

    Ninguno

    • Para obtener más información sobre los valores válidos, consulte Endpoints.

    • Compatible únicamente con VVR 8.0.8 y versiones posteriores.

    scan.incremental.close-idle-reader.enabled

    Indica si se cierran los lectores inactivos una vez completada la instantánea.

    No

    BOOLEAN

    false

    • Compatible únicamente con VVR 8.0.1 y versiones posteriores.

    • Para que esta configuración surta efecto, debe establecer execution.checkpointing.checkpoints-after-tasks-finish.enabled en true.

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

    Indica si se convierte el flujo de datos de registro de cambios en un flujo de solo adición.

    No

    BOOLEAN

    false

    Valores válidos:

    • true: todos los tipos de mensajes, incluidos INSERT, DELETE, UPDATE_BEFORE y UPDATE_AFTER, se convierten en mensajes INSERT. Habilite esta opción únicamente en escenarios especiales, por ejemplo, cuando necesite conservar los mensajes de eliminación de la tabla ascendente.

    • false (predeterminado): todos los tipos de mensajes se envían al destino descendente tal como se reciben.

    Nota

    Compatible únicamente con VVR 8.0.8 y versiones posteriores.

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

    En la fase incremental, indica si se analizan sintácticamente solo los eventos de cambio de las tablas especificadas.

    No

    BOOLEAN

    • El valor predeterminado es false en las versiones VVR 8.x.

    • El valor predeterminado es true en VVR 11.1 y versiones posteriores.

    Valores válidos:

    • true: analiza sintácticamente solo los datos de cambio de las tablas de destino para acelerar la lectura del registro binario.

    • false (predeterminado): analiza sintácticamente los datos de cambio de todas las tablas.

    Nota
    • Compatible únicamente con VVR 8.0.7 y versiones posteriores.

    • Si utiliza VVR 8.0.8 o una versión anterior, debe cambiar el nombre del parámetro a debezium.scan.only.deserialize.captured.tables.changelog.enable.

    scan.parse.online.schema.changes.enabled

    En la fase incremental, indica si se intenta analizar sintácticamente los eventos DDL de cambio sin bloqueo de RDS.

    No

    BOOLEAN

    false

    Valores válidos:

    • true: analiza sintácticamente los eventos DDL de cambio sin bloqueo de RDS.

    • false (predeterminado): no analiza sintácticamente los eventos DDL de cambio sin bloqueo de RDS.

    Esta es una función experimental. Antes de aplicar un cambio sin bloqueo en línea, tome una instantánea del trabajo de Flink para poder recuperarlo.

    Nota

    Compatible únicamente con VVR 11.1 y versiones posteriores.

    scan.incremental.snapshot.backfill.skip

    Indica si se omite el rellenado retrospectivo durante la fase de lectura de la instantánea.

    No

    BOOLEAN

    false

    Valores válidos:

    • true: omite el rellenado retrospectivo durante la fase de lectura de la instantánea.

    • false (predeterminado): no omite el rellenado retrospectivo durante la fase de lectura de la instantánea.

    El rellenado retrospectivo se aplica únicamente durante la consulta de instantánea de un fragmento individual y no abarca toda la fase de lectura completa. Cuando se omite, la consulta de instantánea de cada fragmento lee los datos más recientes de la tabla en ese instante. Las actualizaciones que ocurren en un fragmento después de haberse leído no se combinan durante la fase de lectura completa; se leen desde el registro binario una vez iniciada la fase incremental. Por ejemplo, una actualización en chunk5 que ocurra mientras se toma su instantánea se refleja directamente en ella. Sin embargo, si chunk5 se actualiza después de que el lector haya avanzado a chunk80, el cambio se aplicará más tarde desde el registro binario durante la fase incremental.

    Importante

    Cuando esta opción está habilitada, los cambios que ocurren durante o después del examen de un fragmento se entregan igualmente desde el registro binario en la fase incremental y podrían duplicarse. Solo se garantiza la semántica at-least-once. Habilítela únicamente cuando el destino descendente admita escrituras idempotentes por clave primaria.

    Nota

    Compatible únicamente con VVR 11.1 y versiones posteriores.

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

    Indica si se asignan primero los fragmentos ilimitados durante la fase de lectura de la instantánea.

    No

    BOOELEAN

    false

    Valores válidos:

    • true: asigna primero los fragmentos ilimitados durante la fase de lectura de la instantánea.

    • false (predeterminado): no asigna primero los fragmentos ilimitados durante la fase de lectura de la instantánea.

    Esta es una función experimental. Habilitarla reduce el riesgo de errores OOM en TaskManager al sincronizar el último fragmento durante la fase de instantánea. Agregue este parámetro antes del primer inicio del trabajo.

    Nota

    Compatible únicamente con VVR 11.1 y versiones posteriores.

    binlog.session.network.timeout

    Tiempo de espera de lectura y escritura de red para la conexión del registro binario.

    No

    DURATION

    10m

    Si se establece en 0s, se utiliza el tiempo de espera predeterminado del servidor de MySQL.

    Nota

    Compatible únicamente con VVR 11.5 y versiones posteriores.

    scan.rate-limit.records-per-second

    Limita el número máximo de registros que el origen envía por segundo.

    No

    LONG

    Ninguno

    Útil para escenarios donde se necesita limitar la lectura de datos. Este límite se aplica tanto en la fase completa como en la incremental.

    La métrica numRecordsOutPerSecond del origen refleja la cantidad de registros que emite todo el flujo de datos por segundo. Puede ajustar este parámetro tomando como referencia dicha métrica.

    Durante la fase de lectura de datos completos, normalmente conviene reducir el número de filas leídas en cada lote. Para ello, disminuya el valor del parámetro scan.incremental.snapshot.chunk.size.

    Nota

    Compatible únicamente con VVR 11.5 y versiones posteriores.

    scan.binlog.tolerate.gtid-holes

    Habilitar este parámetro permite ignorar los vacíos en la secuencia GTID, de modo que el trabajo omita los eventos discontinuos y continúe ejecutándose.

    No

    BOOLEAN

    false

    Antes de habilitar este parámetro, asegúrese de que el desplazamiento inicial del trabajo no haya expirado. Si el trabajo comienza desde un desplazamiento GTID eliminado o expirado, el motor omitirá silenciosamente los registros faltantes, lo que provocará pérdida de datos.

    Nota

    Este parámetro es compatible únicamente con VVR 11.6 y versiones posteriores.

    scan.filter-unchanged-row.enabled

    Indica si se filtran los eventos de cambio de los campos que no se utilizan en la instrucción SQL.

    No

    BOOLEAN

    false

    Si establece este parámetro en true, una tabla de origen CDC comparará únicamente las columnas referenciadas en la instrucción SQL cuando reciba un evento UPDATE. Si los valores de dichas columnas no cambian, el evento no se enviará al destino descendente. Este parámetro resulta útil en escenarios JOIN de múltiples flujos. Cuando una tabla ascendente actualiza un campo no referenciado en la instrucción SQL, no se generan eventos DELETE e INSERT innecesarios. Esto reduce la amplificación de datos y la fluctuación de resultados en los operadores descendentes.

    Nota

    Este parámetro es compatible únicamente con VVR 11.8 y versiones posteriores.

    scan.projection-pushdown.enabled

    Indica si se habilita la inserción de proyecciones (projection pushdown).

    No

    BOOLEAN

    false

    Si establece este parámetro en true, una tabla de origen CDC analizará y transmitirá únicamente las columnas referenciadas en la instrucción SQL. Las columnas no referenciadas no se serializan ni se envían por la red, lo que reduce la sobrecarga de E/S y de cómputo. Este parámetro funciona mejor si se combina con scan.filter-unchanged-row.enabled. La inserción de proyecciones reduce primero el volumen de datos y, después, se filtran las filas sin cambios para aligerar aún más la carga de procesamiento en los operadores descendentes.

    Nota

    Este parámetro es compatible únicamente con VVR 11.8 y versiones posteriores.

  • Parámetros específicos de tablas de dimensiones

    Parámetro

    Descripción

    Obligatorio

    Tipo de datos

    Valor predeterminado

    Notas

    url

    La URL JDBC de MySQL.

    No

    STRING

    Ninguna

    El formato de la URL es: jdbc:mysql://<endpoint>:<port>/<database_name>.

    lookup.max-retries

    Número máximo de reintentos después de una lectura de datos con errores.

    No

    INTEGER

    3

    Compatible solo con VVR 6.0.7 y versiones posteriores.

    lookup.cache.strategy

    Política de caché.

    No

    STRING

    Ninguna

    Las políticas de caché compatibles son None, LRU y ALL. Para obtener más información sobre los valores, consulte Dimension table JOIN statements.

    Nota

    Cuando utilice la política de caché LRU, también debe configurar el parámetro lookup.cache.max-rows.

    lookup.cache.max-rows

    Número máximo de filas almacenadas en la caché.

    No

    INTEGER

    100000

    • Si selecciona la política de caché LRU, debe establecer el tamaño de la caché.

    • Si selecciona la política de caché ALL, no necesita establecer el tamaño de la caché.

    lookup.cache.ttl

    Tiempo de vida (TTL) de la caché.

    No

    DURATION

    10 s

    La configuración de lookup.cache.ttl depende de lookup.cache.strategy:

    • Si lookup.cache.strategy se establece en None, no necesita configurar lookup.cache.ttl. Esto significa que la caché no caduca.

    • Si lookup.cache.strategy se establece en LRU, lookup.cache.ttl representa el TTL de la caché. De forma predeterminada, la caché no caduca.

    • Si lookup.cache.strategy se establece en ALL, lookup.cache.ttl indica el tiempo de carga de la caché. De forma predeterminada, la caché no se vuelve a cargar.

    Utilice un formato de tiempo, por ejemplo, 1min o 10s.

    lookup.max-join-rows

    Número máximo de resultados devueltos cuando un registro de la tabla principal coincide con registros de la tabla de dimensiones.

    No

    INTEGER

    1024

    Ninguna.

    lookup.filter-push-down.enabled

    Especifica si se habilita el pushdown de filtros para la tabla de dimensiones.

    No

    BOOLEAN

    false

    Valores válidos:

    • true: habilita el pushdown de filtros para la tabla de dimensiones. Al cargar datos desde la tabla de la base de datos MySQL, la tabla de dimensiones filtra los datos previamente según las condiciones establecidas en el trabajo SQL.

    • false (predeterminado): deshabilita el pushdown de filtros para la tabla de dimensiones. Al cargar datos desde la tabla de la base de datos MySQL, la tabla de dimensiones carga todos los datos.

    Nota

    Compatible solo con VVR 8.0.7 y versiones posteriores.

    Importante

    El pushdown de la tabla de dimensiones solo debe habilitarse cuando una tabla de Flink se utiliza como tabla de dimensiones. Las tablas de origen de MySQL no admiten habilitar el pushdown de filtros. Si una tabla de Flink se usa tanto como tabla de origen como de dimensiones, y se habilita el pushdown de filtros para la tabla de dimensiones, debe establecer explícitamente este elemento de configuración en false para la tabla de origen mediante SQL Hints. De lo contrario, el trabajo podría ejecutarse de forma anómala.

    lookup.cache.cache-empty

    Especifica si se almacenan en la caché los resultados de consulta vacíos.

    No

    BOOLEAN

    true

    Surte efecto únicamente cuando la política de caché es LRU. Valores válidos:

    • true (predeterminado): si una consulta no devuelve datos, se almacena un resultado vacío en la caché y se devuelve directamente para las consultas posteriores.

    • false: si una consulta no devuelve datos, no se almacena ningún resultado en la caché y la siguiente consulta vuelve a buscar los datos.

    Nota

    Este parámetro es compatible solo con VVR 11.9.0 y versiones posteriores.

  • Solo para tablas sink

    Parámetro

    Descripción

    Obligatorio

    Tipo de datos

    Valor predeterminado

    Notas

    url

    La URL JDBC de MySQL.

    No

    STRING

    Ninguna

    El formato de la URL es: jdbc:mysql://<endpoint>:<port>/<database_name>.

    sink.max-retries

    Número máximo de reintentos después de una escritura de datos con errores.

    No

    INTEGER

    3

    Ninguna.

    sink.buffer-flush.batch-size

    Número de filas en una sola escritura por lotes.

    No

    INTEGER

    4096

    Ninguna.

    sink.buffer-flush.max-rows

    Número de filas de datos almacenadas en la memoria.

    No

    INTEGER

    10000

    Este parámetro surte efecto únicamente después de especificar una clave principal.

    sink.buffer-flush.interval

    Intervalo para vaciar la caché. Si los datos almacenados no cumplen las condiciones de salida tras el tiempo de espera especificado, el sistema envía automáticamente todos los datos de la caché.

    No

    DURATION

    1s

    Ninguna.

    sink.ignore-delete

    Especifica si se ignoran las operaciones DELETE de datos.

    No

    BOOLEAN

    false

    Cuando el flujo generado por Flink SQL incluye registros de tipo delete o update-before, pueden producirse inconsistencias de datos si varias tareas de salida actualizan simultáneamente distintos campos de la misma tabla.

    Por ejemplo, si después de eliminar un registro otra tarea actualiza solo algunos campos, los campos no actualizados quedarán como null o con sus valores predeterminados, lo que provocará errores en los datos.

    Al establecer sink.ignore-delete en true, puede ignorar las operaciones DELETE y UPDATE_BEFORE del flujo de entrada para evitar estos problemas.

    Nota
    • UPDATE_BEFORE forma parte del mecanismo de retracción de Flink y se utiliza para "retractar" el valor anterior durante una operación de actualización.

    • Cuando ignoreDelete = true, se omiten todos los registros de tipo DELETE y UPDATE_BEFORE. Solo se procesan los registros INSERT y UPDATE_AFTER.

    sink.ignore-delete-mode

    Estrategia para gestionar los registros de tipo delete después de ignorar las operaciones DELETE.

    No

    STRING

    ALL

    Valores válidos:

    • ALL: ignora tanto los registros -D como los -U.

    • REAL_DELETE: ignora únicamente los registros -D.

    • UPDATE_BEFORE: ignora únicamente los registros -U.

    Nota
    • Esta opción es compatible solo con el motor Realtime Compute VVR 11.8 y versiones posteriores.

    • Surte efecto únicamente cuando sink.ignore-delete=true. Configurarla de forma aislada genera un error.

    sink.ignore-null-when-update

    Al actualizar datos, especifica si el campo correspondiente se establece en null o si se omite su actualización cuando el valor del campo entrante es null.

    No

    BOOLEAN

    false

    Valores válidos:

    • true: no actualiza el campo. Este parámetro solo puede establecerse en true cuando la tabla de Flink tiene definida una clave principal. Cuando se establece en true:

      • En VVR 8.0.6 y versiones anteriores, la tabla sink no admite escritura por lotes.

      • En VVR 8.0.7 y versiones posteriores, la tabla sink admite escritura por lotes.

        La escritura por lotes mejora significativamente la eficiencia de escritura y el rendimiento general, pero introduce latencia en los datos y riesgo de errores OOM. Por lo tanto, debe evaluar esta compensación según su escenario de negocio.

    • false: actualiza el campo a null.

    Nota

    Este parámetro es compatible solo con VVR 8.0.5 y versiones posteriores.

    sink.force-batch-on-non-primary-table

    Especifica si se almacenan en búfer los registros de forma obligatoria para insertarlos por lotes mediante JDBC Batch al escribir datos en una tabla sink de MySQL sin clave principal.

    No

    BOOLEAN

    false

    Este parámetro surte efecto únicamente en tablas sin clave principal. Si lo establece en true, los eventos DELETE y UPDATE_BEFORE se descartan silenciosamente, mientras que los eventos INSERT y UPDATE_AFTER se escriben por lotes como instrucciones INSERT. Se recomienda habilitar este parámetro solo si los datos son de tipo append-only o si la semántica descrita le resulta aceptable.

    Nota
    • Este parámetro es compatible solo con VVR 11.8 y versiones posteriores.

    • Habilite este parámetro únicamente si los datos son de tipo append-only o si la semántica descrita le resulta aceptable. De lo contrario, los datos podrían volverse inconsistentes.

Mapeo de tipos

  • Tablas de origen CDC

    Tipo de campo de MySQL CDC

    Tipo de campo de Flink

    TINYINT

    TINYINT

    SMALLINT

    SMALLINT

    TINYINT UNSIGNED

    TINYINT UNSIGNED ZEROFILL

    INT

    INT

    MEDIUMINT

    SMALLINT UNSIGNED

    SMALLINT UNSIGNED ZEROFILL

    BIGINT

    BIGINT

    INT UNSIGNED

    INT UNSIGNED ZEROFILL

    MEDIUMINT UNSIGNED

    MEDIUMINT UNSIGNED ZEROFILL

    BIGINT UNSIGNED

    DECIMAL(20, 0)

    BIGINT UNSIGNED ZEROFILL

    SERIAL

    FLOAT [UNSIGNED] [ZEROFILL]

    FLOAT

    DOUBLE [UNSIGNED] [ZEROFILL]

    DOUBLE

    DOUBLE PRECISION [UNSIGNED] [ZEROFILL]

    REAL [UNSIGNED] [ZEROFILL]

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

    DECIMAL(p, s)

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

    BOOLEAN

    BOOLEAN

    TINYINT(1)

    DATE

    DATE

    TIME [(p)]

    TIME [(p)] [WITHOUT TIME ZONE]

    DATETIME [(p)]

    TIMESTAMP [(p)] [WITHOUT TIME ZONE]

    TIMESTAMP [(p)]

    TIMESTAMP [(p)]

    TIMESTAMP [(p)] WITH LOCAL TIME ZONE

    CHAR(n)

    STRING

    VARCHAR(n)

    TEXT

    BINARY

    BYTES

    VARBINARY

    BLOB

    Importante

    No utilice el tipo TINYINT(1) en MySQL para almacenar valores distintos de 0 y 1. Cuando property-version=0, la tabla de origen de MySQL CDC asigna TINYINT(1) al tipo BOOLEAN en Flink de forma predeterminada. Esto puede provocar imprecisiones en los datos. Para usar el tipo TINYINT(1) con valores distintos de 0 y 1, consulte el parámetro de configuración catalog.table.treat-tinyint1-as-boolean.

  • Tablas de dimensiones y tablas sink

    Tipo de campo de MySQL

    Tipo de campo de Flink

    TINYINT

    TINYINT

    SMALLINT

    SMALLINT

    TINYINT UNSIGNED

    INT

    INT

    MEDIUMINT

    SMALLINT UNSIGNED

    BIGINT

    BIGINT

    INT UNSIGNED

    BIGINT UNSIGNED

    DECIMAL(20, 0)

    FLOAT

    FLOAT

    DOUBLE

    DOUBLE

    DOUBLE PRECISION

    NUMERIC(p, s)

    DECIMAL(p, s)

    Nota

    donde p <= 38.

    DECIMAL(p, s)

    BOOLEAN

    BOOLEAN

    TINYINT(1)

    DATE

    DATE

    TIME [(p)]

    TIME [(p)] [WITHOUT TIME ZONE]

    DATETIME [(p)]

    TIMESTAMP [(p)] [WITHOUT TIME ZONE]

    TIMESTAMP [(p)]

    CHAR(n)

    CHAR(n)

    VARCHAR(n)

    VARCHAR(n)

    BIT(n)

    BINARY(⌈n/8⌉)

    BINARY(n)

    BINARY(n)

    VARBINARY(N)

    VARBINARY(N)

    TINYTEXT

    STRING

    TEXT

    MEDIUMTEXT

    LONGTEXT

    TINYBLOB

    BYTES

    Importante

    Flink solo admite registros del tipo BLOB de MySQL cuyo tamaño sea menor o igual a 2,147,483,647 (2^31 - 1) bytes.

    BLOB

    MEDIUMBLOB

    LONGBLOB

Ejemplos de uso

  • Tabla de origen 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;
  • Tabla de dimensiones

    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;
  • Tabla 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;
  • Origen de datos de ingesta

    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

Acerca de las tablas de origen de MySQL CDC

  • Funcionamiento

    Cuando se inicia una tabla de origen de MySQL CDC, escanea toda la tabla, la divide en varios fragmentos según la clave principal y registra el desplazamiento actual del registro binario. Después, la tabla de origen utiliza un algoritmo de instantánea incremental para leer los datos de cada fragmento mediante instrucciones SELECT. El trabajo ejecuta puntos de control periódicos para registrar los fragmentos completados. Si ocurre una conmutación por error, el trabajo continúa leyendo los datos desde los fragmentos incompletos. Una vez leídos todos los fragmentos, el trabajo comienza a leer los registros de cambios incrementales desde el desplazamiento del registro binario que se registró previamente. El trabajo de Flink sigue ejecutando puntos de control periódicos para registrar dicho desplazamiento. Si el trabajo sufre una conmutación por error, reanuda el procesamiento desde el último desplazamiento registrado, lo cual garantiza una semántica exactly-once.

    Para obtener una explicación más detallada del algoritmo de instantánea incremental, consulte MySQL CDC Connector.

  • Metadatos

    Los metadatos resultan útiles en escenarios donde se combinan y sincronizan datos provenientes de bases de datos y tablas fragmentadas. Esto se debe a que, tras la combinación, los equipos de negocio suelen necesitar distinguir la base de datos y la tabla de origen de cada registro. Las columnas de metadatos permiten acceder a la información del nombre de la base de datos y de la tabla de origen. Por lo tanto, es posible combinar fácilmente varias tablas fragmentadas en una sola tabla de destino mediante estas columnas.

    El origen de MySQL CDC admite la sintaxis de columnas de metadatos. A continuación se muestran los metadatos a los que puede acceder mediante dichas columnas.

    Clave de metadatos

    Tipo de metadatos

    Descripción

    database_name

    STRING NOT NULL

    Nombre de la base de datos que contiene la fila.

    table_name

    STRING NOT NULL

    Nombre de la tabla que contiene la fila.

    op_ts

    TIMESTAMP_LTZ(3) NOT NULL

    Hora en que se modificó la fila en la base de datos. Si el registro proviene de los datos históricos de la tabla y no del registro binario, este valor siempre es 0.

    Nota

    Este campo tiene precisión únicamente hasta el segundo.

    op_type

    STRING NOT NULL

    Tipo de cambio de la fila.

    • +I: mensaje INSERT

    • -D: mensaje DELETE

    • -U: mensaje UPDATE_BEFORE

    • +U: mensaje UPDATE_AFTER

    Nota

    Compatible solo con VVR 8.0.7 y versiones posteriores.

    query_log

    STRING NOT NULL

    Permite leer el registro de consultas de MySQL correspondiente a esta fila.

    Nota

    MySQL requiere tener habilitado el parámetro binlog_rows_query_log_events para registrar las consultas.

    A continuación se muestra un ejemplo de código que combina y sincroniza varias tablas orders de múltiples bases de datos fragmentadas en una instancia de MySQL hacia una tabla holo_orders en 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;

    Con base en el código anterior, si establece el parámetro scan.read-changelog-as-append-only.enabled en true dentro de la cláusula WITH, el resultado de salida variará según la configuración de la clave principal de la tabla descendente:

    • Si la clave principal de la tabla descendente es order_id, el resultado de salida contendrá únicamente el último cambio de cada clave principal en la tabla ascendente. Para los datos cuyo último cambio fue una operación de eliminación, verá un registro en la tabla descendente con la misma clave principal y un op_type de -D.

    • Si la clave principal de la tabla descendente está formada por order_id, operation_ts y op_type, el resultado de salida incluirá todos los cambios de cada clave principal en la tabla ascendente.

  • Compatibilidad con expresiones regulares

    La tabla de origen de MySQL CDC permite usar expresiones regulares en el nombre de la tabla o de la base de datos para coincidir con varias tablas o bases de datos. El siguiente ejemplo de código muestra cómo especificar múltiples tablas mediante una expresión 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.
    );

    Las expresiones regulares del ejemplo se explican de la siguiente manera:

    • ^(test).* es un ejemplo de coincidencia por prefijo. Esta expresión coincide con nombres de bases de datos que comienzan con "test", como "test1" o "test2".

    • .*[p$] es un ejemplo de coincidencia por sufijo. Esta expresión coincide con nombres de bases de datos que terminan en "p", como "cdcp" o "edcp".

    • txc es una coincidencia exacta. Coincide únicamente con el nombre de base de datos "txc".

    Cuando MySQL CDC evalúa un nombre de tabla completo, utiliza el patrón database-name.table-name para identificarla de forma única. Por ejemplo, el patrón (^(test).|^(tpc).|txc|.*[p$]|t{2}).(t[ 5-8]|tt) coincide con tablas como txc.tt y test2.test5 en la base de datos.

    Importante

    En la configuración de un trabajo SQL, los parámetros table-name y database-name no admiten el uso de comas (,) para especificar varias tablas o bases de datos.

    • Para coincidir con varias tablas o utilizar múltiples expresiones regulares, sepárelas con una barra vertical (|) y enciérrelas entre paréntesis. Por ejemplo, para leer las tablas user y product, establezca table-name en (user|product).

    • Si una expresión regular contiene una coma, debe reescribirla utilizando el operador de barra vertical (|). Por ejemplo, la expresión regular mytable_\d{1, 2} debe reescribirse como su equivalente (mytable_\d{1}|mytable_\d{2}) para evitar el uso de la coma.

  • Control de concurrencia

    El conector de MySQL admite la lectura multihilo de los datos completos, lo cual mejora la eficiencia de carga. En conjunto con la función de ajuste automático Autopilot de la consola de Realtime Compute for Apache Flink, el conector reduce automáticamente los recursos durante la fase incremental una vez finalizada la lectura multihilo, con el fin de ahorrar capacidad de cómputo.

    En la consola de desarrollo de Realtime Compute for Apache Flink, configure la concurrencia de un trabajo en modo básico o en modo experto desde la página Resource Configuration.

    • La concurrencia configurada en el modo básico corresponde a la concurrencia global de todo el trabajo.

      Por ejemplo, cuando establece parallelism en 8 en el modo básico, configure server-id en la cláusula WITH de SQL como un rango continuo (por ejemplo, '404-412').

    • El modo experto permite configurar la concurrencia de un VERTEX específico según sus necesidades.

    Para obtener más información sobre la configuración de recursos, consulte Configure deployment information for a job.

    Importante

    Independientemente de si usa el modo básico o el modo experto, asegúrese de que el rango de ID de servidor declarado en la tabla sea mayor o igual a la concurrencia del trabajo al momento de configurarla. Por ejemplo, si el rango de ID de servidor es 5404-5412, existen nueve identificadores únicos. Por lo tanto, la concurrencia máxima del trabajo será 9. Los distintos trabajos que apunten a la misma instancia de MySQL no deben tener rangos de ID de servidor superpuestos. Es decir, cada trabajo debe configurarse explícitamente con un ID de servidor o un rango distinto.

  • Reducción automática de escala con Autopilot

    La fase de datos completos acumula una gran cantidad de información histórica. Para mejorar la eficiencia de lectura, estos datos históricos suelen leerse en paralelo. Durante la fase incremental del registro binario, el volumen de datos es menor y se requiere garantizar el orden global, por lo que generalmente basta con una lectura de un solo hilo. La función de ajuste automático equilibra los distintos requerimientos de recursos entre ambas fases para optimizar el rendimiento y el consumo.

    El ajuste automático supervisa el tráfico de cada tarea del origen de MySQL CDC. Al entrar en la fase del registro binario, si solo una tarea se encarga de la lectura y las demás están inactivas, el sistema reduce automáticamente la cantidad de CU y la concurrencia del origen. Para habilitar esta función, establezca el modo de ajuste automático en Active en la página O&M del trabajo.

    Nota

    El intervalo mínimo predeterminado para activar la reducción de concurrencia es de 24 horas. Para obtener más información sobre los parámetros y detalles del ajuste automático, consulte Configure automatic tuning.

  • Modos de inicio

    Utilice el elemento de configuración scan.startup.mode para especificar el modo de inicio de la tabla de origen de MySQL CDC. Las opciones disponibles son las siguientes:

    • initial (predeterminado): en el primer inicio o en un inicio sin estado, realiza una lectura completa de la tabla de la base de datos y luego cambia al modo incremental para leer el registro binario.

    • earliest-offset: omite la fase de instantánea y comienza a leer desde el primer desplazamiento disponible del registro binario.

    • latest-offset: omite la fase de instantánea y comienza a leer desde el final del registro binario. Con este modo, la tabla de origen solo lee los cambios de datos que ocurran después de iniciar el trabajo.

    • specific-offset: omite la fase de instantánea y comienza a leer desde un desplazamiento específico del registro binario. Este desplazamiento se indica mediante el nombre del archivo y la posición del registro binario, o bien mediante un conjunto GTID.

    • timestamp: omite la fase de instantánea y comienza a leer los eventos del registro binario a partir de una marca de tiempo específica.

    Un inicio sin estado no reutiliza ningún estado previo. El conector de origen lo interpreta como un primer inicio, por lo que scan.startup.mode vuelve a aplicarse. Para obtener más información sobre los modos de inicio de despliegue, consulte Start a deployment.

    Ejemplo de uso:

    CREATE TABLE mysql_source (...) WITH (
        'connector' = 'mysql-cdc',
        'scan.startup.mode' = 'earliest-offset', -- Start from the earliest offset.
        'scan.startup.mode' = 'latest-offset', -- Start from the latest offset.
        'scan.startup.mode' = 'specific-offset', -- Start from a specific offset.
        'scan.startup.mode' = 'timestamp', -- Start from a specific timestamp.
        'scan.startup.specific-offset.file' = 'mysql-bin.000003', -- Specify the binary log filename in specific-offset mode.
        'scan.startup.specific-offset.pos' = '4', -- Specify the binary log position in specific-offset mode.
        'scan.startup.specific-offset.gtid-set' = '24DA167-0C0C-11E8-8442-00059A3C7B00:1-19', -- Specify the GTID set in specific-offset mode.
        'scan.startup.timestamp-millis' = '1667232000000' -- Specify the startup timestamp in timestamp mode.
        ...
    )
    Importante
    • El origen de MySQL imprime el desplazamiento actual en el registro con nivel INFO durante un punto de control. El prefijo del registro es Binlog offset on checkpoint {checkpoint-id}. Esta información le ayudará a iniciar un trabajo desde un desplazamiento de punto de control específico.

    • Si la tabla que se lee sufrió cambios de esquema, iniciar desde earliest-offset, specific-offset o timestamp podría generar un error. Esto ocurre porque el lector Debezium guarda internamente el esquema más reciente de la tabla, por lo que no puede analizar correctamente los datos antiguos con un esquema distinto.

  • Acerca de las tablas de origen CDC sin clave principal

    • Para usar una tabla sin clave principal, debe configurar scan.incremental.snapshot.chunk.key-column. Solo es posible seleccionar una columna que no acepte valores nulos.

    • La semántica de procesamiento de una tabla de origen CDC sin clave principal depende del comportamiento de la columna indicada en scan.incremental.snapshot.chunk.key-column:

      • Si la columna especificada no se actualiza, se garantiza la semántica exactly-once.

      • Si la columna especificada se actualiza, solo se garantiza la semántica at-least-once. No obstante, puede asegurar la integridad de los datos si la combina con la capa descendente, define una clave principal en dicha capa y utiliza operaciones idempotentes.

  • Lectura de registros de copia de seguridad de Alibaba Cloud ApsaraDB RDS for MySQL

    La tabla de origen de MySQL CDC admite la lectura de registros de copia de seguridad de Alibaba Cloud ApsaraDB RDS for MySQL. Esta función resulta útil en escenarios donde la fase de datos completos toma mucho tiempo y los archivos locales del registro binario se eliminaron automáticamente, pero aún existen los archivos de copia de seguridad cargados de forma manual o automática.

    Ejemplo 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'
        ...
    )
  • Habilitación de la reutilización del origen CDC

    Dentro de un mismo trabajo, varias tablas de origen de MySQL CDC inician múltiples clientes de registro binario. Si todas las tablas de origen residen en la misma instancia, esto aumenta la carga sobre la base de datos. Para obtener más información, consulte MySQL CDC FAQ.

    Solución

    VVR 8.0.7 y versiones posteriores admiten la reutilización del origen de MySQL CDC. Esta función combina las tablas de origen de MySQL CDC que cumplen con los requisitos necesarios. La combinación ocurre cuando las configuraciones de las tablas de origen son idénticas, excepto por el nombre de la base de datos, el nombre de la tabla y server-id. El motor fusiona automáticamente los orígenes de MySQL CDC dentro del mismo trabajo.

    Procedimiento

    1. Utilice el comando SET en su trabajo 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';
      En VVR 11.1 y versiones posteriores, la reutilización está habilitada de forma predeterminada.
    2. Inicie el trabajo sin estado. Dado que modificar la configuración de reutilización del origen altera la topología del trabajo, debe iniciarlo sin estado. De lo contrario, el trabajo podría fallar al arrancar o podría perder datos. Si se combinó algún origen, verá un nodo MergetableSourceScan en la topología.

    Importante
    • Una vez habilitada la reutilización, no deshabilite el encadenamiento de operadores. Si establece pipeline.operator-chaining en false, aumentará la sobrecarga de serialización y deserialización de datos. Entre más orígenes se combinen, mayor será dicha sobrecarga.

    • En VVR 8.0.7, deshabilitar el encadenamiento de operadores provoca problemas de serialización.

Acelerar la lectura del registro binario

Cuando se utiliza el conector de MySQL como tabla de origen o como fuente de datos para la ingesta de datos, este analiza los archivos de registro binario para generar diversos mensajes de cambio durante la fase incremental. Los archivos de registro binario registran todos los cambios de las tablas en formato binario. A continuación se muestran las formas de acelerar el análisis de estos archivos.

  • Habilite el análisis en paralelo y los filtros de análisis (esta función requiere Realtime Compute for Apache Flink con Ververica Runtime (VVR) 8.0.7 o posterior; no está disponible en la versión comunitaria del conector CDC de MySQL).

    • Habilite la opción scan.only.deserialize.captured.tables.changelog.enabled para analizar los eventos de cambio únicamente de las tablas especificadas.

    • Habilite la opción scan.parallel-deserialize-changelog.enabled para usar varios subprocesos al analizar el archivo de registro binario y entregar los eventos a la cola de consumidores en orden. Cuando habilite esta opción, por lo general también deberá aumentar el valor de TaskManager CPU.

  • Optimice los parámetros de Debezium

    debezium.max.queue.size: 162580
    debezium.max.batch.size: 40960
    debezium.poll.interval.ms: 50
    • debezium.max.queue.size: número máximo de registros que admite la cola de bloqueo. Cuando Debezium lee un flujo de eventos de la base de datos, coloca los eventos en una cola de bloqueo antes de escribirlos en el destino. El valor predeterminado es 8192.

    • debezium.max.batch.size: número máximo de eventos que procesa el conector en cada iteración. El valor predeterminado es 2048.

    • debezium.poll.interval.ms: tiempo en milisegundos que espera el conector antes de solicitar nuevos eventos de cambio. El valor predeterminado es 1000 milisegundos, es decir, 1 segundo.

Ejemplo 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

La capacidad de consumo de registros binarios de la edición empresarial de MySQL CDC es de 85 MB/s, aproximadamente el doble que la de la versión comunitaria de código abierto. Cuando la velocidad de generación de los archivos de registro binario supera los 85 MB/s (es decir, un archivo de 512 MB cada 6 segundos), la latencia del trabajo de Flink aumenta de forma continua. Esta latencia de procesamiento disminuye gradualmente después de que baja la velocidad de generación de dichos archivos. Si un archivo de registro binario contiene una transacción grande, la latencia de procesamiento puede aumentar temporalmente y se reduce una vez que se lee el registro de esa transacción.

Diagnosticar la latencia de datos para optimizar el rendimiento del trabajo

Si experimenta latencia de datos durante la fase incremental, analice el problema con los siguientes pasos:

  1. Compruebe las métricas currentFetchEventTimeLag y currentEmitEventTimeLag en la página Overview. La métrica currentFetchEventTimeLag representa la latencia al leer datos del registro binario. Por su parte, la métrica currentEmitEventTimeLag representa la latencia al leer del registro binario los datos de las tablas relevantes para el trabajo.

    Escenario

    Descripción

    currentFetchEventTimeLag es bajo, mientras que currentEmitEventTimeLag es alto y rara vez se actualiza.

    Un valor bajo de currentFetchEventTimeLag indica que la extracción del registro binario de la base de datos es eficiente. Sin embargo, dicho registro contiene pocos datos de las tablas que necesita leer el trabajo, por lo que currentEmitEventTimeLag rara vez se actualiza. Este comportamiento es normal.

    Tanto currentFetchEventTimeLag como currentEmitEventTimeLag son altos.

    Indica que la tabla de origen tiene un rendimiento de lectura deficiente. Continúe con los pasos posteriores de esta sección para optimizarlo.

  2. La contrapresión puede reducir la velocidad a la que el origen envía datos a los operadores posteriores. Es posible que observe que sourceIdleTime aumenta periódicamente y que tanto currentFetchEventTimeLag como currentEmitEventTimeLag crecen de forma continua. Para resolverlo, aumente el paralelismo del nodo donde se origina la contrapresión.

  3. Revise la métrica TM CPU Usage en la página CPU y la métrica TM GC Time en la página JVM para determinar si faltan recursos de CPU o memoria. Puede aumentar los recursos del trabajo para optimizar el rendimiento de lectura o habilitar los parámetros de minilotes para mejorar el rendimiento. Para obtener más información, consulte High-Performance Flink SQL Optimization Techniques.

  4. Si el trabajo incluye un operador SinkUpsertMaterializer con un estado grande, el rendimiento de lectura se puede ver afectado. Considere aumentar el paralelismo del trabajo o evitar el operador SinkUpsertMaterializer. Para obtener más información, consulte Avoid using SinkUpsertMaterializer. Quitar este operador de un trabajo existente requiere un reinicio sin estado, ya que cambia la topología del trabajo e iniciarlo desde el estado actual podría provocar errores o pérdida de datos.

Establecer el identificador de servidor para evitar conflictos de registros binarios

Cada cliente que sincroniza datos desde una base de datos tiene un identificador único llamado identificador de servidor. Si distintos trabajos usan el mismo identificador, pueden producirse conflictos que provoquen errores en los trabajos. Se recomienda asignar un identificador de servidor diferente a cada fuente de datos de MySQL CDC.

  • Cómo configurar el identificador de servidor

    Puede especificar el identificador de servidor en una instrucción DDL de tabla de Flink o mediante sugerencias de SQL.

    Se recomienda configurar el identificador de servidor con sugerencias de SQL en lugar de especificarlo en la cláusula WITH de la instrucción DDL de la tabla. Para obtener más información, consulte Sugerencias de SQL.

  • Configuración del identificador de servidor para distintos escenarios

    • Instantánea incremental deshabilitada o paralelismo igual a 1

      Si la instantánea incremental está deshabilitada o el paralelismo es 1, especifique un solo identificador de servidor.

      SELECT * FROM source_table /*+ OPTIONS('server-id'='123456') */ ;
    • Instantánea incremental habilitada y paralelismo mayor que 1

      Cuando la instantánea incremental está habilitada y el paralelismo es mayor que 1, debe especificar un rango de identificadores de servidor. La cantidad de identificadores disponibles en ese rango debe ser como mínimo igual al paralelismo. Por ejemplo, si el paralelismo es 3, utilice la siguiente configuración:

      SELECT * FROM source_table /*+ OPTIONS('server-id'='123456-123458') */ ;
    • Trabajo de Flink SQL con varias tablas de origen de MySQL CDC

      Si un trabajo de Flink SQL contiene varias tablas de origen de MySQL CDC y la reutilización de orígenes está deshabilitada, proporcione un identificador de servidor distinto para cada tabla de origen CDC. De igual manera, si la instantánea incremental está habilitada y el paralelismo es mayor que 1, especifique un rango de identificadores de servidor.

      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;

Configurar los parámetros de fragmentos para optimizar el uso de memoria

Cuando se inicia una tabla de origen de MySQL CDC, ejecuta un escaneo completo de la tabla, la divide en varios fragmentos según la clave principal y registra la posición actual del registro binario. Después, el trabajo usa un algoritmo de instantánea incremental para leer los datos de cada fragmento de forma secuencial mediante instrucciones SELECT. Periódicamente, el trabajo crea un punto de control para registrar los fragmentos completados. En caso de conmutación por error, reanuda la lectura desde el primer fragmento incompleto. Una vez leídos todos los fragmentos, el trabajo pasa a leer los cambios incrementales desde la posición del registro binario guardada previamente. Los puntos de control periódicos del trabajo de Flink permiten guardar dicha posición; si ocurre una conmutación por error, el procesamiento se reanuda desde la última posición guardada y así se logra la semántica exactly-once.

Para obtener más detalles sobre el algoritmo de instantánea incremental, consulte Conector CDC de MySQL.

En las tablas con una clave principal de una sola columna, los fragmentos se dividen de forma predeterminada según esa clave. En las tablas con una clave principal compuesta, se usa la primera columna de dicha clave para la división. Ververica Runtime (VVR) 6.0.7 y versiones posteriores admiten la lectura de tablas de origen sin clave principal. En este caso, establezca el parámetro scan.incremental.snapshot.chunk.key-column para especificar una columna no anulable que sirva para dividir los datos.

Optimización de los parámetros de fragmentos

Los datos y los metadatos de los fragmentos se almacenan en memoria, lo que a veces provoca errores de falta de memoria (OOM). Ajuste los parámetros según el componente que presente el error:

  • JobManager

    El JobManager almacena los metadatos de todos los fragmentos. Un número excesivo de fragmentos puede causar un error OOM. Para resolverlo, aumente el valor de scan.incremental.snapshot.chunk.size y reduzca así la cantidad de fragmentos. También puede aumentar la memoria de montón del JobManager si establece jobmanager.memory.heap.size en la configuración de tiempo de ejecución. Para obtener más información, consulte Configuración de parámetros de Flink.

  • TaskManager

    • El TaskManager lee los datos de cada fragmento. Si un fragmento contiene demasiadas filas, puede producirse un error OOM. Para solucionarlo, disminuya el valor de scan.incremental.snapshot.chunk.size y reduzca así el número de filas por fragmento. Otra opción es aumentar la memoria de montón del TaskManager si incrementa el valor de TaskManager Memory en la configuración de tiempo de ejecución.

    • En VVR 8.0.8 y versiones anteriores, el último fragmento puede contener una gran cantidad de datos y provocar un error OOM en el TaskManager. Se recomienda actualizar a VVR 8.0.9 o posterior para evitar este problema.

    • En una tabla de origen de MySQL CDC con clave principal compuesta, los fragmentos se dividen de forma predeterminada según la primera columna de dicha clave. Si los datos están muy sesgados y muchas filas comparten el mismo valor en esa columna, el fragmento correspondiente puede volverse demasiado grande y causar un error OOM en el TaskManager. Configure scan.incremental.snapshot.chunk.key-column para especificar otra columna de la clave principal como criterio de división.

Acelerar las lecturas en la fase de instantánea

Durante la fase de instantánea, la tabla de origen de MySQL lee los datos de la instantánea mediante una conexión JDBC. Utilice los siguientes métodos para acelerar las lecturas en esta fase.

  1. Aumente el paralelismo del origen para acelerar las lecturas durante la fase de instantánea.

  2. Incremente el valor de scan.incremental.snapshot.chunk.size para extraer más datos en un solo fragmento.

  3. Si la tabla de resultados posterior tiene una clave principal y admite escrituras idempotentes, habilite scan.incremental.snapshot.backfill.skip para omitir la lectura del registro binario en la parte de retroalimentación. Esto acelera el procesamiento durante la fase de instantánea.

Habilitar la reutilización de orígenes para reducir las conexiones de registros binarios

Cuando un trabajo incluye varias tablas de origen de MySQL, habilite la reutilización de orígenes para reducir la carga de la base de datos al compartir una sola conexión de registro binario. Esta función solo está disponible en Realtime Compute for Apache Flink y no es compatible con la versión comunitaria del conector CDC de MySQL.

Habilite la reutilización de orígenes en un trabajo SQL mediante el comando SET:

SET 'table.optimizer.source-merge.enabled' = 'true';

Se recomienda habilitar la reutilización de orígenes solo en trabajos nuevos. Si la habilita en un trabajo existente, deberá reiniciarlo sin estado, ya que esta acción modifica la topología del trabajo e iniciarlo desde el estado actual podría provocar errores o pérdida de datos.

Una vez habilitada la reutilización de orígenes, se combinan las tablas de origen de MySQL que tengan los mismos parámetros de configuración. Si todas las tablas de origen del trabajo comparten la misma configuración, el número de conexiones de registro binario se calcula de la siguiente manera:

  • Durante la fase de instantánea, el número de conexiones de registro binario es igual al paralelismo del origen.

  • Durante la fase incremental, el número de conexiones de registro binario es 1.

Importante
  • En VVR 8.0.8 y 8.0.9, también debe ejecutar SET 'sql-gateway.exec-plan.enabled' = 'false'; cuando habilite la reutilización de orígenes CDC.

  • Después de habilitar la reutilización de orígenes CDC, no configure la opción de trabajo pipeline.operator-chaining en false. Romper la cadena de operadores añade sobrecarga de serialización y deserialización a los datos que el origen envía a los operadores posteriores. Entre más orígenes se combinen, mayor será la sobrecarga.

  • En Ververica Runtime (VVR) 8.0.7, establecer pipeline.operator-chaining en false provoca un problema de serialización.

Leer registros binarios archivados desde OSS

Cuando utiliza una instancia de ApsaraDB RDS for MySQL como fuente de datos, puede leer las copias de seguridad de registros almacenadas en OSS. Si el archivo correspondiente a la marca de tiempo o a la posición del registro binario especificada se encuentra en OSS, Flink extrae automáticamente el archivo de registro desde OSS hacia el clúster. Si el archivo está almacenado localmente en la base de datos, Flink cambia de forma automática a la lectura mediante una conexión de base de datos. Esta función solo está disponible en Realtime Compute for Apache Flink y no es compatible con la versión comunitaria del conector CDC de MySQL.

Para habilitar la lectura de las copias de seguridad de registros en OSS, configure los parámetros de conexión de ApsaraDB RDS for MySQL. Por ejemplo:

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'
    ...
)

Preguntas frecuentes

Para obtener más información sobre los problemas que pueden surgir al usar tablas de origen CDC, consulte CDC FAQ.