删除Scheduler Chain生成的批量调度作业时遇ORA-27475错误求助
解决Oracle Scheduler Chain生成作业无法删除的问题
问题分析
报错ORA-27475: "GIA.RUN_CHAIN$UW_RPT_17193" must be a job说明你指定的对象并非常规作业(JOB),而是Scheduler Chain相关的其他对象——这类RUN_CHAIN$前缀的对象通常是链的运行实例,不属于DBMS_SCHEDULER.DROP_JOB的处理范畴,所以直接调用该过程会报错。
解决步骤
1. 先确认对象真实类型
执行以下SQL排查对象的具体类型:
-- 查所有同名对象类型 SELECT owner, object_name, object_type FROM dba_objects WHERE object_name LIKE 'RUN_CHAIN$UW_RPT_%'; -- 查是否为常规作业 SELECT owner, job_name, job_type FROM dba_scheduler_jobs WHERE job_name LIKE 'RUN_CHAIN$UW_RPT_%'; -- 查是否为链对象 SELECT owner, chain_name FROM dba_scheduler_chains WHERE chain_name LIKE 'RUN_CHAIN$UW_RPT_%'; -- 查是否为链运行实例 SELECT owner, run_name FROM dba_scheduler_runs WHERE run_name LIKE 'RUN_CHAIN$UW_RPT_%';
2. 删除链运行实例(最常见情况)
如果查询结果显示是链的运行实例,使用DBMS_SCHEDULER.DROP_RUN删除单个实例:
BEGIN DBMS_SCHEDULER.DROP_RUN( run_name => 'GIA.RUN_CHAIN$UW_RPT_17193', force => TRUE ); END; /
批量删除所有前缀匹配的实例,用动态SQL批量执行:
DECLARE CURSOR c_runs IS SELECT 'BEGIN DBMS_SCHEDULER.DROP_RUN(run_name => ''' || owner || '.' || run_name || ''', force => TRUE); END;' AS sql_stmt FROM dba_scheduler_runs WHERE run_name LIKE 'RUN_CHAIN$UW_RPT_%'; v_count NUMBER := 0; BEGIN FOR rec IN c_runs LOOP EXECUTE IMMEDIATE rec.sql_stmt; v_count := v_count + 1; -- 每删除100个提交一次,避免事务过大 IF v_count MOD 100 = 0 THEN COMMIT; END IF; END LOOP; COMMIT; END; /
3. 删除链对象(若对象是链本身)
如果查询到是链对象,使用DBMS_SCHEDULER.DROP_CHAIN删除单个链:
BEGIN DBMS_SCHEDULER.DROP_CHAIN( chain_name => 'GIA.RUN_CHAIN$UW_RPT_17193', force => TRUE ); END; /
批量删除链的动态SQL:
DECLARE CURSOR c_chains IS SELECT 'BEGIN DBMS_SCHEDULER.DROP_CHAIN(chain_name => ''' || owner || '.' || chain_name || ''', force => TRUE); END;' AS sql_stmt FROM dba_scheduler_chains WHERE chain_name LIKE 'RUN_CHAIN$UW_RPT_%'; BEGIN FOR rec IN c_chains LOOP EXECUTE IMMEDIATE rec.sql_stmt; END LOOP; COMMIT; END; /
4. 清理残留元数据(极端情况)
如果以上方法都无法删除,需用SYS权限查询Scheduler底层表,确认残留记录后删除(操作前务必备份,低峰期执行):
-- 查询链运行实例残留记录 SELECT * FROM sys.scheduler$_chain_run WHERE run_name LIKE 'RUN_CHAIN$UW_RPT_%'; -- 删除残留记录 DELETE FROM sys.scheduler$_chain_run WHERE run_name LIKE 'RUN_CHAIN$UW_RPT_%'; COMMIT;
注意事项
- 批量操作前先测试单个对象的删除命令,确认有效性。
- 批量删除时加入提交间隔,避免因事务过大引发性能问题。
- 操作前务必确认对象已废弃,避免误删正在运行的调度资源。
内容的提问来源于stack exchange,提问作者匿名用户
相关产品推荐
相关产品推荐

