首批通过分布式安全可靠测评,为关键业务系统打造
OceanBase 数据库 V4.2.1 版本中表级恢复恢复一张/组分区数较多的表恢复速度慢问题
更新时间:2026-05-19 09:51
问题现象
在 OceanBase 数据库 V4.2.1 版本中使用表级恢复功能恢复一张/组分区数较多的表,恢复过程组户级配置项 ddl_thread_score 设置得较小,表恢复速度较慢。 特别是数据量不大、分区数较多的表,表恢复速度较慢,不符合预期。
关键诊断信息
触发条件
OceanBase 数据库 V4.2.1 版本中使用表级恢复功能恢复一张/组分区数较多的表,恢复过程组户级配置项 ddl_thread_score 设置得较小。
事前巡检
在使用表级恢复一张/组分区数较多的表之前,可以通过以下命令查看 OBServer 节点上表级恢复的工作线程数:
show parameters like '%ddl_thread_score%' tenant=$tenant_name;
若 ddl_thread_score 设置的值较小,则需要通过以下命令增加工作线程数:
alter system set ddl_thread_score=INT tenant=$tenant_name;
事后诊断
诊断正在执行中的表级恢复任务:
通过命令获取表级恢复每张表的导表任务,查看每张的表恢复时间。
SELECT * FROM oceanbase.CDB_OB_IMPORT_TABLE_TASKS WHERE TENANT_ID = $tenant_id;
诊断已执行完成的表级恢复任务:
通过命令获取表级恢复每张表的导表任务,查看每张的表恢复时间。
SELECT * FROM CDB_OB_IMPORT_TABLE_TASK_HISTORY WHERE TENANT_ID = $tenant_id;观察每张表的恢复结果,观察到分区数多的表恢复速度比较慢,特别是数据量不大、分区数多的表恢复速度不符合预期。
通过命令查看 OBServer 节点上表级恢复的工作线程数,其中组户级配置项
ddl_thread_score值设置的较小。SHOW PARAMETERS LIKE '%ddl_thread_score%' TENANT=$tenant_name;
问题原因
在 OceanBase 数据库 V4.2.1 版本中使用表级恢复功能时遇到的性能问题主要由以下三个因素叠加导致:
版本的恢复机制限制:多张表的恢复强制串行执行。
当需要恢复多张表时,当前版本的恢复机制要求每张表的恢复任务按顺序依次执行,无法通过并行任务同时恢复多张表。
版本的恢复机制限制:分区恢复单线程模式。
无论需要恢复的表是单分区还是多分区,当前版本的恢复机制每个分区的恢复任务均需要通过单线程顺序执行完成,无法对单分区的数据恢复任务进行线程级并行加速。
表级恢复工作线程数配置过低。
当前版本的分区表的恢复理论上支持跨分区并行恢复(不同分区分配不同线程),但 OBServer 节点分配的表级恢复最大工作线程数量受限于租户级配置项
ddl_thread_score。若ddl_thread_score值设置过小,可用线程数不足,导致大量分区在排队等待线程资源。
问题的风险及影响
表级恢复恢复速度较慢。
影响租户
影响 OceanBase 数据库中的 SYS 租户和 Oracle 租户以及 MySQL 租户。
影响版本
OceanBase 数据库企业版 V4.2.1 GA(oceanbase-4.2.1.0-100000182023092722)及之后版本。
解决方法
对于 OceanBase 数据库 V4.2.1 版本中使用表级恢复功能恢复一张/组分区数较多的表,恢复过程组户级配置项
ddl_thread_score设置得较小,表恢复的速度较慢的场景。可以在表级恢复命令执行之前或者执行过程中,通过以下命令增加 OBServer 节点上表级恢复工作线程数,利用当前版本恢复分区表的支持跨分区并行恢复特点一定程度提升表级恢复性能,但多表不支持多表并行恢复。
减少表级恢复和物理恢复的调度等待时间。
ALTER SYSTEM SET _restore_idle_time = '10s'; // 默认 60s设置每个节点 DDL 补数据的 DAG 线程数量。
ALTER SYSTEM SET ddl_thread_score=64 TENANT=$tenant_name; // 默认 0 使用内部值 2完成表级恢复之后将
_restore_idle_time修改回默认值。ALTER SYSTEM SET _restore_idle_time = '60s'; // 默认 60s完成表级恢复之后将
ddl_thread_score修改回默认值。ALTER SYSTEM SET ddl_thread_score=0 TENANT=$tenant_name; // 默认 0 使用内部值 2
对于其余场景,建议客户将 OceanBase 数据库版本升级到 V4.2.5 或 V4.3.5 BP1 版本:
a. V4.2.5/V4.3.5 版本表级恢复,在现有的恢复分区表支持跨分区并行恢复的基础上,进一步支持了每个分区恢复的多线程模式、同时支持并行恢复多张表。
b. V4.3.5 BP1 版本利用快速恢复优化了表级恢复,支持直接从备份介质上读取宏块数据。
涉及 V4.2.5 之后的版本表级恢复的内容,详情参见:表级恢复相关参数介绍。
说明
ddl_thread_score是租户级配置,设置后将一直生效。一般建议表级恢复执行结束之后,将ddl_thread_score恢复成默认值:ALTER SYSTEM SET ddl_thread_score=INT TENANT=$tenant_name;- 表级恢复工作线程和 DDL 重整数据工作线程底层是同一组线程,线程数量受到组户级配置
ddl_thread_score的控制, 两者会互相抢占线程资源影响任务的执行速度。
规避方式
建议客户在创建表时,采用分区表设计:通过利用当前版本恢复分区表的支持跨分区并行恢复特点,提升表级恢复的效率。