首批通过分布式安全可靠测评,为关键业务系统打造
主流 AP 数据库数据迁移至 OceanBase 最佳实践
更新时间:2026-06-18 10:13:19
概述
本文面向将主流分析型处理(AP, Analytical Processing)数据库——包括华为云 DWS、StarRocks 和阿里云 ADB(AnalyticDB for MySQL)——迁移至 OceanBase 的用户,提供端到端的数据迁移最佳实践。
OceanBase 支持通过外部表(External Table)机制实现高效、可扩展的旁路导入(Direct Load),适用于大规模数据迁移场景。
总体迁移方案
推荐采用 “导出-中转-导入”三阶段架构:
- 导出阶段:在源 AP 数据库中,通过可写外部表将数据导出为结构化文件(如 Parquet 或 ORC),存储至对象存储(如 S3、OSS)或 HDFS。
- 中转阶段:数据暂存于对象存储或分布式文件系统,作为中间媒介。
- 导入阶段:OceanBase 通过只读外部表直接读取上述文件,并利用旁路导入能力将数据高效写入目标表。
该方案具备以下优势:
- 解耦源与目标系统,降低对生产环境的影响;
- 利用列式存储格式提升 I/O 与压缩效率;
- 支持并行、旁路导入,显著提升吞吐。
源数据库数据导出
支持的数据库
以下 AP 数据库均原生支持通过外部表导出数据:
- 华为云 GaussDB(DWS)
- StarRocks
- 阿里云 AnalyticDB for MySQL(ADB)
推荐导出格式
优先选择列式存储格式:Parquet 或 ORC。
格式优势
- 高压缩率:显著减少中间数据体积,节省存储与网络带宽;
- 强类型与嵌套结构支持:避免 CSV 等文本格式中的分隔符冲突、转义等问题;
- 高性能读写:相比 CSV,导入/导出性能提升约 20%–30%,尤其适合宽表和复杂数据类型。
官方操作文档参考
| 数据库 | 文档链接 |
|---|---|
| DWS | DWS 数据导出指南 |
| StarRocks | 使用 INSERT INTO FILES 导出数据 |
| ADB | 创建外部表 导出数据至 OSS |
导出示例
StarRocks 导出示例
INSERT INTO FILES(
"path" = "s3://mybucket/unload/data1",
"format" = "parquet",
"compression" = "uncompressed",
"target_max_file_size" = "1024", -- 单位:字节(示例为 1KB)
"aws.s3.access_key" = "xxxxxxxxxx",
"aws.s3.secret_key" = "yyyyyyyyyy",
"aws.s3.region" = "us-west-2"
)
SELECT * FROM sales_records;
ADB 导出示例
CREATE EXTERNAL TABLE IF NOT EXISTS adb_external_demo.osstest3 (
A STRUCT<var1:STRING, var2:INT>
)
STORED AS PARQUET
LOCATION 'oss://testBucketName/osstest/Parquet';
INSERT INTO adb_external_demo.osstest3 SELECT * FROM t1;
说明
请确保目标存储桶(Bucket)已正确配置访问权限,并验证网络连通性。
全量数据导入 OceanBase
OceanBase 提供两种主流方式从对象存储导入数据:
使用 INSERT INTO URL 外部表导入
适用于直接指定文件路径的场景,语法灵活,支持正则匹配文件名。
INSERT /*+ direct(true, 0) enable_parallel_dml parallel(32) */ INTO t1
SELECT * FROM FILES(
location = 's3://data/?host=xxx&access_id=xxx&access_key=xxx',
format = (TYPE = 'PARQUET'),
pattern = 'datafiles$'
);
使用 LOAD DATA 语句导入
适合标准化批量导入任务。
LOAD DATA /*+ direct(true,0) parallel(2) */
FROM 's3://data/?host=xxx&access_id=xxx&access_key=xxx'
INTO TABLE t1
FORMAT (type = 'PARQUET');
说明
两种方式均支持 direct(true) 直写模式和并行度控制,可大幅提升导入性能。
详细语法与参数说明,请参见:全量旁路导入。
直接读取外部数据源(高级场景)
除对象存储外,OceanBase 还支持通过外部表直接访问 HDFS、ODPS 等异构数据源,适用于已有数据湖架构的用户。
HDFS 数据源
语法示例如下:
INSERT INTO t1
SELECT * FROM files(
LOCATION = 'hdfs://${namenode_host}:${namenode_port}/user?principal=hdfs/hadoop@EXAMPLE.COM&keytab=/path/to/hdfs.keytab&krb5conf=/path/to/krb5.conf&configs=dfs.data.transfer.protection=authentication,privacy',
FORMAT = (
TYPE = 'CSV',
FIELD_DELIMITER = ',',
FIELD_OPTIONALLY_ENCLOSED_BY = '\''
),
PATTERN = 'test_tbl1.csv'
);
ODPS(MaxCompute)数据源
语法示例如下:
INSERT INTO t1
SELECT * FROM SOURCE (
TYPE = 'ODPS',
ACCESSID = 'your_id',
ACCESSKEY = 'your_key',
ENDPOINT = 'http://service.cn-hangzhou.maxcompute.aliyun.com/api',
PROJECT_NAME = 'my_project',
TABLE_NAME = 'my_table'
);
参考文档:CREATE EXTERNAL TABLE(MySQL 模式)
增量数据同步策略
当前 OceanBase 4.4.x 版本的旁路导入功能仅支持全量导入。针对持续写入场景,推荐采用 “全量 + 增量”混合方案。
分区级全量导入(有限增量支持)
若源数据按时间分区(如,按月),可对新分区执行全量旁路导入:
-- 导入指定分区(追加)
INSERT /*+ direct(true, 0) enable_parallel_dml parallel(32) */ INTO t1 PARTITION(p0, p1)
SELECT * FROM external_table;
-- 覆盖指定分区
INSERT /*+ direct(true, 0) enable_parallel_dml parallel(32) */ OVERWRITE t1 PARTITION(p0, p1)
SELECT * FROM external_table;
局限性
- 表级锁限制:即使指定分区,导入过程仍会锁定整张表,无法并行执行多个分区的导入任务;
- 隐藏表开销:每次导入需为整表创建临时隐藏表,当分区数量庞大时,元数据操作耗时显著增加。
优化建议:对于高分区表,可结合 分区交换(Partition Exchange) 技术规避上述问题。
使用 OMS 实现增量同步
对于需要实时同步增量变更的场景,推荐使用 OceanBase Migration Service(OMS):
适用条件:源端具备 CDC(Change Data Capture)能力;
AP 数据库限制:DWS、StarRocks、ADB 等通常不提供原生 CDC 输出;
推荐做法:从这些 AP 数据库的上游业务系统(如 MySQL、Oracle)捕获增量日志,并通过 OMS 同步至 OceanBase。
支持情况:OMS 支持 Oracle(含 OGG)、MySQL 等主流 OLTP 数据库的增量同步。
详细操作指南请参见:使用 OMS 进行数据迁移