你正在为 HBase 运维成本高昂而发愁吗?
你是否在寻找实时数据流的最佳落地存储方案?
Flink + OceanBase OBKV-HBase,可能是你一直在等的答案!
为什么你需要关注这个方案?
场景一:HBase 迁移的"最后一公里"
如果你的团队正在考虑从 HBase 迁移到 OceanBase,但担心:
•❌ 现有的 Flink 实时数据流如何无缝迁移?
•❌ HBase API 兼容性如何保证?
•❌ 迁移后吞吐、延迟和稳定性能否满足线上要求?
这个方案正是为你准备的! OceanBase OBKV-HBase 完全兼容 HBase API,配合 Flink 连接器,可让你平滑的进行迁移。
场景二:实时数仓建设中的"数据入湖"
如果你正在构建实时数仓,需要:
•✅ 将 Kafka 中的实时数据流写入宽表存储
•✅ 支持高并发写入,并满足近实时查询与分析需求
•✅ 保证数据一致性和可靠性
Flink + OceanBase 组合能完美解决你的痛点! Flink 负责流式处理与流批统一计算,OceanBase 负责在线存储与查询,满足实时数仓的持续写入和近实时分析场景。
场景三:AI/LLM 应用中的数据存储
在 AI 时代,越来越多的应用需要:
•✅ 实时接入并更新特征数据,支撑高并发在线查询
•✅ 支持半结构化数据建模,快速适配业务字段演进
•✅ 构建稳定的数据处理链路,保障时效性与可用性
OceanBase 的 HBase 模式天然支持灵活的表结构,配合 Flink 的实时处理能力,可以轻松构建 AI 应用的数据底座。
核心优势:为什么选择 OceanBase OBKV-HBase?
🚀 兼容 HBase API
对于熟悉 HBase 的开发者,迁移成本几乎为零!现有的 HBase 应用只需修改连接配置,即可无缝切换到 OceanBase。
⚡ 高性能实时写入
支持缓冲批量写入,可根据业务场景灵活调整吞吐和延迟:
•批处理场景:高吞吐数据导入
•实时场景:延迟低至 毫秒级
🔄 流批一体
既支持 Flink 的流式写入(实时数据处理),也支持批处理写入(历史数据迁移),一套系统满足多种需求。
🛡️ 企业级可靠性
•完善的容错机制,支持自动重试
•OceanBase 原生高可用,支持多副本高可用与强一致能力
🔧 灵活的连接方式
•Config URL 模式:私有化部署,直连 OceanBase 集群
•ODP 模式:公有云服务,通过代理连接,配置更简单
现在开始!👇🏻
Apache Flink 是一个开源的流处理框架,专为处理实时数据流和批处理任务而设计,能够提供低延迟、高吞吐的数据处理能力。OBKV-HBase 是 OceanBase 提供的兼容 HBase 接口的宽表数据库,专注于海量半结构化/结构化数据的存储和极致的访问性能。
为了让 Flink 能够将数据写入 OBKV-HBase,OceanBase 提供了专门的 Flink OBKV HBase 连接器(flink-connector-obkv-hbase)。该连接器基于 obkv-hbase-client-java 实现,支持通过 Flink SQL 将流式或批量数据实时写入 OceanBase 的 HBase 模式表中。
本文将详细介绍如何使用 Flink SQL 客户端和 OBKV HBase 连接器完成数据写入任务,包括环境准备、配置说明、使用示例和最佳实践。
什么是 OBKV HBase
OBKV HBase 是 OceanBase 提供的一种兼容 HBase API 的数据访问方式。它允许您:
•使用 HBase 的表模型和数据结构(rowkey、column family、qualifier)
•通过 HBase 客户端 API 访问存储在 OceanBase 中的数据
•将现有的 HBase 应用平滑迁移到 OceanBase
在 OceanBase 中,HBase 表通过特殊的命名规范进行映射:每个 column family 对应一张物理表,表名格式为 hbase_table_name$family_name。
前提条件
在使用 OBKV HBase 连接器前,确认以下信息:
软件版本要求
| 软件 | 版本要求 | 说明 |
|---|---|---|
| Apache Flink | 1.15 或更高版本 | 推荐使用 Flink 1.15+ |
| JDK | 8 或更高版本 | 建议使用 JDK 8 或 JDK 11 |
| OceanBase | 4.2.1及以上版本 |
环境准备
1.下载连接器 JAR 包您需要下载包含所有依赖的 SQL JAR 文件 flink-sql-connector-obkv-hbase-${version}.jar:
◦Maven Central(正式版本):https://repo1.maven.org/maven2/com/oceanbase/flink-sql-connector-obkv-hbase/
◦Sonatype Snapshots(快照版本):https://s01.oss.sonatype.org/content/repositories/snapshots/com/oceanbase/flink-sql-connector-obkv-hbase/
2.部署 JAR 包到 Flink将下载的 JAR 文件放置到 Flink 的 lib 目录下:
cp flink-sql-connector-obkv-hbase-${version}.jar $FLINK_HOME/lib/
- 准备连接信息
根据您的连接方式,准备以下信息:
Config URL 模式(直连):
▪OceanBase 集群的 Config URL(可通过 SHOW PARAMETERS LIKE 'obconfig_url' 查询)
▪非 sys 租户的用户名和密码(格式:user@tenant#cluster)
▪sys 租户的用户名和密码
ODP 模式(代理连接):
▪ODP 的 IP 地址
▪ODP 的 RPC 端口(默认 2885)
▪非 sys 租户的用户名和密码(格式:user@tenant#cluster)
- 在 OceanBase 中创建表在使用连接器前,需要先在 OceanBase 中创建对应的 HBase 表结构。
快速开始
本节将指导您快速上手使用 OBKV HBase 连接器,完成第一次数据写入。
步骤 1:创建 HBase 表
在 OceanBase 中,HBase 表的每个 column family 对应一张物理表。表名格式为 hbase_table_name$family_name。
例如,要创建一个名为 user_info 的 HBase 表,包含 basic 和 contact 两个 column family:
-- 连接到 OceanBase 数据库
USE your_database;
-- 创建 basic family 对应的表
CREATE TABLE `user_info$basic` (
`K` varbinary(1024) NOT NULL, -- rowkey
`Q` varbinary(256) NOT NULL, -- qualifier(列名)
`T` bigint(20) NOT NULL, -- timestamp
`V` varbinary(1024) DEFAULT NULL, -- value(列值)
PRIMARY KEY (`K`, `Q`, `T`)
);
-- 创建 contact family 对应的表
CREATE TABLE `user_info$contact` (
`K` varbinary(1024) NOT NULL,
`Q` varbinary(256) NOT NULL,
`T` bigint(20) NOT NULL,
`V` varbinary(1024) DEFAULT NULL,
PRIMARY KEY (`K`, `Q`, `T`)
);
表结构说明:
•K:rowkey,即 HBase 中的行键
•Q:qualifier,即 column family 中的列名
•T:timestamp,时间戳
•V:value,列的值
步骤 2:启动 Flink 集群
部署完 JAR 包后,需要启动 Flink 集群:
# 进入 Flink 安装目录
cd $FLINK_HOME
# 启动 Flink 集群(包括 JobManager 和 TaskManager)
./bin/start-cluster.sh
启动成功后,您可以访问 Flink Web UI 验证集群状态:
•默认地址:http://localhost:8081
•您应该能看到 JobManager 和至少一个 TaskManager 正在运行。
常见问题排查:
如果启动失败,可以检查日志:
# 查看 JobManager 日志
tail -f $FLINK_HOME/log/flink-*-standalonesession-*.log
# 查看 TaskManager 日志
tail -f $FLINK_HOME/log/flink-*-taskexecutor-*.log
步骤 3:启动 Flink SQL Client
使用 SQL Client 来执行 SQL 语句并写入数据:
# 进入 Flink 安装目录(如果还未在该目录)
cd $FLINK_HOME
# 启动 SQL Client
./bin/sql-client.sh
成功启动后,您将看到 Flink SQL Client 的交互式命令行界面:
▒▓██▓██▒
▓████▒▒█▓▒▓███▓▒
▓███▓░░ ▒▒▒▓██▒ ▒
░██▒ ▒▒▓▓█▓▓▒░ ▒████
██▒ ░▒▓███▒ ▒█▒█▒
░▓█ ███ ▓░▒██
▓█ ▒▒▒▒▒▓██▓░▒░▓▓█
█░ █ ▒▒░ ███▓▓█ ▒█▒▒▒
████░ ▒▓█▓ ██▒▒▒ ▓███▒
░▒█▓▓██ ▓█▒ ▓█▒▓██▓ ░█░
▓░▒▓████▒ ██ ▒█ █▓░▒█▒░▒█▒
███▓░██▓ ▓█ █ █▓ ▒▓█▓▓█▒
░██▓ ░█░ █ █▒ ▒█████▓▒ ██▓░▒
███░ ░ █░ ▓ ░█ █████▒░░ ░█░▓ ▓░
██▓█ ▒▒▓▒ ▓███████▓░ ▒█▒ ▒▓ ▓██▓
▒██▓ ▓█ █▓█ ░▒█████▓▓▒░ ██▒▒ █ ▒ ▓█▒
▓█▓ ▓█ ██▓ ░▓▓▓▓▓▓▓▒ ▒██▓ ░█▒
▓█ █ ▓███▓▒░ ░▓▓▓███▓ ░▒░ ▓█
██▓ ██▒ ░▒▓▓███▓▓▓▓▓██████▓▒ ▓███ █
▓███▒ ███ ░▓▓▒░░ ░▓████▓░ ░▒▓▒ █▓
█▓▒▒▓▓██ ░▒▒░░░▒▒▒▒▓██▓░ █▓
██ ▓░▒█ ▓▓▓▓▒░░ ▒█▓ ▒▓▓██▓ ▓▒ ▒▒▓
▓█▓ ▓▒█ █▓░ ░▒▓▓██▒ ░▓█▒ ▒▒▒░▒▒▓█████▒
██░ ▓█▒█▒ ▒▓▓▒ ▓█ █░ ░░░░ ░█▒
▓█ ▒█▓ ░ █░ ▒█ █▓
█▓ ██ █░ ▓▓ ▒█▓▓▓▒█░
█▓ ░▓██░ ▓▒ ▓█▓▒░░░▒▓█░ ▒█
██ ▓█▓░ ▒ ░▒█▒██▒ ▓▓
▓█▒ ▒█▓▒░ ▒▒ █▒█▓▒▒░░▒██
░██▒ ▒▓▓▒ ▓██▓▒█▒ ░▓▓▓▓▒█▓
░▓██▒ ▓░ ▒█▓█ ░░▒▒▒
▒▓▓▓▓▓▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒░░▓▓ ▓░▒█░
______ _ _ _ _____ ____ _ _____ _ _ _ BETA
| ____| (_) | | / ____|/ __ \| | / ____| (_) | |
| |__ | |_ _ __ | | __ | (___ | | | | | | | | |_ ___ _ __ | |_
| __| | | | '_ \| |/ / \___ \| | | | | | | | | |/ _ \ '_ \| __|
| | | | | | | | < ____) | |__| | |____ | |____| | | __/ | | | |_
|_| |_|_|_| |_|_|\_\ |_____/ \___\_\______| \_____|_|_|\___|_| |_|\__|
Welcome! Enter 'HELP;' to list all available commands. 'QUIT;' to exit.
Flink SQL>
现在您可以在 SQL Client 中执行 SQL 语句了。
步骤 4:创建 Flink 表(使用 ODP 模式)
在 Flink SQL Client 中创建目标表,映射到 OceanBase 的 HBase 表:
CREATE TABLE user_info_sink (
rowkey STRING,
basic ROW<name STRING, age INT>,
contact ROW<email STRING, phone STRING>,
PRIMARY KEY (rowkey) NOT ENFORCED
) WITH (
'connector' = 'obkv-hbase',
'odp-mode' = 'true',
'odp-ip' = '127.0.0.1',
'odp-port' = '2885',
'schema-name' = 'your_database',
'table-name' = 'user_info',
'username' = 'user@tenant#cluster',
'password' = 'your_password'
);
表定义说明:
•rowkey:对应 HBase 的 rowkey
•basic、contact:使用 Flink 的 ROW 类型表示 column family
•ROW 类型中的字段对应 HBase 的 qualifier
配置说明:
•connector:固定值 obkv-hbase
•odp-mode:设置为 true 启用 ODP 模式
•odp-ip 和 odp-port:ODP 的地址和端口
•schema-name:OceanBase 数据库名
•table-name:HBase 表名(不包含列族后缀)
•username 和 password:OceanBase 用户凭证
步骤 5:写入测试数据
INSERT INTO user_info_sink VALUES
('user001', ROW('Alice', 25), ROW('alice@example.com', '13800138000')),
('user002', ROW('Bob', 30), ROW('bob@example.com', '13900139000')),
('user003', ROW('Charlie', 28), ROW('charlie@example.com', '13700137000'));
执行成功后,您将看到类似如下的输出:
[INFO] Submitting SQL update statement to the cluster...
[INFO] SQL update statement has been successfully submitted to the cluster:
Job ID: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
步骤 6:验证数据写入
在 OceanBase 客户端中查询验证数据是否成功写入:
-- 连接到 OceanBase 数据库
USE your_database;
-- 查询 basic family 的数据
SELECT K, Q, V FROM `user_info$basic` ORDER BY K, Q;
-- 查询 contact family 的数据
SELECT K, Q, V FROM `user_info$contact` ORDER BY K, Q;
预期结果:
您应该能看到写入的数据,其中:
•K 列存储 rowkey
•Q 列存储 qualifier(如 name、age、email、phone)
•V 列存储对应的值
步骤 7:关闭和清理(可选)
完成测试后,您可以停止 Flink 集群:
# 停止 Flink 集群
cd $FLINK_HOME
./bin/stop-cluster.sh
在 SQL Client 中退出:
-- 在 SQL Client 中执行
QUIT;
或者直接按 Ctrl+D 退出 SQL Client。
配置参数
本节详细介绍 OBKV HBase 连接器支持的所有配置参数。
必需参数
| 参数名 | 类型 | 说明 |
|---|---|---|
| connector | String | 连接器标识,固定值:obkv-hbase |
| username | String | 非 sys 租户的用户名,格式:user@tenant#cluster 例如:root@test#obcluster |
| password | String | 用户密码 |
| schema-name | String | OceanBase 的数据库名(schema) |
| table-name | String | HBase 表名(不包含 family 后缀) 例如:表名为 user_info,实际物理表为 user_info、contact |
连接模式参数
OBKV HBase 连接器支持两种连接模式,您需要根据实际情况选择其一。
Config URL 模式(直连)
适用于直接连接 OceanBase 集群的场景,需要提供 sys 租户的权限。
| 参数名 | 必需 | 类型 | 说明 |
|---|---|---|---|
| url | 是 | String | OceanBase 集群的 Config URL 可通过 SHOW PARAMETERS LIKE 'obconfig_url' 查询 格式示例:http://127.0.0.1:8080/services?Action=ObRootServiceInfo\&ObCluster=obcluster |
| sys.username | 是 | String | sys 租户的用户名,通常为 root |
| sys.password | 是 | String | sys 租户的密码 |
ODP 模式(代理连接)
适用于通过 ODP(OceanBase Database Proxy)连接的场景,配置更简单,无需 sys 租户权限。
| 参数名 | 必需 | 默认值 | 类型 | 说明 |
|---|---|---|---|---|
| odp-mode | 是 | false | Boolean | 设置为 true 启用 ODP 模式 |
| odp-ip | 是 | 无 | String | ODP 的 IP 地址 |
| odp-port | 否 | 2885 | Integer | ODP 的 RPC 端口 |
性能调优参数
| 参数名 | 必需 | 默认值 | 类型 | 说明 |
|---|---|---|---|---|
| sync-write | 否 | false | Boolean | 是否启用同步写入模式 - true:每条数据立即写入,不使用缓冲区 - false:使用缓冲区批量写入(推荐) |
| buffer-flush.interval | 否 | 1s | Duration | 缓冲区刷新间隔 支持格式:1s、500ms、2m 设置为 0 关闭定时刷新 |
| buffer-flush.buffer-size | 否 | 1000 | Integer | 缓冲区大小(行数) 达到该行数后触发刷新 |
| max-retries | 否 | 3 | Integer | 写入失败时的最大重试次数 |
| hbase.properties | 否 | 无 | String | 传递给 obkv-hbase-client-java 的额外配置 多个配置项用分号分隔 格式:key1=value1;key2=value2 |
使用示例
示例 1:使用 Config URL 模式连接
此示例展示如何通过 Config URL 直接连接 OceanBase 集群。
创建 OceanBase 表
USE test;
CREATE TABLE `product$info` (
`K` varbinary(1024) NOT NULL,
`Q` varbinary(256) NOT NULL,
`T` bigint(20) NOT NULL,
`V` varbinary(1024) DEFAULT NULL,
PRIMARY KEY (`K`, `Q`, `T`)
);
CREATE TABLE `product$price` (
`K` varbinary(1024) NOT NULL,
`Q` varbinary(256) NOT NULL,
`T` bigint(20) NOT NULL,
`V` varbinary(1024) DEFAULT NULL,
PRIMARY KEY (`K`, `Q`, `T`)
);
创建 Flink 表并写入数据
-- 创建目标表
CREATE TABLE product_sink (
product_id STRING,
info ROW<name STRING, category STRING>,
price ROW<current DOUBLE, discount DOUBLE>,
PRIMARY KEY (product_id) NOT ENFORCED
) WITH (
'connector' = 'obkv-hbase',
'url' = 'http://127.0.0.1:8080/services?Action=ObRootServiceInfo&ObCluster=obcluster',
'schema-name' = 'test',
'table-name' = 'product',
'username' = 'root@test#obcluster',
'password' = '123456',
'sys.username' = 'root',
'sys.password' = 'admin123'
);
-- 插入数据
INSERT INTO product_sink VALUES
('P001', ROW('Laptop', 'Electronics'), ROW(5999.00, 5499.00)),
('P002', ROW('Mouse', 'Electronics'), ROW(99.00, 79.00)),
('P003', ROW('Keyboard', 'Electronics'), ROW(299.00, 249.00));
示例 2:使用 ODP 模式连接
此示例展示如何通过 ODP 代理连接 OceanBase,配置更简洁。
-- 创建目标表
CREATE TABLE order_sink (
order_id STRING,
customer ROW<name STRING, vip_level INT>,
details ROW<amount DECIMAL(10,2), status STRING>,
PRIMARY KEY (order_id) NOT ENFORCED
) WITH (
'connector' = 'obkv-hbase',
'odp-mode' = 'true',
'odp-ip' = '192.168.1.100',
'odp-port' = '2885',
'schema-name' = 'ecommerce',
'table-name' = 'orders',
'username' = 'app_user@prod#cluster',
'password' = 'app_password',
'buffer-flush.buffer-size' = '2000',
'buffer-flush.interval' = '2s'
);
-- 插入数据
INSERT INTO order_sink VALUES
('O20250109001', ROW('Alice', 3), ROW(1580.50, 'PAID')),
('O20250109002', ROW('Bob', 1), ROW(299.00, 'PENDING')),
('O20250109003', ROW('Charlie', 2), ROW(899.99, 'PAID'));
示例 3:从 Kafka 实时写入
此示例展示如何从 Kafka 读取数据并实时写入 OceanBase OBKV HBase。
-- 创建 Kafka 源表
CREATE TABLE kafka_source (
user_id STRING,
user_name STRING,
age INT,
email STRING,
phone STRING,
event_time TIMESTAMP(3),
WATERMARK FOR event_time AS event_time - INTERVAL '5' SECOND
) WITH (
'connector' = 'kafka',
'topic' = 'user-events',
'properties.bootstrap.servers' = 'localhost:9092',
'properties.group.id' = 'flink-obkv-group',
'scan.startup.mode' = 'latest-offset',
'format' = 'json'
);
-- 创建 OBKV HBase 目标表
CREATE TABLE user_hbase_sink (
user_id STRING,
profile ROW<name STRING, age INT>,
contact ROW<email STRING, phone STRING>,
PRIMARY KEY (user_id) NOT ENFORCED
) WITH (
'connector' = 'obkv-hbase',
'odp-mode' = 'true',
'odp-ip' = '127.0.0.1',
'schema-name' = 'realtime_db',
'table-name' = 'users',
'username' = 'stream_user@tenant#cluster',
'password' = 'password',
'buffer-flush.interval' = '500ms',
'buffer-flush.buffer-size' = '5000'
);
-- 实时写入数据
INSERT INTO user_hbase_sink
SELECT
user_id,
ROW(user_name, age) AS profile,
ROW(email, phone) AS contact
FROM kafka_source;
最佳实践
表结构设计建议
HBase 表命名规范
在 OceanBase 中,HBase 表通过特定的命名规范映射到物理表:
•格式:hbase_table_name$family_name
•示例:HBase 表 user_info 有两个 column family basic 和 contact,则在 OceanBase 中创建:
◦user_info$basic
◦user_info$contact
表结构固定格式
每个 family 对应的物理表结构是固定的:
CREATE TABLE `table_name$family_name` (
`K` varbinary(1024) NOT NULL, -- rowkey
`Q` varbinary(256) NOT NULL, -- qualifier
`T` bigint(20) NOT NULL, -- timestamp
`V` varbinary(1024) DEFAULT NULL, -- value
PRIMARY KEY (`K`, `Q`, `T`)
);
Flink 表定义
在 Flink SQL 中,使用 ROW 类型表示 column family:
CREATE TABLE flink_table (
rowkey STRING, -- 主键
family1 ROW<col1 INT, col2 STRING>, -- column family 1
family2 ROW<col3 DOUBLE, col4 BIGINT>, -- column family 2
PRIMARY KEY (rowkey) NOT ENFORCED
) WITH (...);
性能优化建议
1. 批量写入优化
根据不同场景调整缓冲区参数:
高吞吐批处理场景:
'buffer-flush.buffer-size' = '5000', -- 增大缓冲区
'buffer-flush.interval' = '5s' -- 延长刷新间隔
低延迟实时场景:
'buffer-flush.buffer-size' = '500', -- 减小缓冲区
'buffer-flush.interval' = '500ms' -- 缩短刷新间隔
超低延迟场景:
'sync-write' = 'true' -- 启用同步写入,不使用缓冲
2. 并行度设置
根据数据量和集群资源设置合适的并行度:
-- 在 Flink SQL Client 中设置
SET 'parallelism.default' = '4';
连接方式选择
连接器支持两种连接模式。具体的连接配置方式取决于您的部署类型:
•私有化部署:请使用下述的 Config URL 模式(直连)
•公有云 OBKV 服务:请使用下述的 ODP 模式(代理连接)
更多配置详情:关于 OBKV-HBase 客户端的详细连接参数配置,请参考 OceanBase 官方文档 - OBKV-HBase 客户端连接配置。
Config URL 模式(直连)
通过 Config URL 直接连接 OceanBase 集群,适用于私有化部署场景。需要提供:
•Config URL(通过 SHOW PARAMETERS LIKE 'obconfig_url' 查询)
•sys 租户的用户名和密码
•非 sys 租户的用户名和密码
ODP 模式(代理连接)
通过 ODP(OceanBase Database Proxy)连接,需要提供:
•ODP 的 IP 地址和 RPC 端口
•非 sys 租户的用户名和密码(无需 sys 租户信息)
错误处理和监控
1. 连接错误
问题:无法连接到 OceanBase
排查步骤:
•检查网络连通性
•验证用户名和密码
•确认 ODP IP 和端口是否正确
•检查 Config URL 格式是否正确
2. 写入失败
问题:数据写入失败
排查步骤:
•检查 Flink 任务日志
•确认表结构是否正确创建
•验证 schema-name 和 table-name 配置
•检查用户权限是否足够
3. 性能问题
问题:写入速度慢
优化建议:
•增大 buffer-flush.buffer-size
•延长 buffer-flush.interval
•提高 Flink 并行度
•检查网络带宽和 OceanBase 集群负载
参考信息
•OceanBase 官方文档:https://www.oceanbase.com/docs
•Flink 官方文档:https://nightlies.apache.org/flink/flink-docs-stable/
•项目 GitHub 仓库:https://github.com/oceanbase/flink-connector-oceanbase
•obkv-hbase-client-java:https://github.com/oceanbase/obkv-hbase-client-java
•Apache Flink Connector HBase:https://github.com/apache/flink-connector-hbase
如需更多帮助,请访问 OceanBase 问答社区。
鸣谢
本文在整理与编写过程中,特别感谢生态团队孙朝阳老师、赵明远老师的大力支持与专业指导。
两位老师在 Flink 与 OceanBase 生态集成、Connector 能力梳理以及场景化实践总结方面提供了大量专业建议和宝贵经验。
在此谨致诚挚谢意。
立即试用 OceanBase 企业版,体验国产数据库能力