Oracle 资源管理(resource manager)

来源:互联网 发布:在线aes算法 编辑:程序博客网 时间:2024/04/25 23:42

假如管理一下具有如下问题的产品数据库:
后台批作业占用了大量的资源,将会阻碍了其他要同时运行的更重要的作业。
如要调度大型作业,但不能预计它们何时才能完成。
作业的优先次序没有得到区分,而致使重要的作业不能预先完成。
某些用户使用过量的CPU时间,从而导致总体资源缺乏,这时,不得不结束其会话。
有些用户在操作中使用非常高的并行度,这会降低系统的整体性能。
所有这些问题都源于DBA不能够在竞争中有效地分配有限的资源,这时,很可能会收到愤怒的客户电话。
针对于这些问题,我们可以使用 Oracle database resource manager 来进行管理。
下面我们以例子的形式来介绍Oracle资源管理(resource manager)的使用。


一、授权
对于DBA,已经具有执行dbms_resource_manager程序包下的所有过程的权限,但对于其他用户,需要授予名为
administer_resource_manager的系统权限,以便使用Oracle resource manager。如下:
SQL> begin
  2     dbms_resource_manager_privs.grant_system_privilege(
  3     grantee_name=>'djp01',
  4     privilege_name=>'administer_resource_manager',
  5     admin_option=>true);
  6  end;
  7  /


PL/SQL procedure successfully completed.


SQL>
SQL> begin
  2     dbms_resource_manager_privs.grant_system_privilege(
  3     grantee_name=>'imadmin',
  4     privilege_name=>'administer_resource_manager',
  5     admin_option=>true);
  6  end;
  7  /


PL/SQL procedure successfully completed.


SQL>
说明:我们利用dbms_resource_manager_privs.包中的gratn_system_privilege过程为用户djp01和imadmin授予administer_resource_manager权限。


二、创建未决区
未决区是创建与资源消费组,资源计划,资源指示的临时工作区。创建如下:
SQL> exec dbms_resource_manager.create_pending_area;


PL/SQL procedure successfully completed.


SQL>


三、创建资源消费组
资源消费组用来根据资源需求将类似的用户放到一起。例子如下:
SQL> begin
  2     dbms_resource_manager.create_consumer_group(
  3     consumer_group=>'app',
  4     comment=>'app user');
  5  end;
  6  /


PL/SQL procedure successfully completed.


SQL> 
SQL> begin
  2     dbms_resource_manager.create_consumer_group(
  3     consumer_group=>'admin',
  4     comment=>'user admin system');
  5  end;
  6  /


PL/SQL procedure successfully completed.


SQL>
说明:consuber_group用来指定资源消费组名,connent用来给资源消费组添加注释。还有一些默认的参数,如CPU_MTH,该参数有两个值为:run_to_completion和round_robin(默认)。run_to_completion方法为优先调度那些占用较长时间的会话,
round_robin是使用一个循环调度系统。对于上述,我们使用默认的CPU调度方法创建消费组app和admin。我们可以用如下的数据字典查看:
SQL> select consumer_group,cpu_method,mgmt_method
  2  from dba_rsrc_consumer_groups
  3  where consumer_group in (upper('app'),upper('admin'))
  4  /


CONSUMER_GROUP
------------------------------------------------------------
CPU_METHOD
------------------------------------------------------------
MGMT_METHOD
------------------------------------------------------------
ADMIN
ROUND-ROBIN
ROUND-ROBIN


APP
ROUND-ROBIN
ROUND-ROBIN




SQL>


四、创建资源计划:
资源计划包含各资源消费组之间资源分配的指示。例子如下:
SQL> begin
  2     dbms_resource_manager.create_plan(
  3     plan=>'membership_plan',
  4     cpu_mth=>'ratio',
  5     comment=>'new membership resource plan');
  6  end;
  7  /


PL/SQL procedure successfully completed.


SQL>
说明:plan用来指定资源计划的名称,CPU_mth指定资源消费组之间分配CPU的方法,默认为emphasisI(百分比),另一个值为ratio(比率)。connect添加注释。还有一些其他默认的参数:active_sess_pool_mth此参数确定资源组中活动会话数目的限制;到11g版本,唯一一个值为active_sess_pool_absolute方法。parallel_degree_limit_mth此参数确定某个特定操作的并行度,到11g版本,唯一一个值为parallel_degree_limit_absolute。sub_plan此参数确定是否子计划,默认为false。queueing_mth此参数确定排队会话将执行的顺序,可以选项为fifo_timeout。


