All Products
Search
Document Center

Realtime Compute for Apache Flink:OceanBase

Last Updated:Sep 03, 2026

Connector OceanBase mengintegrasikan Realtime Compute for Apache Flink dengan OceanBase, yaitu database pemrosesan transaksional dan analitik hibrida (HTAP) terdistribusi native. Gunakan connector ini untuk membaca aliran change data capture (CDC), melakukan join tabel dimensi, dan menulis hasilnya kembali ke OceanBase.

Connector OceanBase berada dalam status pratinjau publik.

Informasi latar belakang

OceanBase adalah sistem manajemen database pemrosesan transaksional dan analitik hibrida (HTAP) terdistribusi native. Untuk informasi lebih lanjut, lihat situs web OceanBase. Guna mengurangi biaya refaktor sistem bisnis saat migrasi dari database MySQL atau Oracle, OceanBase mendukung dua mode kompatibilitas: mode Oracle dan mode MySQL. Tipe data, fitur SQL, dan tampilan internal pada masing-masing mode konsisten dengan MySQL atau Oracle.

Fitur yang didukung

Kategori Detail
Jenis tabel Tabel sumber, dimensi, dan sink
Mode waktu proses Mode streaming dan mode batch
Format data Tidak berlaku
Metrik pemantauan spesifik Tidak ada
API SQL
Pembaruan dan penghapusan pada tabel sink Ya

Prasyarat

Sebelum memulai, pastikan hal-hal berikut:

Batasan

  • Memerlukan Ververica Runtime (VVR) 8.0.1 atau versi yang lebih baru.

Jaminan semantik:

  • Tabel sumber CDC: semantik tepat-sekali. Data tidak hilang atau duplikat saat beralih dari data historis lengkap ke pembacaan Binlog, bahkan setelah terjadi kesalahan.

  • Tabel sink: semantik paling sedikit sekali. Jika tabel sink memiliki primary key, idempotensi menjamin keakuratan data.

Perubahan arsitektur CDC VVR 11.4.0

Mulai dari VVR 11.4.0, connector CDC OceanBase ditingkatkan sebagai berikut:

  • Connector CDC berbasis layanan LogProxy OceanBase sebelumnya telah ditinggalkan dan dihapus.

  • Pengambilan log inkremental kini memerlukan Layanan Binlog OceanBase. Connector CDC OceanBase menawarkan kompatibilitas protokol dan stabilitas koneksi yang lebih baik dengan layanan Binlog dibandingkan dengan menghubungkan connector CDC MySQL standar secara langsung. Menghubungkan connector CDC MySQL standar ke layanan Binlog OceanBase untuk pelacakan perubahan tidak disarankan.

  • Pelacakan perubahan inkremental dalam mode kompatibilitas Oracle tidak lagi didukung. Untuk CDC mode Oracle, hubungi Dukungan Teknis Enterprise OceanBase.

Sintaksis

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

Perilaku penulisan sink:

Untuk setiap catatan masuk, connector menyusun pernyataan SQL berdasarkan skema tabel sink:

  • Tidak memiliki primary key: INSERT INTO

  • Memiliki primary key: UPSERT (berdasarkan mode kompatibilitas database)

Parameter WITH

Parameter umum

Parameter-parameter ini berlaku untuk semua jenis tabel.

Parameter Deskripsi Wajib Tipe Bawaan
connector Diatur ke oceanbase. Ya STRING —
password Kata sandi database. Ya STRING —

Parameter tabel sumber

Penting

Mulai dari VVR 11.4.0, connector CDC OceanBase menggunakan layanan Binlog OceanBase untuk pengambilan log inkremental. Connector berbasis LogProxy telah dihapus. CDC mode kompatibilitas Oracle tidak lagi didukung mulai dari VVR 11.4.0.

