执行 Oracle 数据库实例的常见计划任务 - Amazon Relational Database Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

执行 Oracle 数据库实例的常见计划任务

某些 SYS 拥有的计划程序作业可能会影响正常的数据库操作。Oracle Support 部门建议您禁用这些作业或修改计划。要执行 SYS 拥有的 Oracle 计划程序作业的任务,请使用 Amazon RDS 包 rdsadmin.rdsadmin_dbms_scheduler

以下 Amazon RDS for Oracle 数据库引擎版本支持 rdsadmin.rdsadmin_dbms_scheduler 过程:

  • Oracle Database 21c (21.0.0)

  • Oracle Database 19c

  • Oracle Database 12c 第 2 版(12.2),版本 12.2.0.2.ru-2019-07.rur-2019-07.r1 或更高版本 12.2

  • Oracle Database 12c 第 1 版(12.1),版本 12.1.0.2.v17 或更高版本 12.1

Oracle 计划程序过程的常见参数

要使用 Oracle 计划程序执行任务,请使用 Amazon RDS 包 rdsadmin.rdsadmin_dbms_scheduler 中的过程。有几个参数是包中的过程通用的。该包具有以下常见参数。

参数名称 数据类型 有效值 默认值 必需 描述

name

varchar2

'SYS.BSLN_MAINTAIN_STATS_JOB','SYS.CLEANUP_ONLINE_IND_BUILD'

要修改的作业的名称。

注意

目前,您只能修改 SYS.CLEANUP_ONLINE_IND_BUILDSYS.BSLN_MAINTAIN_STATS_JOB 作业。

attribute

varchar2

'REPEAT_INTERVAL','SCHEDULE_NAME'

要修改的属性。

要修改作业的重复间隔,请指定 'REPEAT_INTERVAL'

要修改作业的计划名称,请指定 'SCHEDULE_NAME'

value

varchar2

有效的计划间隔或计划名称,具体取决于使用的属性。

新的属性值。

修改 DBMS_SCHEDULER 作业

要修改 Oracle Scheduler 的某些组件,使用 Oracle 过程 dbms_scheduler.set_attribute。有关更多信息,请参阅 Oracle 文档中的 DBMS_SCHEDULERSET_ATTRIBUTE 过程

在使用 Amazon RDS 数据库实例时,在对象名称前面加上架构名称 SYS。以下示例设置星期一窗口对象的资源计划属性。

BEGIN DBMS_SCHEDULER.SET_ATTRIBUTE( name => 'SYS.MONDAY_WINDOW', attribute => 'RESOURCE_PLAN', value => 'resource_plan_1'); END; /

修改自动任务维护时段

Amazon RDS for Oracle 实例使用维护时段的默认设置创建。自动维护任务(如优化程序统计信息收集)在这些窗口中运行。默认情况下,维护时段会打开 Oracle 数据库资源管理器。

要修改时段,请使用 DBMS_SCHEDULER 程序包。出于以下原因,您可能需要修改维护时段设置:

  • 您希望维护作业在不同的时间运行,具有不同的设置,或根本不运行。例如,可能需要修改时段持续时间,或更改重复时间和间隔。

  • 您希望避免在维护期间启用资源管理器造成性能影响。例如,如果指定了默认维护计划,并且在数据库处于加载状态时打开维护时段,则可能会看到等待事件,例如 resmgr:cpu quantum。此等待事件与数据库资源管理器相关。您有以下选项:

    • 确保您的数据库实例的非高峰时段处于活动状态。

    • 禁用默认维护计划,方法是将 resource_plan 属性设置为空字符串。

    • 在参数组中将 resource_manager_plan 参数设置为 FORCE:。如果您的实例使用企业版,则此设置将阻止激活数据库资源管理器计划。

