假如管理一下具有如下问题的产品数据库:
后台批作业占用了大量的资源,将会阻碍了其他要同时运行的更重要的作业。
如要调度大型作业,但不能预计它们何时才能完成。
作业的优先次序没有得到区分,而致使重要的作业不能预先完成。
某些用户使用过量的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>
该资源成功使用。
关于消费组的、资源计划与指示的更改和删除,用法一样,我这里没有列出,有需要的,请查阅相关资料或给我留言。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29196873/viewspace-1098090/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/29196873/viewspace-1098090/