Parameter Deskripsi Wajib Tipe Bawaan Catatan
hostname Alamat IP atau hostname database OceanBase. Gunakan alamat virtual private cloud (VPC) bila memungkinkan. Ya STRING — Jika OceanBase dan Realtime Compute for Apache Flink berada di VPC yang berbeda, atur konektivitas cross-VPC atau gunakan titik akhir publik. Lihat Manajemen workspace dan Akses Internet untuk kluster Flink.
username Nama pengguna database OceanBase. Ya STRING — —
database-name Nama database OceanBase. Mendukung ekspresi reguler untuk membaca dari beberapa database. Hindari anchor ^ dan $. Ya STRING — Connector menggabungkan database-name dan table-name dengan \\. (VVR 8.0.1+) atau . (versi sebelumnya) untuk membentuk regex path lengkap. Contohnya, db_.* + tb_.+ menjadi db_.*\\.tb_.+.
table-name Nama tabel OceanBase. Mendukung ekspresi reguler untuk membaca dari beberapa tabel. Hindari anchor ^ dan $. Ya STRING — Lihat catatan database-name di atas.
port Port database OceanBase. Tidak INTEGER 3306 —
server-id ID numerik untuk klien database. Harus unik secara global. Mendukung rentang, seperti 5400-5408, untuk memberikan ID berbeda kepada pembaca konkuren. Tidak STRING Nilai acak antara 5400 dan 6400 Gunakan ID berbeda untuk setiap pekerjaan yang terhubung ke database yang sama. Lihat Penggunaan Server ID.
scan.incremental.snapshot.chunk.size Jumlah baris per chunk selama pembacaan snapshot inkremental. Data di setiap chunk dibuffer di memori sebelum sepenuhnya dibaca. Chunk yang lebih kecil meningkatkan granularitas pemulihan kesalahan tetapi dapat menyebabkan error kehabisan memori (OOM) dan mengurangi throughput. Tidak INTEGER 8096 Seimbangkan ukuran chunk terhadap kebutuhan memori dan throughput.
scan.snapshot.fetch.size Jumlah maksimum catatan yang diambil per tarikan selama pembacaan tabel lengkap. Tidak INTEGER 1024 —
scan.startup.mode Mode startup untuk konsumsi data. Tidak STRING initial Nilai yang valid: initial (memindai riwayat lengkap, lalu membaca Binlog), latest-offset (hanya ekor Binlog), earliest-offset (Binlog paling awal yang tersedia), specific-offset (diatur melalui parameter scan.startup.specific-offset.* ), timestamp (diatur melalui scan.startup.timestamp-millis ).
Penting

Untuk mode earliest-offset, specific-offset, dan timestamp, skema tabel tidak boleh berubah antara posisi Binlog yang ditentukan dan startup pekerjaan.