修改维护时段设置
  1. 使用 Oracle SQL 客户端 Connect 到数据库。

  2. 查询调度程序时段的当前配置。

    以下示例查询 MONDAY_WINDOW 的配置。

    SELECT ENABLED, RESOURCE_PLAN, DURATION, REPEAT_INTERVAL FROM DBA_SCHEDULER_WINDOWS WHERE WINDOW_NAME='MONDAY_WINDOW';

    以下输出显示该时段正在使用默认值。

    ENABLED RESOURCE_PLAN DURATION REPEAT_INTERVAL --------------- ------------------------------ ---------------- ------------------------------ TRUE DEFAULT_MAINTENANCE_PLAN +000 04:00:00 freq=daily;byday=MON;byhour=22 ;byminute=0; bysecond=0
  3. 使用 DBMS_SCHEDULER 程序包修改时段。

    以下示例将资源计划设置为 null,以便资源管理器不会在维护时段期间运行。

    BEGIN -- disable the window to make changes DBMS_SCHEDULER.DISABLE(name=>'"SYS"."MONDAY_WINDOW"',force=>TRUE); -- specify the empty string to use no plan DBMS_SCHEDULER.SET_ATTRIBUTE(name=>'"SYS"."MONDAY_WINDOW"', attribute=>'RESOURCE_PLAN', value=>''); -- re-enable the window DBMS_SCHEDULER.ENABLE(name=>'"SYS"."MONDAY_WINDOW"'); END; /

    以下示例将时段的最大持续时段设置为 2 小时。

    BEGIN DBMS_SCHEDULER.DISABLE(name=>'"SYS"."MONDAY_WINDOW"',force=>TRUE); DBMS_SCHEDULER.SET_ATTRIBUTE(name=>'"SYS"."MONDAY_WINDOW"', attribute=>'DURATION', value=>'0 2:00:00'); DBMS_SCHEDULER.ENABLE(name=>'"SYS"."MONDAY_WINDOW"'); END; /

    以下示例将重复间隔设置为每个星期一上午 10 点。

    BEGIN DBMS_SCHEDULER.DISABLE(name=>'"SYS"."MONDAY_WINDOW"',force=>TRUE); DBMS_SCHEDULER.SET_ATTRIBUTE(name=>'"SYS"."MONDAY_WINDOW"', attribute=>'REPEAT_INTERVAL', value=>'freq=daily;byday=MON;byhour=10;byminute=0;bysecond=0'); DBMS_SCHEDULER.ENABLE(name=>'"SYS"."MONDAY_WINDOW"'); END; /

设置 Oracle Scheduler 作业的时区

要修改 Oracle Scheduler 的时区,您可以使用 Oracle 过程 dbms_scheduler.set_scheduler_attribute。有关 dbms_scheduler 程序包的更多信息,请参阅 Oracle 文档中的 DBMS_SCHEDULERSET_SCHEDULER_ATTRIBUTE

修改当前时区设置
  1. 使用客户端(例如 SQL Developer)连接到数据库。有关更多信息,请参阅“使用 Oracle SQL Developer 连接到数据库实例”。

  2. 按如下所示设置默认时区,并将时区替换为 time_zone_name

    BEGIN DBMS_SCHEDULER.SET_SCHEDULER_ATTRIBUTE( attribute => 'default_timezone', value => 'time_zone_name' ); END; /

在以下示例中,您将时区更改为亚洲/上海。

首先查询当前时区,如下所示。

SELECT VALUE FROM DBA_SCHEDULER_GLOBAL_ATTRIBUTE WHERE ATTRIBUTE_NAME='DEFAULT_TIMEZONE';

输出显示当前时区为 ETC/UTC。

VALUE ------- Etc/UTC

然后,将时区设置为亚洲/上海。

BEGIN DBMS_SCHEDULER.SET_SCHEDULER_ATTRIBUTE( attribute => 'default_timezone', value => 'Asia/Shanghai' ); END; /

有关更改系统时区的更多信息,请参阅 Oracle 时区

关闭 SYS 拥有的 Oracle 计划程序任务

要禁用 SYS 用户拥有的 Oracle 计划程序任务,请使用 rdsadmin.rdsadmin_dbms_scheduler.disable 过程。

该过程在 Oracle 计划程序任务中使用 name 常见参数。有关更多信息,请参阅“Oracle 计划程序过程的常见参数”。

以下示例禁用 SYS.CLEANUP_ONLINE_IND_BUILD Oracle 计划程序作业。

BEGIN rdsadmin.rdsadmin_dbms_scheduler.disable('SYS.CLEANUP_ONLINE_IND_BUILD'); END; /

开启 SYS 拥有的 Oracle 计划程序任务

要开启 SYS 拥有的 Oracle 计划程序任务,请使用 rdsadmin.rdsadmin_dbms_scheduler.enable 过程。

