近期客户的一套oceanbase备份新的任务一直处理PENDING状态,查询系统表 __all_virtual_sys_task_status也没有未完成的备份任务,而导致的备份排队。任务躺在 RS 备份调度队列里,调度器从未给它选出目标 OBServer 下发。
问题现象

| 字段 | 值 | 解读 |
|---|---|---|
tenant_id / job_id / task_id / backup_set_id | 1014 / 45 / 45 / 45 | 该租户第 45 个备份集,任务粒度是 LS 级任务 |
task_type | BACKUP_META | 备份集的首个 LS 任务(元数据)。它不推进 → 整个 backup_set / job 都不会前进 → 观感就是”备份卡住” |
backup_type / date | FULL / 20260907 | 全量备份,日期 2026-09-07 |
status | PENDING | 已生成并入队,等调度器把它推进为 DOING |
svr_ip / svr_port | 空 / 0 | 从未被指派到任何 OBServer(关键证据) |
task_trace_id | 空 | 同上,说明任务没有被真正下发执行过 |
gmt_create / gmt_modified | 18:20:07.167394 / 18:20:07.188308 | 仅相差 20ms,写库后再没有被更新过一次 |
start_ts | 1788776407166125 | 换算 = 2026-09-07 18:20:07.166125(UTC+8),≈ gmt_create → 不是”等 start_ts 时间窗” |
result / comment / retry_id | 0 / 空 / 0 | 没执行过、没失败、没重试 → 排除“执行报错重试” |
black_list | 空 | 排除“所有副本机都被拉黑导致选不出目标机” |
input/output_bytes、tablet_count、file_count | 全 0 | 佐证:没有任何实际备份动作发生 |
max_tablet_checkpoint_scn | 0 | 元数据未采集 |
检查所有未结束的备份任务
select datediff(now(), start_time) >= 1 from oceanbase.__all_virtual_sys_task_status where task_type like '%BACKUP%';
检查当前备份作业
select * from oceanbase.__all_virtual_backup_job;
常见原因
备份任务是并行执行但是串行结束,应该检查是否有其他任务失败无法退出。这里从系统表并没有找到PENDING备份任务前的备份任务,如果有可以重启 __all_virtual_sys_task_status 表中 task_type 为 BACKUP 的 OBServer。
还有一种情况是系统表里没有,但是在observer内存级存在残留, 这样出会现取消任务,重新发起备份而不调度的现象。
不是执行阶段的问题,而是调度(选机器 + 下发)阶段之前就停住了。
最可能的 3 个方向:
① 该租户备份调度服务线程没在跑 / 被 hang 住(RS 切主、meta 租户 SYS_LS 无 leader、存储介质 hang)
② 旧 job 处于非终态(尤其卡在 CANCELING)堵住了该租户后续所有 job
③ 租户级/集群级资源闸门未打开(磁盘不足被过滤、并发额度引用计数泄漏、租户状态非 NORMAL)
备份原理
备份 job(__all_backup_job / CDB_OB_BACKUP_JOBS)
└── backup set task(__all_backup_task / CDB_OB_BACKUP_TASKS) ← 一次全备/增备
└── LS task(__all_virtual_backup_ls_task) ← 每个日志流一个任务
└── schedule task(RS 内存队列里的可下发单元,带 dst=目标机器)
LS任务状态
| 现场状态 | 含义 | 阻塞点 |
|---|---|---|
INIT | LS 任务已落库,但还没被塞进调度队列 | ObBackupSetTaskMgr / ObBackupDataLSTaskMgr 的 process() 没跑到,或队列满(queue is full, skip add task now),或 add_task 前置失败 |
PENDING | 已入队,等调度器挑机器下发 | pop_task 阶段:选不出目标 OBServer(磁盘过滤、并发额度、机器不可用),或调度/服务线程根本没在跑 |
DOING | 已下发到某台 observer,DB 里 svr_ip 有值 | 阻塞在执行侧(介质慢、tablet 大) |
租户内的串行性与额度【推断】
- 调度器常量:
BACKUP_TASK_CONCURRENCY = 1,并有CONCURRENCY_LIMIT_INTERVAL = 10min、BACKUP_SERVER_DATA_LIMIT_INTERVAL = 20min——单租户同时可下发的任务数极小。 - 有
check_tenant_status_normal_():租户状态非 NORMAL 时不下发。 - 有
check_initiate_twice_by_same_tenant_()、check_has_canceling_job_():同一租户的 job 之间存在互斥/在位检查。
→ 结论:只要一个旧 job(或一个旧任务)卡在非终态、或占着租户级额度不放,该租户后续新建的备份任务就会集体不调度,与”新建的也不调度”完全吻合。
日志关键字速查
# 备份调度主线索
grep -E "ob_backup_task_scheduler|ob_backup_data_scheduler|ob_backup_data_ls_task_mgr|ob_backup_data_set_task_mgr" rootservice.log* | grep -E "WARN|ERROR|failed" | tail -200
| 关键字 | 含义 |
|---|---|
[DATA_BACKUP]schedule backup ls task | 调度器正常轮询(周期日志) |
queue is full, skip add task now | 调度队列满,任务停在 INIT |
[DATA_BACKUP]failed to add task / failed to gen and add task | 入队失败 |
disk_full / OB_SERVER_OUTOF_DISK_SPACE / mark_wait_list_set_tasks_disk_full | 磁盘闸门 |
failed to check leader | 服务非 leader |
tenant status is not normal | 租户状态闸门 |
access storage ... speed=0.00 MB/s | 存储操作 hang |
fail to get ls status / OB_LS_NOT_EXIST | LS 已被删/异常 |
| RS 备份日志刷屏 + RS CPU 高 | 已知问题 |
| waiting_task_cnt | 等待任务的个数 |
| executing_task_cnt | 当前正在执行的任务个数 |

日志中显示当前内存中还有2个备份任务,但是系统表只有1个等待的pending的备份任务。
int ObBackupTaskSchedulerQueue::dump_statistics()
{
int ret = OB_SUCCESS;
if (IS_NOT_INIT) {
ret = OB_NOT_INIT;
LOG_WARN("backup scheduler queue not init", K(ret));
} else {
ObMutexGuard guard(mutex_);
LOG_INFO("backup scheduler task statistics",
"waiting_task_cnt",
get_wait_task_cnt_(),
"executing_task_cnt",
get_in_schedule_task_cnt_());
ObServerBackupScheduleTaskStatMap::HashTable::const_iterator sit = server_stat_map_.get_hash_table().begin();
for (; sit != server_stat_map_.get_hash_table().end(); ++sit) {
LOG_INFO("server task", "stat", sit->v_);
}
ObTenantBackupScheduleTaskStatMap::HashTable::const_iterator tit = tenant_stat_map_.get_hash_table().begin();
for (; tit != tenant_stat_map_.get_hash_table().end(); ++tit) {
LOG_INFO("tenant task", "stat", tit->v_);
}
}
return ret;
}
解决方法
重启内存中有正在备份的ob server.