Tous les produits
Search
Centre de documentation

Realtime Compute for Apache Flink:OceanBase

Dernière mise à jour :Sep 03, 2026

Le connecteur OceanBase intègre Realtime Compute for Apache Flink à OceanBase, une base de données native distribuée hybride transactionnelle et analytique (HTAP). Utilisez-le pour lire les flux de capture des données modifiées (CDC), joindre des tables de dimension et écrire les résultats dans OceanBase.

Le connecteur OceanBase est en aperçu public.

Informations générales

OceanBase est un système de gestion de base de données natif distribué hybride transactionnel et analytique (HTAP). Pour plus d'informations, consultez le site web d'OceanBase. Afin de réduire les coûts de refonte de vos systèmes métier lors de la migration depuis une base de données MySQL ou Oracle, OceanBase prend en charge deux modes de compatibilité : le mode Oracle et le mode MySQL. Les types de données, les fonctionnalités SQL et les vues internes de ces modes sont cohérents avec ceux de MySQL ou d'Oracle.

Fonctionnalités prises en charge

Catégorie Détails
Types de table Tables source, de dimension et de destination
Modes d'exécution Mode streaming et mode par lots
Format des données Non applicable
Métriques de surveillance spécifiques Aucune
API SQL
Mises à jour et suppressions dans les tables de destination Oui

Prérequis

Avant de commencer, assurez-vous que :

Limitations

  • Requiert Ververica Runtime (VVR) 8.0.1 ou version ultérieure.

Garanties sémantiques :

  • Tables source CDC : sémantique exactly-once. Les données ne sont ni perdues ni dupliquées lors de la transition entre les données historiques complètes et la lecture du Binlog, même après une panne.

  • Tables de destination : sémantique at-least-once. Si la table de destination possède une clé primaire, l'idempotence garantit l'exactitude des données.

Modification de l'architecture CDC dans VVR 11.4.0

À partir de VVR 11.4.0, le connecteur CDC OceanBase a été mis à niveau :

  • Le connecteur CDC original basé sur le service LogProxy d'OceanBase est obsolète et supprimé.

  • La capture des journaux incrémentiels nécessite désormais le service Binlog d'OceanBase. Le connecteur CDC OceanBase offre une meilleure compatibilité protocolaire et une stabilité de connexion supérieure avec le service Binlog par rapport à une connexion directe via le connecteur MySQL CDC standard. Il n'est pas recommandé de connecter le connecteur MySQL CDC standard au service Binlog d'OceanBase pour le suivi des modifications.

  • Le suivi des modifications incrémentielles en mode de compatibilité Oracle n'est plus pris en charge. Pour la CDC en mode Oracle, contactez le support technique entreprise d'OceanBase.

Syntaxe

CREATE TABLE oceanbase_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'  = 'oceanbase',
  'url'        = '<your-jdbc-url>',
  'tableName'  = '<your-table-name>',
  'userName'   = '<your-username>',
  'password'   = '<your-password>'
);

Comportement d'écriture de la destination :

Pour chaque enregistrement entrant, le connecteur construit une instruction SQL basée sur le schéma de la table de destination :

  • Aucune clé primaire : INSERT INTO

  • Clé primaire présente : UPSERT (selon le mode de compatibilité de la base de données)

Paramètres WITH

Paramètres généraux

Ces paramètres s'appliquent à tous les types de table.

Paramètre Description Obligatoire Type Par défaut
connector Définissez sur oceanbase. Oui STRING —
password Le mot de passe de la base de données. Oui STRING —

Paramètres de la table source

Important

À partir de VVR 11.4.0, le connecteur CDC OceanBase utilise le service Binlog d'OceanBase pour la capture des journaux incrémentiels. Le connecteur basé sur LogProxy est supprimé. La CDC en mode de compatibilité Oracle n'est plus prise en charge à partir de VVR 11.4.0.