scan.startup.specific-offset.file Nama file Binlog untuk offset awal. Contoh: mysql-bin.000003. Tidak STRING — Memerlukan scan.startup.mode=specific-offset.
scan.startup.specific-offset.pos Offset byte dalam file Binlog yang ditentukan. Tidak INTEGER — Memerlukan scan.startup.mode=specific-offset.
scan.startup.specific-offset.gtid-set Set GTID untuk offset awal. Contoh: 24DA167-0C0C-11E8-8442-00059A3C7B00:1-19. Tidak STRING — Memerlukan scan.startup.mode=specific-offset.
scan.startup.timestamp-millis Timestamp awal dalam milidetik. CDC OceanBase membaca event awal setiap file Binlog untuk menemukan file yang sesuai dengan timestamp ini. File Binlog tidak boleh telah dipurge. Tidak LONG — Memerlukan scan.startup.mode=timestamp.
server-time-zone Zona waktu sesi yang digunakan oleh database. Mengontrol bagaimana tipe TIMESTAMP dikonversi ke STRING. Lihat Tipe temporal Debezium. Contoh: Asia/Shanghai. Tidak STRING Zona waktu waktu proses pekerjaan Flink —
debezium.min.row.count.to.stream.results Ambang batas jumlah baris di atas mana connector beralih dari pembacaan penuh (seluruh tabel dimuat ke memori) ke pembacaan batch (baris dialirkan dalam batch). Pembacaan penuh lebih cepat; pembacaan batch menghindari OOM untuk tabel besar. Tidak INTEGER 1000 —
connect.timeout Waktu tunggu maksimum sebelum mencoba ulang koneksi yang timeout. Tidak DURATION 30s —
connect.max-retries Jumlah maksimum percobaan koneksi ulang setelah gagal. Tidak INTEGER 3 —
connection.pool.size Ukuran kolam koneksi database. Penggunaan kembali koneksi mengurangi jumlah total koneksi yang terbuka. Tidak INTEGER 20 —
jdbc.properties.* Parameter koneksi URL JDBC kustom. Contoh: 'jdbc.properties.useSSL' = 'false'. Lihat Properti konfigurasi MySQL. Tidak STRING — —
debezium.* Parameter Debezium kustom untuk pembacaan Binlog. Contoh: 'debezium.event.deserialization.failure.handling.mode' = 'ignore'. Tidak STRING — —
heartbeat.interval Interval di mana sumber mengirimkan event heartbeat untuk memajukan offset Binlog. Mencegah offset Binlog kedaluwarsa pada tabel yang jarang diperbarui. Offset yang kedaluwarsa menyebabkan pekerjaan gagal dan memerlukan restart tanpa status. Tidak DURATION 30s —
scan.incremental.snapshot.chunk.key-column Kolom yang digunakan sebagai kunci chunk untuk membagi data selama fase snapshot. Bersyarat STRING — Wajib untuk tabel tanpa primary key (harus NOT NULL). Opsional untuk tabel dengan primary key (pilih satu kolom dari primary key).
scan.incremental.close-idle-reader.enabled Menentukan apakah pembaca idle ditutup setelah fase snapshot selesai. Tidak BOOLEAN false VVR 8.0.1+. Juga memerlukan execution.checkpointing.checkpoints-after-tasks-finish.enabled=true.
scan.read-changelog-as-append-only.enabled Menentukan apakah aliran changelog dikonversi menjadi aliran append-only. Ketika true, semua jenis pesan (INSERT, DELETE, UPDATE_BEFORE, UPDATE_AFTER) dikonversi menjadi INSERT. Aktifkan hanya dalam skenario khusus, seperti mempertahankan pesan hapus dari tabel hulu. Tidak BOOLEAN false VVR 8.0.8+.
scan.only.deserialize.captured.tables.changelog.enabled Menentukan apakah event perubahan hanya dideserialisasi untuk tabel yang ditangkap selama fase inkremental. Mengatur ke true mempercepat pembacaan Binlog. Tidak BOOLEAN false (VVR 8.x), true (VVR 11.1+) VVR 8.0.7+. Pada VVR 8.0.8 dan sebelumnya, gunakan nama parameter debezium.scan.only.deserialize.captured.tables.changelog.enable.
scan.parse.online.schema.changes.enabled Menentukan apakah event DDL untuk perubahan lockless ApsaraDB RDS diurai selama fase inkremental. Fitur eksperimental. Ambil snapshot pekerjaan Flink sebelum melakukan perubahan skema lockless online. Tidak BOOLEAN false VVR 11.1+.
scan.incremental.snapshot.backfill.skip Menentukan apakah backfill dilewati selama fase snapshot. Backfill hanya berlaku selama kueri snapshot satu chunk dan tidak mencakup seluruh fase pembacaan lengkap. Saat backfill dilewati, kueri snapshot setiap chunk membaca data tabel terbaru pada saat itu; pembaruan yang terjadi pada chunk setelah dibaca tidak digabung selama fase pembacaan lengkap dan dibaca dari Binlog setelah memasuki fase inkremental. Misalnya, pembaruan pada chunk5 yang terjadi saat chunk5 sedang di-snapshot tercermin langsung dalam snapshot chunk5; jika chunk5 diperbarui setelah pembaca maju ke chunk80, pembaruan tersebut diterapkan nanti dari Binlog selama fase inkremental. Penting: saat diaktifkan, perubahan yang terjadi selama atau setelah pemindaian chunk tetap dikirimkan dari Binlog dalam fase inkremental dan mungkin diduplikasi; hanya semantik paling sedikit sekali yang dijamin. Aktifkan ini hanya ketika sink hilir mendukung penulisan idempoten berdasarkan primary key. Tidak BOOLEAN false VVR 11.1+.
scan.incremental.snapshot.unbounded-chunk-first.enabled Menentukan apakah chunk tak terbatas didistribusikan terlebih dahulu selama fase snapshot. Mengurangi risiko OOM ketika Pengelola Tugas memproses chunk terakhir. Fitur eksperimental. Tambahkan parameter ini sebelum pekerjaan dimulai pertama kali. Tidak BOOLEAN false VVR 11.1+.

