10G时的统计信息收集使用的scheduler job
11G 发生了变化,引入了autotask, 从schedurer job中移除
可以使用OEM或dbms_auto_task_admin package 修改autotask 的属性。11G中的autotask 可能包括:
当系统参数statistics_level 是TYPICAL 或ALL时,表示table monitor功能是eanble的,SMON后台进程会监控表上的修改如insert,delete,update,间隔几分钟后一起把这些信息从内存刷新到基表,当表上的修改超过10%时,表原来的统计信息就表示为老化,下次收集统计信息的作业运行时,会收集统计信息STALE_STATS 为NULL 或 YES的表信息,查看table statistic信息老化可以通过xxx_tab_statistics 视图,当然更详细的详细还是要参考官方文档,下面来一个我生产环境中遇到的一个问题。
Question:
有一些表数据发生了很大变化,但是统计信息从初次导入后从没有自动收集过统计信息?手动收集是成功的,oracle 11.2.0.4 RAC ON AIX
Answer:
先检查收集统计信息的Autotask是否已启用。
--check the actual status of your task
Note:
从DBA_AUTOTASK_WINDOW_CLIENTS视图查询的AUTOTASK_STATUS的状态和DBA_AUTOTASK_CLIENT视图中的status是不一致的,DBA_AUTOTASK_WINDOW_CLIENTS是实际的状态。从
TIP:
无运行日志。
MOS上有篇日志记录的很像,但是要重建时间空口,没有测试环境暂时不考虑。
Scheduled Maintenance Auto Tasks Not Working After 11.2.0.3 Upgrade (文档 ID 1452836.1)有
Solution:
下面这种方式经尝试也可以解决本案例问题,用dbms_auto_task_admin.enable 不带参数启动所有autotask,如果需要再禁用个别task; 如果使用enable带参数client name的方式运行,DBA_AUTOTASK_WINDOW_CLIENTS.AUTOTASK_STATUS的值不会改变,实际autotask也不会运行。
NOTE:
可以看到autotask 是运行了,本案例中是因为老化的统计信息太多,4个小时的时间维护窗口内没有完成,窗口结束时关闭了任务。 这种情况可以手动收集一部分在闲时,或增加维护窗口。
--over--
SQL>select job_name,comments from dba_scheduler_jobs
JOB_NAME COMMENTS
------------------------------ --------------------------------------------------------------------------------
AUTO_SPACE_ADVISOR_JOB auto space advisor maintenance job
GATHER_STATS_JOB Oracle defined automatic optimizer statistics collection job
FGR$AUTOPURGE_JOB file group auto-purge job
PURGE_LOG purge log job
MGMT_CONFIG_JOB Configuration collection job.
MGMT_STATS_CONFIG_JOB OCM Statistics collection job.
11G 发生了变化,引入了autotask, 从schedurer job中移除
SQL> select job_name,comments from dba_scheduler_jobs
JOB_NAME COMMENTS
------------------------------ --------------------------------------------------------------------------------
XMLDB_NFS_CLEANUP_JOB
SM$CLEAN_AUTO_SPLIT_MERGE auto clean job for auto split merge
RSE$CLEAN_RECOVERABLE_SCRIPT auto clean job for recoverable script
FGR$AUTOPURGE_JOB file group auto-purge job
BSLN_MAINTAIN_STATS_JOB Oracle defined automatic moving window baseline statistics computation job
DRA_REEVALUATE_OPEN_FAILURES Reevaluate open failures for DRA
HM_CREATE_OFFLINE_DICTIONARY Create offline dictionary in ADR for DRA name translation
ORA$AUTOTASK_CLEAN Delete obsolete AUTOTASK repository data
FILE_WATCHER File watcher job
PURGE_LOG purge log job
MGMT_STATS_CONFIG_JOB OCM Statistics collection job.
MGMT_CONFIG_JOB Configuration collection job.
RLM$SCHDNEGACTION
RLM$EVTCLEANUP
SQL> select client_name,status from dba_autotask_client;
CLIENT_NAME STATUS
----------------------------------- --------
auto optimizer stats collection ENABLED
auto space advisor ENABLED
sql tuning advisor ENABLED
可以使用OEM或dbms_auto_task_admin package 修改autotask 的属性。11G中的autotask 可能包括:
- Optimizer statistics gathering
Automatic Segment Advisor
SQL Tuning Advisor
当系统参数statistics_level 是TYPICAL 或ALL时,表示table monitor功能是eanble的,SMON后台进程会监控表上的修改如insert,delete,update,间隔几分钟后一起把这些信息从内存刷新到基表,当表上的修改超过10%时,表原来的统计信息就表示为老化,下次收集统计信息的作业运行时,会收集统计信息STALE_STATS 为NULL 或 YES的表信息,查看table statistic信息老化可以通过xxx_tab_statistics 视图,当然更详细的详细还是要参考官方文档,下面来一个我生产环境中遇到的一个问题。
Question:
有一些表数据发生了很大变化,但是统计信息从初次导入后从没有自动收集过统计信息?手动收集是成功的,oracle 11.2.0.4 RAC ON AIX
Answer:
先检查收集统计信息的Autotask是否已启用。
SQL> SELECT col
2 , val
3 FROM ( SELECT *
4 FROM DBA_AUTOTASK_CLIENT
5 WHERE CLIENT_NAME = 'auto optimizer stats collection'
6 )
7 UNPIVOT ( val
8 FOR col
9 IN ( CLIENT_NAME
10 , STATUS
11 , CONSUMER_GROUP
12 , CLIENT_TAG
13 , PRIORITY_OVERRIDE
14 , ATTRIBUTES
15 , WINDOW_GROUP
16 , SERVICE_NAME
17 )
18 );
COL VAL
----------------- --------------------------------------------------------------------------------
CLIENT_NAME auto optimizer stats collection
STATUS ENABLED
CONSUMER_GROUP ORA$AUTOTASK_STATS_GROUP
CLIENT_TAG OS
PRIORITY_OVERRIDE INVALID
ATTRIBUTES ON BY DEFAULT, VOLATILE, SAFE TO KILL
WINDOW_GROUP ORA$AT_WGRP_OS
SQL> SELECT * FROM DBA_SCHEDULER_WINDOW_GROUPS;
WINDOW_GROUP_NAME ENABL NUMBER_OF_WINDOWS NEXT_START_DATE COMMENTS
------------------------- ----- ----------------- -------------------------------------------- ------------------------------
MAINTENANCE_WINDOW_GROUP TRUE 7 18-NOV-14 10.00.00.000000 PM ASIA/SHANGHAI Window group for Automated Maintenance
ORA$AT_WGRP_OS TRUE 7 18-NOV-14 10.00.00.000000 PM ASIA/SHANGHAI auto optimizer stats collection
ORA$AT_WGRP_SA TRUE 7 18-NOV-14 10.00.00.000000 PM ASIA/SHANGHAI auto space advisor
ORA$AT_WGRP_SQ TRUE 7 18-NOV-14 10.00.00.000000 PM ASIA/SHANGHAI sql tuning advisor
SQL> select window_group_name, window_name
from dba_scheduler_wingroup_members
where window_group_name = 'ORA$AT_WGRP_OS';
WINDOW_GROUP_NAME WINDOW_NAME
------------------------------ ------------------------------
ORA$AT_WGRP_OS MONDAY_WINDOW
ORA$AT_WGRP_OS TUESDAY_WINDOW
ORA$AT_WGRP_OS WEDNESDAY_WINDOW
ORA$AT_WGRP_OS THURSDAY_WINDOW
ORA$AT_WGRP_OS FRIDAY_WINDOW
ORA$AT_WGRP_OS SATURDAY_WINDOW
ORA$AT_WGRP_OS SUNDAY_WINDOW
--check the actual status of your task
SQL>select * from DBA_AUTOTASK_WINDOW_CLIENTS;
WINDOW_NAME WINDOW_NEXT_TIME WINDO AUTOTASK OPTIMIZE SEGMENT_ SQL_TUNE HEALTH_M
--------------- --------------------------------------------------- ----- -------- -------- -------- -------- --------
MONDAY_WINDOW 24-NOV-14 10.00.00.000000 PM ASIA/SHANGHAI FALSE DISABLED ENABLED ENABLED ENABLED DISABLED
TUESDAY_WINDOW 18-NOV-14 10.00.00.000000 PM ASIA/SHANGHAI FALSE DISABLED ENABLED ENABLED ENABLED DISABLED
WEDNESDAY_WINDOW 19-NOV-14 10.00.00.000000 PM ASIA/SHANGHAI FALSE DISABLED ENABLED ENABLED ENABLED DISABLED
THURSDAY_WINDOW 20-NOV-14 10.00.00.000000 PM ASIA/SHANGHAI FALSE DISABLED ENABLED ENABLED ENABLED DISABLED
FRIDAY_WINDOW 21-NOV-14 10.00.00.000000 PM ASIA/SHANGHAI FALSE DISABLED ENABLED ENABLED ENABLED DISABLED
SATURDAY_WINDOW 22-NOV-14 06.00.00.000000 AM ASIA/SHANGHAI FALSE DISABLED ENABLED ENABLED ENABLED DISABLED
SUNDAY_WINDOW 23-NOV-14 06.00.00.000000 AM ASIA/SHANGHAI FALSE DISABLED ENABLED ENABLED ENABLED DISABLED
SQL> select window_name,autotask_status from DBA_AUTOTASK_WINDOW_CLIENTS;
WINDOW_NAME AUTOTASK
------------------------------ --------
MONDAY_WINDOW DISABLED
TUESDAY_WINDOW DISABLED
WEDNESDAY_WINDOW DISABLED
THURSDAY_WINDOW DISABLED
FRIDAY_WINDOW DISABLED
SATURDAY_WINDOW DISABLED
SUNDAY_WINDOW DISABLED
Note:
从DBA_AUTOTASK_WINDOW_CLIENTS视图查询的AUTOTASK_STATUS的状态和DBA_AUTOTASK_CLIENT视图中的status是不一致的,DBA_AUTOTASK_WINDOW_CLIENTS是实际的状态。从
DBA_AUTOTASK_WINDOW_CLIENTS.AUTOTASK_STATUS is DISABLED 可以看出autotask是禁用的, 并且时间维护窗口是正常状态。
SQL> select count(*) from dba_scheduler_job_log where additional_info like '%GATHER_STATS_PROG%';
# no rows
TIP:
无运行日志。
MOS上有篇日志记录的很像,但是要重建时间空口,没有测试环境暂时不考虑。
Scheduled Maintenance Auto Tasks Not Working After 11.2.0.3 Upgrade (文档 ID 1452836.1)有
Solution:
下面这种方式经尝试也可以解决本案例问题,用dbms_auto_task_admin.enable 不带参数启动所有autotask,如果需要再禁用个别task; 如果使用enable带参数client name的方式运行,DBA_AUTOTASK_WINDOW_CLIENTS.AUTOTASK_STATUS的值不会改变,实际autotask也不会运行。
--enable Autotask
SQL> exec dbms_auto_task_admin.enable;
PL/SQL procedure successfully completed.
--check the status again
SQL> select window_name,autotask_status from DBA_AUTOTASK_WINDOW_CLIENTS;
WINDOW_NAME AUTOTASK
------------------------------ --------
MONDAY_WINDOW ENABLED
TUESDAY_WINDOW ENABLED
WEDNESDAY_WINDOW ENABLED
THURSDAY_WINDOW ENABLED
FRIDAY_WINDOW ENABLED
SATURDAY_WINDOW ENABLED
SUNDAY_WINDOW ENABLED
7 rows selected.
-- disable sql tuning advisor
BEGIN
DBMS_AUTO_TASK_ADMIN.disable(
client_name => 'sql tuning advisor',
operation => NULL,
window_name => NULL);
END;
-- disable auto space advisor
BEGIN
DBMS_AUTO_TASK_ADMIN.disable(
client_name => 'auto space advisor',
operation => NULL,
window_name => NULL);
END;
SQL> select client_name,status from dba_autotask_client;
CLIENT_NAME STATUS
----------------------------------- --------
auto optimizer stats collection ENABLED
auto space advisor DISABLED
sql tuning advisor DISABLED
--disable all Autotask
SQL> exec dbms_auto_task_admin.disable;
PL/SQL procedure successfully completed.
--check the status again
SQL> select window_name,autotask_status from DBA_AUTOTASK_WINDOW_CLIENTS;
WINDOW_NAME AUTOTASK
------------------------------ --------
MONDAY_WINDOW ENABLED
TUESDAY_WINDOW ENABLED
WEDNESDAY_WINDOW ENABLED
THURSDAY_WINDOW ENABLED
FRIDAY_WINDOW ENABLED
SATURDAY_WINDOW ENABLED
SUNDAY_WINDOW ENABLED
-- check scheduler log
SQL>select log_id, log_date, additional_info from dba_scheduler_job_log
where job_class in (select job_class_name from dba_scheduler_job_classes
where comments = 'auto optimizer stats collection') and log_date > sysdate - 1 order by 1;
LOG_ID LOG_DATE ADDITIONAL_INFO
---------- ----------------------------------- --------------------------------------------------------------------------------
26062 20-NOV-14 02.00.01.790968 AM +08:00 REASON="Stop job called because associated window was closed"
26159 20-NOV-14 02.00.01.874114 AM +08:00 REASON="Max runs reached"
26160 20-NOV-14 02.00.01.875417 AM +08:00 REASON="Auto drop job dropped", PROGRAM_NAME=""SYS"."GATHER_STATS_PROG"", JOB_TY
PE="NULL", JOB_ACTION="NULL", NUMBER_OF_ARGUMENTS="0", SCHEDULE_NAME="NULL", STA
RT_DATE="NULL", REPEAT_INTERVAL="SYS"ORA$AT_WGRP_OS", QUEUE_SPEC="NULL", END_DAT
E="NULL", JOB_CLASS="ORA$AT_JCNRM_OS", ENABLED="FALSE", AUTO_DROP="TRUE", RESTAR
TABLE="FALSE", JOB_PRIORITY="2", MAX_RUNS="1", MAX_FAILURES="0", SCHEDULE_LIMIT=
"NULL", MAX_RUN_DURATION="NULL", LOGGING_LEVEL="0", STOP_ON_WINDOW_EXIT="TRUE",
INSTANCE_STICKINESS="TRUE",JOB_WEIGHT="1", NLS_ENV="", COMMENTS="automatic optim
izer statistics collection job"
SQL> @printtab 'select client_name,window_start_time,window_duration,jobs_completed,window_end_time from dba_autotask_client_history'
CLIENT_NAME : auto optimizer stats collection
WINDOW_START_TIME : 19-NOV-14 10.00.01.380677 PM +08:00
WINDOW_DURATION : +000000000 03:59:59.310443
JOBS_COMPLETED : 0
WINDOW_END_TIME : 20-NOV-14 02.00.00.691120 AM +08:00
-----------------
NOTE:
可以看到autotask 是运行了,本案例中是因为老化的统计信息太多,4个小时的时间维护窗口内没有完成,窗口结束时关闭了任务。 这种情况可以手动收集一部分在闲时,或增加维护窗口。
--over--
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