该过程在 Oracle 计划程序任务中使用 name 常见参数。有关更多信息,请参阅“Oracle 计划程序过程的常见参数”。

以下示例启用 SYS.CLEANUP_ONLINE_IND_BUILD Oracle 计划程序作业。

BEGIN rdsadmin.rdsadmin_dbms_scheduler.enable('SYS.CLEANUP_ONLINE_IND_BUILD'); END; /

修改 CALENDAR 类型的任务的 Oracle 计划程序重复间隔

要修改重复间隔以修改 SYS 拥有的 CALENDAR 类型的 Oracle 计划程序作业,请使用 rdsadmin.rdsadmin_dbms_scheduler.disable 过程。

该过程在 Oracle 计划程序任务中使用以下常见参数:

  • name

  • attribute

  • value

有关更多信息,请参阅“Oracle 计划程序过程的常见参数”。

以下示例修改 SYS.CLEANUP_ONLINE_IND_BUILD Oracle 计划程序作业的重复间隔。

BEGIN rdsadmin.rdsadmin_dbms_scheduler.set_attribute( name => 'SYS.CLEANUP_ONLINE_IND_BUILD', attribute => 'repeat_interval', value => 'freq=daily;byday=FRI,SAT;byhour=20;byminute=0;bysecond=0'); END; /

修改 NAMED 类型的任务的 Oracle 计划程序重复间隔

某些 Oracle 计划程序作业使用计划名称而不是间隔。对于此类型的作业,您必须在主用户架构中创建新的命名计划。请使用标准 Oracle sys.dbms_scheduler.create_schedule 过程执行该操作。此外,还要使用 rdsadmin.rdsadmin_dbms_scheduler.set_attribute procedure 将新的命名计划分配给作业。

该过程在 Oracle 计划程序任务中使用以下常见参数:

  • name

  • attribute

  • value

有关更多信息,请参阅“Oracle 计划程序过程的常见参数”。

以下示例修改 SYS.BSLN_MAINTAIN_STATS_JOB Oracle 计划程序作业的重复间隔。

BEGIN DBMS_SCHEDULER.CREATE_SCHEDULE ( schedule_name => 'rds_master_user.new_schedule', start_date => SYSTIMESTAMP, repeat_interval => 'freq=daily;byday=MON,TUE,WED,THU,FRI;byhour=0;byminute=0;bysecond=0', end_date => NULL, comments => 'Repeats daily forever'); END; / BEGIN rdsadmin.rdsadmin_dbms_scheduler.set_attribute ( name => 'SYS.BSLN_MAINTAIN_STATS_JOB', attribute => 'schedule_name', value => 'rds_master_user.new_schedule'); END; /

在创建 Oracle 计划程序任务时关闭自动提交

DBMS_SCHEDULER.CREATE_JOB 创建 Oracle 计划程序任务时,它会立即创建任务并提交更改。要执行以下操作,可能需要将 Oracle 计划程序任务的创建合并到用户事务中:

  • 回滚用户事务时,回滚 Oracle 计划程序任务。

  • 提交主用户事务时,创建 Oracle 计划程序任务。

可以使用过程 rdsadmin.rdsadmin_dbms_scheduler.set_no_commit_flag 开启此行为。此过程不需要任何参数。您可以在以下 RDS for Oracle 版本中使用此过程:

  • 21.0.0.0.ru-2022-07.rur-2022-07.r1 及更高版本

  • 19.0.0.0.ru-2022-07.rur-2022-07.r1 及更高版本

以下示例关闭 Oracle 计划程序的自动提交,创建 Oracle 计划程序任务,然后回滚事务。由于自动提交已关闭,因此数据库还会回滚 Oracle 计划程序任务的创建。

BEGIN rdsadmin.rdsadmin_dbms_scheduler.set_no_commit_flag; DBMS_SCHEDULER.CREATE_JOB(job_name => 'EMPTY_JOB', job_type => 'PLSQL_BLOCK', job_action => 'begin null; end;', auto_drop => false); ROLLBACK; END; / PL/SQL procedure successfully completed. SELECT * FROM DBA_SCHEDULER_JOBS WHERE JOB_NAME='EMPTY_JOB'; no rows selected