Parameter tabel dimensi

Parameter Deskripsi Wajib Tipe Bawaan Catatan
url URL JDBC. Harus menyertakan nama database MySQL atau nama layanan Oracle. Ya STRING — —
userName Nama pengguna database. Ya STRING — —
cache Kebijakan cache untuk lookup tabel dimensi. Tidak STRING ALL ALL: Memuat semua data sebelum pekerjaan dimulai; muat ulang setelah kedaluwarsa. Cocok untuk tabel kecil dengan banyak lookup miss. Tingkatkan memori node join minimal dua kali ukuran tabel untuk mendukung pemuatan asinkron. LRU: Menyimpan cache subset baris; memerlukan cacheSize. None: Tanpa caching.
cacheSize Jumlah maksimum entri yang dicache. Tidak INTEGER 100000 Wajib saat cache=LRU. Diabaikan saat cache=ALL.
cacheTTLMs Timeout cache dalam milidetik. Perilaku tergantung pada pengaturan cache: untuk LRU, entri kedaluwarsa setelah durasi ini (tidak ada kedaluwarsa secara bawaan); untuk ALL, cache penuh dimuat ulang setelah durasi ini (tidak ada muat ulang secara bawaan); untuk None, parameter ini tidak berpengaruh. Tidak LONG Long.MAX_VALUE —
maxRetryTimeout Durasi maksimum percobaan ulang. Tidak DURATION 60s —

Parameter tabel sink (JDBC)

Parameter Deskripsi Wajib Tipe Bawaan Catatan
url URL JDBC. Harus menyertakan nama database MySQL atau nama layanan Oracle. Ya STRING — —
userName Nama pengguna database. Ya STRING — —
tableName Nama tabel tujuan. Ya STRING — —
sink.mode Mode penulisan. Atur ke jdbc untuk penulisan standar; atur ke direct-load untuk impor bypass. Ya STRING jdbc —
compatibleMode Mode kompatibilitas OceanBase. Nilai yang valid: mysql, oracle. Tidak STRING mysql Parameter khusus OceanBase.
maxRetryTimes Jumlah maksimum percobaan ulang penulisan. Tidak INTEGER 3 —
poolInitialSize Ukuran awal kolam koneksi. Tidak INTEGER 1 —
poolMaxActive Jumlah maksimum koneksi aktif dalam kolam. Tidak INTEGER 8 —
poolMaxWait Waktu tunggu maksimum (ms) untuk koneksi dari kolam. Tidak INTEGER 2000 —
poolMinIdle Jumlah minimum koneksi idle dalam kolam. Tidak INTEGER 1 —
connectionProperties Properti koneksi JDBC dalam format k1=v1;k2=v2. Tidak STRING — —
ignoreDelete Menentukan apakah operasi hapus diabaikan. Tidak BOOLEAN false —
excludeUpdateColumns Kolom yang dikecualikan dari pembaruan, dipisahkan koma (misalnya, column1,column2). Kolom primary key selalu dikecualikan terlepas dari pengaturan ini. Tidak STRING — —
partitionKey Kunci partisi. Saat diatur, data dikelompokkan berdasarkan kunci ini sebelum aturan modRule diterapkan. Tidak STRING — —
modRule Aturan pengelompokan dalam format nama_kolom mod angka (misalnya, user_id mod 8). Kolom harus numerik. Data pertama kali dipartisi berdasarkan partitionKey, lalu dikelompokkan dalam setiap partisi berdasarkan aturan ini. Tidak STRING — —
bufferSize Ukuran buffer data (jumlah catatan). Tidak INTEGER 1000 —
flushIntervalMs Interval flush buffer (ms). Jika buffer tidak memenuhi kondisi output dalam interval ini, semua data yang dibuffer akan diflush secara otomatis. Tidak LONG 1000 —
retryIntervalMs Interval percobaan ulang (ms). Tidak INTEGER 5000 —

Parameter tabel sink (impor bypass)

Impor bypass adalah metode penulisan throughput tinggi untuk pemuatan data massal di OceanBase. Fitur ini tersedia di VVR 11.5 dan versi yang lebih baru.

