重庆思庄Oracle、KingBase、PostgreSQL、Redhat认证学习论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 309|回复: 0
打印 上一主题 下一主题

[性能调整] ORA-12012;自动统计任务报错处理

[复制链接]
跳转到指定楼层
楼主
发表于 2026-1-6 17:14:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
报错信息:
---------------------------
ORA-12012: error on auto execute of job "SYS"."ORA$AT_OS_OPT_SY_23740"
ORA-20001: Statistics Advisor: Invalid task name for the current user
ORA-06512: at "SYS.DBMS_STATS", line 51823
ORA-06512: at "SYS.DBMS_STATS_ADVISOR", line 891
ORA-06512: at "SYS.DBMS_STATS_INTERNAL", line 22158
ORA-06512: at "SYS.DBMS_STATS_INTERNAL", line 24290
ORA-06512: at "SYS.DBMS_STATS", line 51811
---------------------------

这个错误是Oracle自动统计信息收集任务(ORA$AT_OS_OPT_SY_23740)执行失败导致的。错误核心是"Invalid task name for the current user",通常是由于统计信息顾问任务相关的内部问题造成的。


--------------------
--------------------
一般来说,系统的自动调优和空间任务,如果没有指明的话,可以将其关闭,
######查自动任务
select CLIENT_NAME,STATUS from DBA_AUTOTASK_client;
#关闭 自动优化,和空间 任务
BEGIN
dbms_auto_task_admin.disable(client_name => 'auto space advisor', operation => NULL, window_name => NULL);
dbms_auto_task_admin.disable(client_name => 'sql tuning advisor', operation => NULL, window_name => NULL);
END;
/
#######⚠️注意:不要关闭自动收集任务#######


其他解决方法:


方案1:重新创建统计信息顾问任务(推荐)

-- 1. 首先检查现有的统计信息顾问任务
SELECT task_name, status, created
FROM dba_advisor_tasks
WHERE advisor_name = 'Statistics Advisor';



select name, ctime, how_created
from sys.wri$_adv_tasks
where owner_name = 'SYS'
and name in ('AUTO_STATS_ADVISOR_TASK','INDIVIDUAL_STATS_ADVISOR_TASK');

-- 2. 如果发现无效或异常的任务,可以尝试清理
BEGIN
    DBMS_STATS.DROP_ADVISOR_TASK('AUTO_STATS_ADVISOR_TASK');
EXCEPTION
    WHEN OTHERS THEN NULL;
END;
/

-- 3. 重新创建统计信息顾问任务
BEGIN
    DBMS_STATS.INIT_PACKAGE();
END;
/

方案2:禁用并重新启用自动统计信息收集

-- 1. 禁用自动统计信息收集
BEGIN
    DBMS_AUTO_TASK_ADMIN.DISABLE(
        client_name => 'auto optimizer stats collection',
        operation   => NULL,
        window_name => NULL
    );
END;
/



-- 2. 清理所有统计信息顾问任务
BEGIN
    FOR t IN (SELECT task_name FROM dba_advisor_tasks
              WHERE advisor_name = 'Statistics Advisor')
    LOOP
        BEGIN
            DBMS_STATS.DROP_ADVISOR_TASK(t.task_name);
        EXCEPTION
            WHEN OTHERS THEN NULL;
        END;
    END LOOP;
END;
/

-- 3. 重新启用自动统计信息收集
BEGIN
    DBMS_AUTO_TASK_ADMIN.ENABLE(
        client_name => 'auto optimizer stats collection',
        operation   => NULL,
        window_name => NULL
    );
END;
/

方案3:修复特定的自动任务

-- 1. 检查具体的失败任务
SELECT job_name, state, last_start_date, next_run_date
FROM dba_scheduler_jobs
WHERE job_name = 'ORA$AT_OS_OPT_SY_23740';

-- 2. 尝试停止并重新运行任务
BEGIN
    DBMS_SCHEDULER.STOP_JOB('SYS.ORA$AT_OS_OPT_SY_23740', force => TRUE);
    DBMS_SCHEDULER.DROP_JOB('SYS.ORA$AT_OS_OPT_SY_23740');
EXCEPTION
    WHEN OTHERS THEN NULL;
END;
/

-- 3. 自动任务系统会自动重新创建任务,也可以手动触发重建
BEGIN
    DBMS_STATS.GATHER_DATABASE_STATS(
        OPTIONS => 'GATHER AUTO',
        DEGREE => DBMS_STATS.AUTO_DEGREE
    );
END;
/

方案4:重置统计信息顾问(较彻底的方法)

-- 以SYSDBA身份执行
-- 1. 清理统计信息顾问相关的表
TRUNCATE TABLE WRI$_ADV_OBJECTS;
TRUNCATE TABLE WRI$_ADV_TASKS;

-- 2. 重新初始化
BEGIN
    DBMS_STATS.INIT_PACKAGE();
    DBMS_STATS.CREATE_ADVISOR_TASK('AUTO_STATS_ADVISOR_TASK');
END;
/


--------
预防措施

-- 定期检查统计信息顾问任务状态
SELECT task_name, status, created, last_execution
FROM dba_advisor_tasks
WHERE advisor_name = 'Statistics Advisor'
ORDER BY created DESC;

-- 监控自动统计信息收集任务
SELECT client_name, status, attributes
FROM dba_autotask_client
WHERE client_name = 'auto optimizer stats collection';


注意事项

1.建议在业务低峰期执行这些操作

2.执行前最好备份相关的字典表

3.如果问题持续存在,可能需要检查是否有统计信息收集的bug,考虑打补丁

4.可以查看alert.log获取更多错误上下文信息

通常方案1或方案2就能解决问题。如果这些方法无效,可能需要检查数据库版本并考虑应用相关补丁。


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 支持支持 反对反对
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋|重庆思庄Oracle、Redhat认证学习论坛 ( 渝ICP备12004239号-4 )

GMT+8, 2026-4-17 22:36 , Processed in 0.235035 second(s), 25 queries .

重庆思庄学习中心论坛-重庆思庄科技有限公司论坛

© 2001-2020

快速回复 返回顶部 返回列表