Oceanbase备份失败 status一直处理”PENDING”

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

问题现象

字段值解读
tenant_id / job_id / task_id / backup_set_id1014 / 45 / 45 / 45该租户第 45 个备份集,任务粒度是 LS 级任务
task_typeBACKUP_META备份集的首个 LS 任务(元数据)。它不推进 → 整个 backup_set / job 都不会前进 → 观感就是”备份卡住”
backup_type / dateFULL / 20260907全量备份,日期 2026-09-07
statusPENDING已生成并入队,等调度器把它推进为 DOING
svr_ip / svr_port空 / 0从未被指派到任何 OBServer(关键证据)
task_trace_id空同上,说明任务没有被真正下发执行过
gmt_create / gmt_modified18:20:07.167394 / 18:20:07.188308仅相差 20ms,写库后再没有被更新过一次
start_ts1788776407166125换算 = 2026-09-07 18:20:07.166125(UTC+8),≈ gmt_create → 不是”等 start_ts 时间窗”
result / comment / retry_id0 / 空 / 0没执行过、没失败、没重试 → 排除“执行报错重试”
black_list空排除“所有副本机都被拉黑导致选不出目标机”
input/output_bytes、tablet_count、file_count全 0佐证:没有任何实际备份动作发生
max_tablet_checkpoint_scn0元数据未采集

检查所有未结束的备份任务

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任务状态

现场状态含义阻塞点
INITLS 任务已落库,但还没被塞进调度队列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_EXISTLS 已被删/异常
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.

Leave a Comment