All Products
Search
Document Center

Realtime Compute for Apache Flink:OceanBase

Last Updated:Aug 25, 2026

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

Connector OceanBase sedang dalam pratinjau publik.

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 khusus Tidak ada
API SQL
Pembaruan dan penghapusan pada tabel sink Ya

Pilih connector

OceanBase mendukung dua mode kompatibilitas. Mode yang Anda gunakan menentukan connector mana yang harus digunakan.

Mode OceanBase Connector yang direkomendasikan Alternatif
Mode Oracle Connector OceanBase
Mode MySQL Connector OceanBase atau connector MySQL

Catatan mode MySQL:

  • Connector MySQL tersedia untuk OceanBase 3.2.4.4 dan versi setelahnya (pratinjau publik). Lakukan evaluasi menyeluruh sebelum menggunakannya di lingkungan produksi.

  • Untuk membaca data inkremental dengan connector MySQL, aktifkan dan konfigurasikan layanan OceanBase Binlog. Lihat Ikhtisar layanan OceanBase Binlog dan Operasi terkait Binlog.

Prasyarat

Sebelum memulai, pastikan hal-hal berikut:

Batasan

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

Jaminan semantik:

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

  • Tabel sink: semantik paling sedikit sekali (at-least-once). 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:

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

  • Pengambilan log inkremental kini memerlukan layanan OceanBase Binlog. 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 OceanBase Binlog 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 record yang 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 berikut berlaku untuk semua jenis tabel.

Parameter Deskripsi Wajib Tipe Bawaan
connector Atur 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 OceanBase Binlog 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 Username 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. Misalnya, 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 client database. Harus unik secara global. Mendukung rentang, seperti 5400-5408, untuk memberikan ID berbeda kepada reader 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 record yang diambil per tarikan selama pembacaan tabel penuh. 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 dari setiap file Binlog untuk menemukan file yang sesuai dengan timestamp ini. File Binlog tersebut 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 kembali 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 reader 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 delete 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 akan mengurai event DDL untuk perubahan tanpa lock ApsaraDB RDS selama fase inkremental. Fitur eksperimental. Ambil snapshot pekerjaan Flink sebelum melakukan perubahan skema tanpa lock 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 penuh. Ketika 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 penuh 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 reader maju ke chunk80, pembaruan tersebut diterapkan nanti dari Binlog selama fase inkremental. Penting: ketika diaktifkan, perubahan yang terjadi selama atau setelah pemindaian chunk tetap dikirimkan dari Binlog dalam fase inkremental dan mungkin diduplikasi; hanya semantik paling sedikit sekali (at-least-once) 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 untuk pertama kalinya. Tidak BOOLEAN false VVR 11.1+.

Parameter tabel dimensi

Parameter Deskripsi Wajib Tipe Bawaan Catatan
url URL JDBC. Harus mencakup nama database MySQL atau nama layanan Oracle. Ya STRING
userName Username database. Ya STRING
cache Kebijakan cache untuk pencarian 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: Tidak ada caching.
cacheSize Jumlah maksimum entri yang dicache. Tidak INTEGER 100000 Wajib ketika cache=LRU. Diabaikan ketika 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 mencakup nama database MySQL atau nama layanan Oracle. Ya STRING
userName Username 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 delete 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. Ketika 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 record). 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 bulk di OceanBase. Tersedia di VVR 11.5 dan versi lebih baru.

Sebelum menggunakan impor bypass, periksa batasan berikut:

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

  • Penguncian tabel selama impor: Tabel tujuan 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 Username database. Ya STRING
tenant-name Nama tenant OceanBase. Ya STRING
schema-name Untuk tenant MySQL: nama database. Untuk tenant 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 tenant 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 record yang dibuffer sebelum satu penulisan ke OceanBase. Tidak INTEGER 1024
dup-action Perilaku ketika ditemukan primary key duplikat. STOP_ON_DUP: gagalkan impor. REPLACE: timpa baris yang ada. IGNORE: buang baris yang masuk. Tidak STRING REPLACE
load-method Mode impor. full: impor bypass standar. inc: mode inkremental, memeriksa konflik primary key (observer 4.3.2+, dup-action=REPLACE tidak didukung). inc_replace: mode replace inkremental, menimpa baris yang ada secara langsung tanpa pemeriksaan konflik (observer 4.3.2+, parameter dup-action diabaikan). Tidak STRING full
max-error-rows Jumlah maksimum baris error yang ditoleransi. Baris error mencakup: primary key duplikat ketika 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 antara 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