• DBMS_SCHEDULER修改资源调度总结


    DBMS_SCHEDULER修改资源调度总结:
    相关的视图:

     select CLIENT_NAME,STATUS from DBA_AUTOTASK_CLIENT;
    DBA_AUTOTASK_WINDOW_CLIENTS:显示MAINTENANCE_WINDOW_GROUP时间窗口的相关信息各个作业的状态。
    dba_scheduler_windows:显示数据库中所有scheduler的作业窗口
    dba_scheduler_wingroup_members:显示数据库中scheduler window group的所有member
    dba_scheduler_groups


    默认情况下:每天(周一到周五)晚上10点开始,持续4小时。周六(日)早上6点开始,持续20小时。
    SQL> set lines 200 pages 1000
    SQL> col window_name for a30
    SQL> col window_next_time for a45
    SQL> col optimizer_stats for a15
    SQL> col segment_advisor for a15
    SQL> col sql_tune_advisor for a15
    SQL> select window_name,window_next_time,optimizer_stats,segment_advisor,sql_tune_advisor from DBA_AUTOTASK_WINDOW_CLIENTS;

     WINDOW_NAME               WINDOW_NEXT_TIME                       OPTIMIZER_STATS SEGMENT_ADVISOR           SQL_TUNE_ADVISO
     ------------------------------   ---------------------------------------------   ---------------               ---------------                         ---------------
     MONDAY_WINDOW        01-JAN-18 10.00.00.000000 PM PRC   ENABLED                 ENABLED                            ENABLED
     TUESDAY_WINDOW       02-JAN-18 10.00.00.000000 PM PRC   ENABLED                 ENABLED                            ENABLED
     WEDNESDAY_WINDOW 03-JAN-18 10.00.00.000000 PM PRC   ENABLED                  ENABLED                           ENABLED
     THURSDAY_WINDOW    28-DEC-17 10.00.00.000000 PM PRC   ENABLED                 ENABLED                           ENABLED
     FRIDAY_WINDOW          29-DEC-17 10.00.00.000000 PM PRC   ENABLED                 ENABLED                           ENABLED
     SATURDAY_WINDOW    30-DEC-17 06.00.00.000000 AM PRC   ENABLED                 ENABLED                           ENABLED
     SUNDAY_WINDOW         31-DEC-17 06.00.00.000000 AM PRC   ENABLED                 ENABLED                           ENABLED

     7 rows selected.

     SQL>

    查看自动作业的详细情况
    SQL> set lines 200 pages 1000
    SQL> col comments for a40
    SQL> col window_name for a20
    SQL> col next_date for a20
    SQL> col repeat_interval for a60
    SQL> col duration for a15
    SQL> SELECT t3.comments,to_char(t1.next_start_date,'yyyy-mm-dd hh24') next_date,t1.window_name, t1.repeat_interval, t1.duration
    2 FROM dba_scheduler_windows t1, dba_scheduler_wingroup_members t2,dba_scheduler_groups t3
    3 WHERE t1.window_name = t2.window_name
    4 and t2.WINDOW_GROUP_NAME=t3.GROUP_NAME
    5 and t3.comments in ('auto optimizer stats collection','auto space advisor','sql tuning advisor') order by 1,2;

    COMMENTS                                 NEXT_DATE     WINDOW_NAME          REPEAT_INTERVAL                                                                 DURATION
    ----------------------------------------  -------------------- --------------------            ------------------------------------------------------------                     ---------------
    auto optimizer stats collection      2017-12-28 22 THURSDAY_WINDOW   freq=daily;byday=THU;byhour=22;byminute=0; bysecond=0   +000 04:00:00
    auto optimizer stats collection      2017-12-29 22 FRIDAY_WINDOW         freq=daily;byday=FRI;byhour=22;byminute=0; bysecond=0    +000 04:00:00
    auto optimizer stats collection      2017-12-30 06 SATURDAY_WINDOW   freq=daily;byday=SAT;byhour=6;byminute=0; bysecond=0     +000 20:00:00
    auto optimizer stats collection      2017-12-31 06 SUNDAY_WINDOW        freq=daily;byday=SUN;byhour=6;byminute=0; bysecond=0     +000 20:00:00
    auto optimizer stats collection      2018-01-01 22 MONDAY_WINDOW       freq=daily;byday=MON;byhour=22;byminute=0; bysecond=0  +000 04:00:00
    auto optimizer stats collection      2018-01-02 22 TUESDAY_WINDOW      freq=daily;byday=TUE;byhour=22;byminute=0; bysecond=0   +000 04:00:00
    auto optimizer stats collection      2018-01-03 22 WEDNESDAY_WINDOW freq=daily;byday=WED;byhour=22;byminute=0; bysecond=0 +000 04:00:00
    auto space advisor                      2017-12-28 22 THURSDAY_WINDOW    freq=daily;byday=THU;byhour=22;byminute=0; bysecond=0   +000 04:00:00
    auto space advisor                      2017-12-29 22 FRIDAY_WINDOW          freq=daily;byday=FRI;byhour=22;byminute=0; bysecond=0    +000 04:00:00
    auto space advisor                      2017-12-30 06 SATURDAY_WINDOW     freq=daily;byday=SAT;byhour=6;byminute=0; bysecond=0    +000 20:00:00
    auto space advisor                      2017-12-31 06 SUNDAY_WINDOW          freq=daily;byday=SUN;byhour=6;byminute=0; bysecond=0    +000 20:00:00
    auto space advisor                      2018-01-01 22 MONDAY_WINDOW         freq=daily;byday=MON;byhour=22;byminute=0; bysecond=0 +000 04:00:00
    auto space advisor                      2018-01-02 22 TUESDAY_WINDOW        freq=daily;byday=TUE;byhour=22;byminute=0; bysecond=0  +000 04:00:00
    auto space advisor                      2018-01-03 22 WEDNESDAY_WINDOW  freq=daily;byday=WED;byhour=22;byminute=0; bysecond=0 +000 04:00:00
    sql tuning advisor                        2017-12-28 22 THURSDAY_WINDOW     freq=daily;byday=THU;byhour=22;byminute=0; bysecond=0   +000 04:00:00
    sql tuning advisor                        2017-12-29 22 FRIDAY_WINDOW           freq=daily;byday=FRI;byhour=22;byminute=0; bysecond=0     +000 04:00:00
    sql tuning advisor                        2017-12-30 06 SATURDAY_WINDOW      freq=daily;byday=SAT;byhour=6;byminute=0; bysecond=0     +000 20:00:00
    sql tuning advisor                        2017-12-31 06 SUNDAY_WINDOW          freq=daily;byday=SUN;byhour=6;byminute=0; bysecond=0      +000 20:00:00
    sql tuning advisor                        2018-01-01 22 MONDAY_WINDOW         freq=daily;byday=MON;byhour=22;byminute=0; bysecond=0   +000 04:00:00
    sql tuning advisor                        2018-01-02 22 TUESDAY_WINDOW        freq=daily;byday=TUE;byhour=22;byminute=0; bysecond=0    +000 04:00:00
    sql tuning advisor                        2018-01-03 22 WEDNESDAY_WINDOW  freq=daily;byday=WED;byhour=22;byminute=0; bysecond=0    +000 04:00:00

    21 rows selected.

    SQL>

    例子:
    开发写的sp中,有时存在ddl语句(例如:EXECUTE IMMEDIATE 'TRUNCATE TABLE test'; test正好是实体表)。在执行sp的时候,可能存在下列的报错ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired 。经过排查,是由于统计信息收集的作业时,影响了sp的正常执行。
    下面提供两种解决方法:
    方法一:修改统计信息的收集时间段。
    方法二:将涉及的表统计信息,进行lock处理。系统在收集统计信息的时候,会跳过该表

    方法一例子:将周六的从早上6点开始的统计信息作业,修改到中午12点开始执行,持续时间修改为12个小时。
    可以修改原作业的窗口属性。DBMS_SCHEDULER.SET_ATTRIBUTE修改。也可以新建时间窗口。这里我采用新建时间窗口实现
    1.禁用周六的统计信息收集作业
    BEGIN
    dbms_auto_task_admin.disable(
    client_name => 'auto optimizer stats collection',
    operation => NULL,
    window_name => 'SATURDAY_WINDOW');
    END;
    /

    SQL> select window_name,window_next_time,optimizer_stats,segment_advisor,sql_tune_advisor from DBA_AUTOTASK_WINDOW_CLIENTS;

    WINDOW_NAME             WINDOW_NEXT_TIME    OPTIMIZER_STATS SEGMENT_ADVISOR SQL_TUNE_ADVISO
    ------------------------------ --------------------------------------------- --------------- --------------- ---------------
    MONDAY_WINDOW        01-JAN-18 10.00.00.000000 PM PRC ENABLED ENABLED ENABLED
    TUESDAY_WINDOW       02-JAN-18 10.00.00.000000 PM PRC ENABLED ENABLED ENABLED
    WEDNESDAY_WINDOW 03-JAN-18 10.00.00.000000 PM PRC ENABLED ENABLED ENABLED
    THURSDAY_WINDOW    28-DEC-17 10.00.00.000000 PM PRC ENABLED ENABLED ENABLED
    FRIDAY_WINDOW          29-DEC-17 10.00.00.000000 PM PRC ENABLED ENABLED ENABLED
    SATURDAY_WINDOW    30-DEC-17 06.00.00.000000 AM PRC DISABLED ENABLED ENABLED ---周六收集统计信息的窗口已禁用
    SUNDAY_WINDOW         31-DEC-17 06.00.00.000000 AM PRC ENABLED ENABLED ENABLED

    7 rows selected.

    SQL>
    2.新建时间窗口
    新建一个周六时间窗口
    BEGIN
    dbms_scheduler.create_window(
    window_name=>'SATURDAY_WINDOW_USER',
    resource_plan=>'DEFAULT_MAINTENANCE_PLAN',
    repeat_interval=>'freq=daily;byday=SAT;byhour=12;byminute=0;bysecond=0', ---从12点开始
    duration=>interval '12' hour, ----持续时间12小时
    comments=>'Saturday window tasks by user'); ---comments注释
    EXCEPTION
    when others then
    if sqlcode = -27477 then NULL;
    else raise;
    end if;
    END;
    /

    SQL> select window_name,repeat_interval,duration from SYS.DBA_SCHEDULER_WINDOWS t where window_name='SATURDAY_WINDOW_USER';

    WINDOW_NAME REPEAT_INTERVAL DURATION
    ------------------------- ------------------------------------------------------------ -------------------------
    SATURDAY_WINDOW_USER freq=daily;byday=SAT;byhour=12;byminute=0;bysecond=0 +000 12:00:00

    SQL>
    3.将新建的窗口时间加入到window group
    BEGIN
    dbms_scheduler.add_group_member('MAINTENANCE_WINDOW_GROUP','SATURDAY_WINDOW_USER');
    END;
    /

    4.启动新的时间窗口
    BEGIN
    dbms_auto_task_admin.enable(
    client_name => 'auto optimizer stats collection',
    operation => NULL,
    window_name => 'SATURDAY_WINDOW_USER');
    END;
    /

    SQL> select window_name,window_next_time,optimizer_stats,segment_advisor,sql_tune_advisor from DBA_AUTOTASK_WINDOW_CLIENTS;

    WINDOW_NAME                     WINDOW_NEXT_TIME OPTIMIZER_STATS SEGMENT_ADVISOR SQL_TUNE_ADVISO
    -------------------------                --------------------------------------------- --------------- --------------- ---------------
    MONDAY_WINDOW                01-JAN-18 10.00.00.000000 PM PRC ENABLED ENABLED ENABLED
    TUESDAY_WINDOW               02-JAN-18 10.00.00.000000 PM PRC ENABLED ENABLED ENABLED
    WEDNESDAY_WINDOW         03-JAN-18 10.00.00.000000 PM PRC ENABLED ENABLED ENABLED
    THURSDAY_WINDOW            28-DEC-17 10.00.00.000000 PM PRC ENABLED ENABLED ENABLED
    FRIDAY_WINDOW                  29-DEC-17 10.00.00.000000 PM PRC ENABLED ENABLED ENABLED
    SATURDAY_WINDOW            30-DEC-17 06.00.00.000000 AM PRC DISABLED ENABLED ENABLED
    SUNDAY_WINDOW                 31-DEC-17 06.00.00.000000 AM PRC ENABLED ENABLED ENABLED
    SATURDAY_WINDOW_USER 30-DEC-17 12.00.00.000000 PM PRC ENABLED DISABLED DISABLED <<<=======新添加的时间窗口

    8 rows selected.

    SQL>

    方法二:
    1.首先确定表的统计信息(dbms_stats.set_table_stats+DBMS_STATS.SET_COLUMN_STATS),然后设置表的统计信息(后面可以根据执行计划设置比较靠谱的统计信息)。比如表大概多少行
    SQL> execute dbms_stats.set_table_stats( ownname => 'ERWA',tabname =>'EMP',numrows => 5000,numblks => 7,avgrlen => 100);
    PL/SQL procedure successfully completed
    SQL>
    2.将表的统计信息lock住
    SQL> execute DBMS_STATS.LOCK_TABLE_STATS('ERWA','EMP')
    PL/SQL procedure successfully completed
    SQL>

    SQL> EXECUTE DBMS_AUTO_TASK_ADMIN.enable;   <<<<<<启用auto_task

    PL/SQL procedure successfully completed.

    SQL>EXECUTE DBMS_AUTO_TASK_ADMIN.disable;  <<<<<<禁用auto_task


    参考资料;

    FAQ: Automatic Statistics Collection (文档 ID 1233203.1)
    How to Create an Own Maintenance Window for Autotask Jobs in 11g (文档 ID 1300313.1)

  • 相关阅读:
    ubuntu18.04下eclipse修改maven源为阿里源
    Java中使用队列Queue
    Redis学习笔记——Redis的基本操作
    ubuntu安装redis
    Spring Boot使用监听器Listener
    Spring Boot中在程序中获得application.properties中的值
    Spring Boot使用过滤器Filter
    基于GTID的主从架构异常处理流程
    goroutine与调度器
    使用synergyc共享键鼠
  • 原文地址:https://www.cnblogs.com/erwadba/p/8134334.html
Copyright © 2020-2023  润新知