五、创建资源计划指示
资源计划指示(resource plan directive)用来把资源计划分配到资源消费组中。例子如下:
SQL> begin
  2     dbms_resource_manager.create_plan_directive(
  3     plan=>'membership_plan',
  4     group_or_subplan=>'app',
  5     comment=>'app grooup',
  6     cpu_p1=>100);
  7  end;
  8  /


PL/SQL procedure successfully completed.


SQL> begin
  2     dbms_resource_manager.create_plan_directive(
  3     plan=>'membership_plan',
  4     group_or_subplan=>'admin',
  5     comment=>'admin group',
  6     cpu_p2=>70);
  7  end;
  8  /


PL/SQL procedure successfully completed.


SQL>
说明:plan用于指定资源计划,group_or_subplan用于指定资源消费组或子计划,connent用于添加注释。
cpu_pn此参数指定可在消费组或子计划中分配CPU资源。可以使用多层CPU资源分配,以区分出CPU的优先级。如,保证仅在层次一需求后还剩的CPU时,层次二才能获得CPU资源。 ACTIVE_SESS_POOL_P1此参数用来设置活动会话打开的最大数目。 PARALLEL_DEGREE_LIMIT_P1此参数用来设置并行度的限制,MAX_IDLE_TIME此参数用来设置单个会话空间的最大时间。 SWITCH_GROUP此参数指定会话可根据特定的切换条件进行切换的消费组。两个切换组为cancel_sql 和kill_session。与
SWITCH_GROUP有关参数的设置,SWITCH_IO_MEGABYTES此参数指定会话在数据库在采取措施前可以传送的IO字节数据。 SWITCH_IO_REQS指定可执行的IO数目。SWITCH_FOR_CALL如果设置为true,Oracle将完成顶层后被切换以原来的会话。


六、验证并提交未决区
SQL> exec dbms_resource_manager.validate_pending_area;


PL/SQL procedure successfully completed.


SQL> exec dbms_resource_manager.submit_pending_area;


PL/SQL procedure successfully completed.


SQL>
我们用如下的方式进行查看:
SQL> select group_or_subplan,cpu_p1,cpu_p2,cpu_p3,status
  2  from dba_rsrc_plan_directives
  3  where plan = upper('membership_plan')
  4  /


GROUP_OR_SUBPLAN                                                 CPU_P1
------------------------------------------------------------ ----------
    CPU_P2     CPU_P3
---------- ----------
STATUS
------------------------------------------------------------
APP                                                                  90
         0          0




ADMIN                                                                 0
         70          0






SQL>


七、指派用户到资源消费组中,如下:
创建用户后,Oracle会分配一个默认的资源消费组,为default_consumer_group,如果指派用户到其他消费组,那么,
需要授予如下权限:
SQL> exec dbms_resource_manager_privs.grant_switch_consumer_group-
> (grantee_name=>'djp01',-
> consumer_group=>'app',-
> grant_option=>true);


PL/SQL procedure successfully completed.


SQL> 
SQL> exec dbms_resource_manager_privs.grant_switch_consumer_group-
> (grantee_name=>'imadmin',-
> consumer_group=>'admin',-
> grant_option=>true);


PL/SQL procedure successfully completed.


SQL>
下面我们进行用户分配:
SQL> exec dbms_resource_manager.set_initial_consumer_group('djp01','app');


PL/SQL procedure successfully completed.


SQL> exec dbms_resource_manager.set_initial_consumer_group('imadmin','admin');


PL/SQL procedure successfully completed.


SQL>
关于会话资源消费组的自动指派和消费组之间的切换及复杂管理,我这里没有列出,方法一样,只是多了几道手续而已,有需要的请查阅相关资料或给我留言。
下面,我们查看用户djp01,imadmin的属性:
SQL> select username,initial_rsrc_consumer_group
  2  from dba_users
  3  where username in(upper('djp01'),upper('imadmin'))
  4  /


USERNAME
------------------------------------------------------------
INITIAL_RSRC_CONSUMER_GROUP
------------------------------------------------------------
IMADMIN
ADMIN


DJP01
APP




SQL>


八、启用Oracle Resource Manager
通过设置init.ora或spfile.ora文件中的resource_manager_plan参数来进行启用,如下:
SQL> alter system set resource_manager_plan = membership_plan
  2  /


System altered.


SQL>
说明:如果需要停止,那么将其设置为空即可(resource_manager_plan=' ')。下面,我们查看当前的活动资源:
SQL> select name,is_top_plan
  2  from v$rsrc_plan
  3  /


NAME                                                             IS_TOP_PLA
---------------------------------------------------------------- ----------
MEMBERSHIP_PLAN                                                  TRUE


SQL>
该资源成功使用。
关于消费组的、资源计划与指示的更改和删除,用法一样,我这里没有列出,有需要的,请查阅相关资料或给我留言。