首批通过分布式安全可靠测评,为关键业务系统打造
DataX 抽取 OceanBase 数据慢优化
更新时间:2026-05-26 06:26
适用版本
DataX 所有版本。
OceanBase 数据库所有版本。
问题现象
每天抽取 OceanBase 的全量数据库,总共约 5T 大小,预计 4 小时内完成,实际在执行过程中,需要 6.5 小时,不符合预期。
2025-03-26 22:00:46.221 [job-0] INFO StandAloneJobContainerCommunicator - Total 38024818005 records, 3177683945664 bytes | Speed 129.25MB/s, 1621804 records/s | Error 0 records, 0 bytes | All Task WaitWriterTime 2,837,192.250s | All Task WaitReaderTime 264,487.781s | Percentage 100.00%
2025-03-26 22:00:46.226 [job-0] INFO JobContainer -
任务启动时刻 : 2025-03-26 15:29:58
任务结束时刻 : 2025-03-26 22:00:46
任务总计耗时 : 23447s
任务平均流量 : 129.25MB/s
记录写入速度 : 1621804rec/s
读出记录总数 : 38024818005
读写失败总数 : 0
问题原因
DataX reader 读取数据时,会按照主键或者唯一键来切分任务,默认情况下 batch size 是 10w,也就是说把一个读取任务按照 10w 条数据一个子任务来切分,防止数据量太大时单条 SQL 读取时间太长,以及出错之后得从头开始。然而对于分区表来说,每次都去读可能需要扫描全部分区,效率较低。
解决方法
在 reader 中实现按照分区读取数据的特性,以提高分区表的读取效率。
具体操作如下:
在配置文件中,将 splitPk 设置为空,加入 readByPartition 和 queryMode 两个参数即可。

经过上述配置之后,抽取时间由原来的 6.5 小时,优化到 2.5 小时。
2025-03-27 18:29:26.144 [job-0] INFO JobContainer - PerfTrace not enable!
2025-03-27 18:29:26.144 [job-0] INFO StandAloneJobContainerCommunicator - Total 38031275645 records, 3178230850705 bytes | Speed 338.89MB/s, 4252155 records/s | Error 0 records, 0 bytes | All Task WaitWriterTime 305,628.500s | All Task WaitReaderTime 51,006.844s | Percentage 100.00%
2025-03-27 18:29:26.148 [job-0] INFO JobContainer -
任务启动时刻 : 2025-03-27 16:00:21
任务结束时刻 : 2025-03-27 18:29:26
任务总计耗时 : 8944s
任务平均流量 : 338.89MB/s
记录写入速度 : 4252155rec/s
读出记录总数 : 38031275645
读写失败总数 : 0