Sebelum menggunakan impor bypass, perhatikan batasan berikut:

  • Hanya aliran bounded: Sumber data harus berupa aliran bounded. Gunakan mode batch Flink untuk performa terbaik.

  • Penguncian tabel selama impor: Tabel target dikunci selama proses impor. Penulisan DML dan perubahan DDL diblokir; kueri baca tidak terpengaruh.

  • Bukan untuk penulisan real-time: Untuk penulisan streaming atau real-time, gunakan sink JDBC.

Parameter Deskripsi Wajib Tipe Bawaan Catatan
sink.mode Atur ke direct-load untuk menggunakan impor bypass. Tidak STRING jdbc —
host Alamat IP atau hostname database OceanBase. Ya STRING — —
port Port RPC database OceanBase. Tidak INTEGER 2882 —
username Nama pengguna database. Ya STRING — —
tenant-name Nama penyewa OceanBase. Ya STRING — —
schema-name Untuk penyewa MySQL: nama database. Untuk penyewa Oracle: nama pemilik. Ya STRING — —
table-name Nama tabel tujuan. Ya STRING — —
parallel Konkurensi sisi server untuk tugas impor. Server membatasi tingkat paralelisme aktual berdasarkan spesifikasi CPU penyewa tanpa mengembalikan error. Rumus: MIN(tenant_cores × 2, parallel) × partition_nodes. Misalnya, dengan 2 core CPU, parallel=10, dan 2 node partisi: MIN(4, 10) × 2 = 8. Tidak INTEGER 8 —
buffer-size Jumlah catatan yang dibuffer sebelum satu penulisan ke OceanBase. Tidak INTEGER 1024 —
dup-action Perilaku saat kunci primer duplikat ditemukan. STOP_ON_DUP: gagalkan impor. REPLACE: timpa baris yang ada. IGNORE: buang baris masuk. Tidak STRING REPLACE —
load-method Mode impor. full: impor bypass standar. inc: mode inkremental, memeriksa konflik kunci primer (observer 4.3.2+, dup-action=REPLACE tidak didukung). inc_replace: mode ganti inkremental, menimpa baris yang ada secara langsung tanpa pemeriksaan konflik (observer 4.3.2+, dup-action diabaikan). Tidak STRING full —
max-error-rows Jumlah maksimum baris error yang ditoleransi. Baris error mencakup: kunci primer duplikat saat dup-action=STOP_ON_DUP, jumlah kolom tidak cocok, dan baris yang gagal dalam konversi tipe. Tidak LONG 0 —
timeout Timeout keseluruhan untuk tugas impor bypass. Tidak DURATION 7d —
heartbeat-timeout Timeout heartbeat sisi klien. Tidak DURATION 60s —
heartbeat-interval Interval heartbeat sisi klien. Tidak DURATION 10s —

Pemetaan tipe

Mode kompatibel MySQL

Tipe OceanBase Tipe 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 (maks 2.147.483.647 byte)

Mode kompatibel Oracle

Tipe OceanBase Tipe 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

Contoh

Tabel sumber dan tabel sink

Contoh berikut membaca data CDC dari tabel sumber OceanBase dan menulisnya ke tabel sink JDBC. Definisi tabel sink impor bypass juga disertakan sebagai referensi.

Ketiga tabel menggunakan 'connector' = 'oceanbase'. Tabel sumber dan sink JDBC menggunakan set parameter yang berbeda; sink direct-load mengatur sink.mode = 'direct-load' dan terhubung melalui port RPC.

-- Tabel sumber CDC OceanBase (membaca riwayat lengkap, lalu 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>'
);

-- Tabel sink JDBC OceanBase (untuk penulisan streaming real-time)
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>'
);

-- Tabel sink impor bypass OceanBase (untuk penulisan batch throughput tinggi)
-- Memerlukan sumber data bounded; atur Flink ke mode batch untuk performa terbaik
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;

Tabel dimensi

Contoh berikut melakukan join sumber Datagen dengan tabel dimensi OceanBase menggunakan temporal join. Kebijakan cache ALL memuat seluruh tabel dimensi ke memori sebelum pekerjaan dimulai.

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

-- Tabel dimensi OceanBase dengan kebijakan cache ALL
-- Cache ALL memuat tabel penuh saat startup — cocok untuk tabel kecil dan stabil
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;

Langkah selanjutnya