Paramètre Description Obligatoire Type Par défaut Notes
hostname L'adresse IP ou le nom d'hôte de la base de données OceanBase. Utilisez une adresse de réseau privé virtuel (VPC) lorsque cela est possible. Oui STRING — Si OceanBase et Realtime Compute for Apache Flink se trouvent dans des VPC différents, configurez la connectivité inter-VPC ou utilisez un endpoint public. Consultez Gestion de l'espace de travail et Accès Internet pour les clusters Flink.
username Le nom d'utilisateur de la base de données OceanBase. Oui STRING — —
database-name Le nom de la base de données OceanBase. Prend en charge les expressions régulières pour lire depuis plusieurs bases de données. Évitez les ancres ^ et $. Oui STRING — Le connecteur concatène database-name et table-name avec \\. (VVR 8.0.1+) ou . (versions antérieures) pour former une expression régulière de chemin complet. Par exemple, db_.* + tb_.+ devient db_.*\\.tb_.+.
table-name Le nom de la table OceanBase. Prend en charge les expressions régulières pour lire depuis plusieurs tables. Évitez les ancres ^ et $. Oui STRING — Voir la note relative à database-name ci-dessus.
port Le port de la base de données OceanBase. Non INTEGER 3306 —
server-id Un ID numérique pour le client de base de données. Doit être globalement unique. Prend en charge une plage, telle que 5400-5408, pour attribuer différents ID aux lecteurs simultanés. Non STRING Valeur aléatoire entre 5400 et 6400 Utilisez un ID différent pour chaque job se connectant à la même base de données. Consultez Utilisation de l'ID serveur.
scan.incremental.snapshot.chunk.size Le nombre de lignes par fragment lors de la lecture instantanée incrémentielle. Les données de chaque fragment sont mises en mémoire tampon avant d'être entièrement lues. Des fragments plus petits améliorent la granularité de la récupération après incident, mais peuvent provoquer des erreurs de dépassement de mémoire (OOM) et réduire le débit. Non INTEGER 8096 Équilibrez la taille des fragments en fonction des exigences de mémoire et de débit.
scan.snapshot.fetch.size Le nombre maximal d'enregistrements extraits par extraction lors des lectures de table complètes. Non INTEGER 1024 —
scan.startup.mode Le mode de démarrage pour la consommation des données. Non STRING initial Valeurs valides : initial (analyse de l'historique complet, puis lecture du Binlog), latest-offset (lecture uniquement de la fin du Binlog), earliest-offset (Binlog disponible le plus ancien), specific-offset (défini via les paramètres scan.startup.specific-offset.* ), timestamp (défini via scan.startup.timestamp-millis ).
Important

Pour les modes earliest-offset, specific-offset et timestamp, le schéma de la table ne doit pas changer entre la position Binlog spécifiée et le démarrage du job.

scan.startup.specific-offset.file Le nom du fichier Binlog pour le décalage de départ. Exemple : mysql-bin.000003. Non STRING — Requiert scan.startup.mode=specific-offset.
scan.startup.specific-offset.pos Le décalage en octets dans le fichier Binlog spécifié. Non INTEGER — Requiert scan.startup.mode=specific-offset.
scan.startup.specific-offset.gtid-set L'ensemble GTID pour le décalage de départ. Exemple : 24DA167-0C0C-11E8-8442-00059A3C7B00:1-19. Non STRING — Requiert scan.startup.mode=specific-offset.
scan.startup.timestamp-millis L'horodatage de départ en millisecondes. La CDC OceanBase lit l'événement initial de chaque fichier Binlog pour localiser le fichier correspondant à cet horodatage. Le fichier Binlog ne doit pas avoir été purgé. Non LONG — Requiert scan.startup.mode=timestamp.
server-time-zone Le fuseau horaire de session utilisé par la base de données. Contrôle la conversion des types TIMESTAMP en STRING. Consultez les types temporels Debezium. Exemple : Asia/Shanghai. Non STRING Fuseau horaire d'exécution du job Flink —
debezium.min.row.count.to.stream.results Le seuil de nombre de lignes au-delà duquel le connecteur passe de la lecture complète (table entière en mémoire) à la lecture par lots (diffusion des lignes par lots). La lecture complète est plus rapide ; la lecture par lots évite les erreurs OOM pour les grandes tables. Non INTEGER 1000 —
connect.timeout Le temps d'attente maximal avant de réessayer une connexion ayant expiré. Non DURATION 30s —
connect.max-retries Le nombre maximal de tentatives de reconnexion après un échec. Non INTEGER 3 —
connection.pool.size La taille du pool de connexions à la base de données. La réutilisation des connexions réduit le nombre total de connexions ouvertes. Non INTEGER 20 —
jdbc.properties.* Paramètres de connexion JDBC URL personnalisés. Exemple : 'jdbc.properties.useSSL' = 'false'. Consultez les propriétés de configuration MySQL. Non STRING — —
debezium.* Paramètres Debezium personnalisés pour la lecture du Binlog. Exemple : 'debezium.event.deserialization.failure.handling.mode' = 'ignore'. Non STRING — —
heartbeat.interval L'intervalle auquel la source émet des événements de pulsation pour faire avancer le décalage Binlog. Empêche l'expiration du décalage Binlog sur les tables rarement mises à jour. Un décalage expiré entraîne l'échec du job et nécessite un redémarrage sans état. Non DURATION 30s —
scan.incremental.snapshot.chunk.key-column La colonne utilisée comme clé de fragment pour le fractionnement des données pendant la phase d'instantané. Conditionnel STRING — Requis pour les tables sans clé primaire (doit être NOT NULL). Optionnel pour les tables avec clé primaire (sélectionnez une colonne de la clé primaire).
scan.incremental.close-idle-reader.enabled Indique s'il faut fermer les lecteurs inactifs une fois la phase d'instantané terminée. Non BOOLEAN false VVR 8.0.1+. Requiert également execution.checkpointing.checkpoints-after-tasks-finish.enabled=true.
scan.read-changelog-as-append-only.enabled Indique s'il faut convertir le flux de journal des modifications en flux append-only. Lorsque la valeur est true, tous les types de messages (INSERT, DELETE, UPDATE_BEFORE, UPDATE_AFTER) sont convertis en INSERT. À activer uniquement dans des scénarios particuliers, tels que la conservation des messages de suppression d'une table amont. Non BOOLEAN false VVR 8.0.8+.
scan.only.deserialize.captured.tables.changelog.enabled Indique s'il faut désérialiser les événements de modification uniquement pour les tables capturées pendant la phase incrémentielle. La définition sur true accélère la lecture du Binlog. Non BOOLEAN false (VVR 8.x), true (VVR 11.1+) VVR 8.0.7+. Dans VVR 8.0.8 et versions antérieures, utilisez le nom de paramètre debezium.scan.only.deserialize.captured.tables.changelog.enable.
scan.parse.online.schema.changes.enabled Indique s'il faut analyser les événements DDL pour les modifications sans verrou d'ApsaraDB RDS pendant la phase incrémentielle. Fonctionnalité expérimentale. Effectuez un snapshot du job Flink avant d'effectuer des modifications de schéma en ligne sans verrou. Non BOOLEAN false VVR 11.1+.
scan.incremental.snapshot.backfill.skip Indique s'il faut ignorer le remplissage rétroactif pendant la phase d'instantané. Le remplissage rétroactif s'applique uniquement lors de la requête d'instantané d'un seul fragment et ne couvre pas l'ensemble de la phase de lecture complète. Lorsque le remplissage rétroactif est ignoré, la requête d'instantané de chaque fragment lit les dernières données de la table à cet instant ; les mises à jour qui surviennent sur un fragment après sa lecture ne sont pas fusionnées pendant la phase de lecture complète et sont lues depuis le Binlog après l'entrée en phase incrémentielle. Par exemple, une mise à jour du fragment5 qui survient pendant l'instantané du fragment5 est reflétée directement dans l'instantané du fragment5 ; si le fragment5 est mis à jour après que le lecteur est passé au fragment80, la mise à jour est appliquée ultérieurement depuis le Binlog pendant la phase incrémentielle. Important : lorsque cette option est activée, les modifications qui surviennent pendant ou après l'analyse d'un fragment sont toujours transmises depuis le Binlog en phase incrémentielle et peuvent être dupliquées ; seule la sémantique at-least-once est garantie. Activez cette option uniquement si la destination en aval prend en charge les écritures idempotentes par clé primaire. Non BOOLEAN false VVR 11.1+.
scan.incremental.snapshot.unbounded-chunk-first.enabled Indique s'il faut distribuer le fragment non borné en premier pendant la phase d'instantané. Réduit le risque d'erreur OOM lorsqu'un TaskManager traite le dernier fragment. Fonctionnalité expérimentale. Ajoutez ce paramètre avant le premier démarrage du job. Non BOOLEAN false VVR 11.1+.

Paramètres de la table de dimension

Paramètre Description Obligatoire Type Par défaut Notes
url L'URL JDBC. Doit inclure le nom de la base de données MySQL ou le nom du service Oracle. Oui STRING — —
userName Le nom d'utilisateur de la base de données. Oui STRING — —
cache La politique de cache pour les recherches dans la table de dimension. Non STRING ALL ALL : Charge toutes les données avant le démarrage du job ; recharge après expiration. Adapté aux petites tables avec de nombreux échecs de recherche. Augmentez la mémoire du nœud de jointure à au moins deux fois la taille de la table pour prendre en charge le chargement asynchrone. LRU : Met en cache un sous-ensemble de lignes ; requiert cacheSize. None : Aucun cache.
cacheSize Le nombre maximal d'entrées mises en cache. Non INTEGER 100000 Requis lorsque cache=LRU. Ignoré lorsque cache=ALL.
cacheTTLMs Le délai d'expiration du cache en millisecondes. Le comportement dépend du paramètre cache : pour LRU, les entrées expirent après cette durée (aucune expiration par défaut) ; pour ALL, le cache complet est rechargé après cette durée (aucun rechargement par défaut) ; pour None, ce paramètre n'a aucun effet. Non LONG Long.MAX_VALUE —
maxRetryTimeout La durée maximale de nouvelle tentative. Non DURATION 60s —

Paramètres de la table de destination (JDBC)

Paramètre Description Obligatoire Type Par défaut Notes
url L'URL JDBC. Doit inclure le nom de la base de données MySQL ou le nom du service Oracle. Oui STRING — —
userName Le nom d'utilisateur de la base de données. Oui STRING — —
tableName Le nom de la table cible. Oui STRING — —
sink.mode Le mode d'écriture. Définissez sur jdbc pour les écritures standard ; définissez sur direct-load pour l'import direct. Oui STRING jdbc —
compatibleMode Le mode de compatibilité OceanBase. Valeurs valides : mysql, oracle. Non STRING mysql Paramètre spécifique à OceanBase.
maxRetryTimes Le nombre maximal de nouvelles tentatives d'écriture. Non INTEGER 3 —
poolInitialSize La taille initiale du pool de connexions. Non INTEGER 1 —
poolMaxActive Le nombre maximal de connexions actives dans le pool. Non INTEGER 8 —
poolMaxWait Le temps d'attente maximal (ms) pour obtenir une connexion du pool. Non INTEGER 2000 —
poolMinIdle Le nombre minimal de connexions inactives dans le pool. Non INTEGER 1 —
connectionProperties Propriétés de connexion JDBC au format k1=v1;k2=v2. Non STRING — —
ignoreDelete Indique s'il faut ignorer les opérations de suppression. Non BOOLEAN false —
excludeUpdateColumns Colonnes à exclure des mises à jour, séparées par des virgules (par exemple, column1,column2). Les colonnes de clé primaire sont toujours exclues, quel que soit ce paramètre. Non STRING — —
partitionKey La clé de partition. Lorsqu'elle est définie, les données sont regroupées par cette clé avant l'application de la règle modRule. Non STRING — —
modRule La règle de groupement au format column_name mod number (par exemple, user_id mod 8). La colonne doit être numérique. Les données sont d'abord partitionnées par partitionKey, puis regroupées au sein de chaque partition selon cette règle. Non STRING — —
bufferSize La taille du tampon de données (nombre d'enregistrements). Non INTEGER 1000 —
flushIntervalMs L'intervalle de vidage du tampon (ms). Si le tampon ne remplit pas la condition de sortie dans cet intervalle, toutes les données mises en tampon sont vidées automatiquement. Non LONG 1000 —
retryIntervalMs L'intervalle de nouvelle tentative (ms). Non INTEGER 5000 —

Paramètres de la table de destination (import direct)

L'import direct est une méthode d'écriture à haut débit pour le chargement en masse de données dans OceanBase. Disponible dans VVR 11.5 et versions ultérieures.

Avant d'utiliser l'import direct, vérifiez les contraintes suivantes :

  • Flux bornés uniquement : La source de données doit être un flux borné. Utilisez le mode par lots de Flink pour des performances optimales.

  • Verrouillage de la table pendant l'import : La table cible est verrouillée tout au long de l'import. Les écritures DML et les modifications DDL sont bloquées ; les requêtes de lecture ne sont pas affectées.

  • Non destiné aux écritures en temps réel : Pour les écritures en streaming ou en temps réel, utilisez plutôt la destination JDBC.

Paramètre Description Obligatoire Type Par défaut Notes
sink.mode Définissez sur direct-load pour utiliser l'import direct. Non STRING jdbc —
host L'adresse IP ou le nom d'hôte de la base de données OceanBase. Oui STRING — —
port Le port RPC de la base de données OceanBase. Non INTEGER 2882 —
username Le nom d'utilisateur de la base de données. Oui STRING — —
tenant-name Le nom du locataire OceanBase. Oui STRING — —
schema-name Pour les locataires MySQL : le nom de la base de données. Pour les locataires Oracle : le nom du propriétaire. Oui STRING — —
table-name Le nom de la table cible. Oui STRING — —
parallel La concurrence côté serveur pour la tâche d'import. Le serveur plafonne le degré de parallélisme réel en fonction des spécifications CPU du locataire sans renvoyer d'erreur. Formule : MIN(tenant_cores × 2, parallel) × partition_nodes. Par exemple, avec 2 cœurs CPU, parallel=10 et 2 nœuds de partition : MIN(4, 10) × 2 = 8. Non INTEGER 8 —
buffer-size Le nombre d'enregistrements mis en tampon avant une seule écriture dans OceanBase. Non INTEGER 1024 —
dup-action Le comportement en cas de clés primaires en double. STOP_ON_DUP : échec de l'import. REPLACE : écrase la ligne existante. IGNORE : ignore la ligne entrante. Non STRING REPLACE —
load-method Le mode d'import. full : import direct standard. inc : mode incrémentiel, vérifie les conflits de clé primaire (observer 4.3.2+, dup-action=REPLACE non pris en charge). inc_replace : mode de remplacement incrémentiel, écrase les lignes existantes directement sans vérification de conflit (observer 4.3.2+, dup-action est ignoré). Non STRING full —
max-error-rows Le nombre maximal de lignes d'erreur tolérées. Les lignes d'erreur incluent : les clés primaires en double lorsque dup-action=STOP_ON_DUP, les nombres de colonnes non correspondants et les lignes dont la conversion de type échoue. Non LONG 0 —
timeout Le délai d'expiration global pour la tâche d'import direct. Non DURATION 7d —
heartbeat-timeout Le délai d'expiration de la pulsation côté client. Non DURATION 60s —
heartbeat-interval L'intervalle de pulsation côté client. Non DURATION 10s —

Mappage de types

Mode compatible MySQL

Type OceanBase Type Flink
TINYINT TINYINT
SMALLINT, TINYINT UNSIGNED SMALLINT
INT, MEDIUMINT, SMALLINT UNSIGNED INT
BIGINT, INT UNSIGNED BIGINT
BIGINT UNSIGNED DECIMAL(20, 0)
REAL, FLOAT FLOAT
DOUBLE DOUBLE
NUMERIC(p, s), DECIMAL(p, s) DECIMAL(p, s) (p ≤ 38)
BOOLEAN, TINYINT(1) BOOLEAN
DATE DATE
TIME [(p)] TIME [(p)] [WITHOUT TIME ZONE]
DATETIME [(p)], TIMESTAMP [(p)] TIMESTAMP [(p)] [WITHOUT TIME ZONE]
CHAR(n) CHAR(n)
VARCHAR(n) VARCHAR(n)
BIT(n) BINARY(⌈n/8⌉)
BINARY(n) BINARY(n)
VARBINARY(N) VARBINARY(N)
TINYTEXT, TEXT, MEDIUMTEXT, LONGTEXT STRING
TINYBLOB, BLOB, MEDIUMBLOB, LONGBLOB BYTES (max 2 147 483 647 octets)

Mode compatible Oracle

Type OceanBase Type Flink
NUMBER(p, s≤0), p−s < 3 TINYINT
NUMBER(p, s≤0), p−s < 5 SMALLINT
NUMBER(p, s≤0), p−s < 10 INT
NUMBER(p, s≤0), p−s < 19 BIGINT
NUMBER(p, s≤0), 19 ≤ p−s ≤ 38 DECIMAL(p−s, 0)
NUMBER(p, s>0) DECIMAL(p, s)
NUMBER(p, s≤0), p−s > 38 STRING
FLOAT, BINARY_FLOAT FLOAT
BINARY_DOUBLE DOUBLE
NUMBER(1) BOOLEAN
DATE, TIMESTAMP [(p)] TIMESTAMP [(p)] [WITHOUT TIME ZONE]
CHAR(n), NCHAR(n), NVARCHAR2(n), VARCHAR(n), VARCHAR2(n), CLOB STRING
BLOB, ROWID BYTES

Exemples

Table source et table de destination

L'exemple suivant lit les données CDC depuis une table source OceanBase et les écrit dans une table de destination JDBC. Une définition de table de destination avec import direct est également incluse à titre de référence.

Les trois tables utilisent 'connector' = 'oceanbase'. La source et la destination JDBC utilisent des ensembles de paramètres différents ; la destination direct-load définit sink.mode = 'direct-load' et se connecte via le port RPC.

-- OceanBase CDC source table (reads full history, then Binlog)
CREATE TEMPORARY TABLE oceanbase_source (
  a INT,
  b VARCHAR,
  c VARCHAR
) WITH (
  'connector'     = 'oceanbase',
  'hostname'      = '<your-hostname>',
  'port'          = '3306',
  'username'      = '<your-username>',
  'password'      = '<your-password>',
  'database-name' = '<your-database-name>',
  'table-name'    = '<your-table-name>'
);

-- OceanBase JDBC sink table (for real-time streaming writes)
CREATE TEMPORARY TABLE oceanbase_sink (
  a INT,
  b VARCHAR,
  c VARCHAR
) WITH (
  'connector' = 'oceanbase',
  'url'       = '<your-jdbc-url>',
  'userName'  = '<your-username>',
  'password'  = '<your-password>',
  'tableName' = '<your-table-name>'
);

-- OceanBase bypass import sink table (for high-throughput batch writes)
-- Requires a bounded data source; set Flink to batch mode for best performance
CREATE TEMPORARY TABLE oceanbase_directload_sink (
  a INT,
  b VARCHAR,
  c VARCHAR
) WITH (
  'connector'   = 'oceanbase',
  'sink.mode'   = 'direct-load',
  'host'        = '<your-host>',
  'port'        = '<your-rpc-port>',
  'tenant-name' = '<your-tenant-name>',
  'schema-name' = '<your-schema-name>',
  'table-name'  = '<your-table-name>',
  'username'    = '<your-username>',
  'password'    = '<your-password>'
);

BEGIN STATEMENT SET;
INSERT INTO oceanbase_sink
SELECT * FROM oceanbase_source;
END;

Table de dimension

L'exemple suivant joint une source Datagen à une table de dimension OceanBase à l'aide d'une jointure temporelle. La politique de cache ALL charge la table de dimension entière en mémoire avant le démarrage du job.

CREATE TEMPORARY TABLE datagen_source (
  a INT,
  b BIGINT,
  c STRING,
  `proctime` AS PROCTIME()
) WITH (
  'connector' = 'datagen'
);

-- OceanBase dimension table with ALL cache policy
-- ALL cache loads the full table at startup — suitable for small, stable tables
CREATE TEMPORARY TABLE oceanbase_dim (
  a INT,
  b VARCHAR,
  c VARCHAR
) WITH (
  'connector' = 'oceanbase',
  'url'       = '<your-jdbc-url>',
  'userName'  = '<your-username>',
  'password'  = '${secret_values.password}',
  'tableName' = '<your-table-name>'
);

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 oceanbase_dim FOR SYSTEM_TIME AS OF T.`proctime` AS H
ON T.a = H.a;

Étapes suivantes