假如管理一下具有如下问题的产品数据库:
后台批作业占用了大量的资源,将会阻碍了其他要同时运行的更重要的作业。
如要调度大型作业,但不能预计它们何时才能完成。
作业的优先次序没有得到区分,而致使重要的作业不能预先完成。
某些用户使用过量的CPU时间,从而导致总体资源缺乏,这时,不得不结束其会话。
有些用户在操作中使用非常高的并行度,这会降低系统的整体性能。
所有这些问题都源于DBA不能够在竞争中有效地分配有限的资源,针对于这些问题,我们可以使用 Oracle database resource manager 来进行管理。
下面我们以例子的形式来介绍Oracle资源管理(resource manager)的使用。
一、Oracle Resource Manager存在的意义
1、如果数据库的资源分配由操作系统决定,会遇到如下问题:
(1) Excessive overhead过度的开销
Excessive overhead results from operating system context switching (OS 上下文切换)between Oracle Database server processes when the number of server processes is high.
(2) Inefficient scheduling低效率的调度
The operating system deschedules database servers while they hold latches, which is inefficient.
(3) Inappropriate allocation of resources不适当的资源分配
The operating system distributes resources equally among all active processes and cannot prioritize one task over another.
(4) Inability to manager database-specific resources,such as parallel execution servers and active sessions
2、Resource Manager允许数据库控制硬件资源的分配,在多用户并发执行不同优先级的Job时,不同的session可以按照不同的优先级对待,Resource Manager允许我们根据session的属性将session分类到不同的groups,然后对不同的groups分配不同的资源。
使用Resource Manager可以做到如下:
(1) 保护某个session分配到最小的CPU资源,而不管系统的压力和用户的数量。
(2) 针对不同的用户和应用分配不同比例的CPU时间。
(3) 限制用户组成员任何操作的并行深度。
(4) 管理并行队列中并行的执行顺序,紧急应用的并行可以优先于其他低优先级的并行。
(5) 限制group中用户可以使用并行的数量,这样可以确保所有可用的并行资源不会被分配到某一个group用户。
(6) 创建active session pool。Active session pool由同一个group中用户session被允许并发active的最大数量组成。附加的session可以超过这个限制执行,当job队列中断后,可以指定超时时间。
(7) 通过如下方法管理和调用runaway session
1) 修改group可以消耗CPU资源的比率值。
2) 检测session或者call是否超过了指定CPU或者I/O的限制。然后自动的中断session或call,或切换其小于consumer group中指定的CPU资源数。
(8) 阻止优化器估算其运行时间超过指定限制的操作。
(9) 限制session可以被空闲的时间。
(10) 根据工作量的改变允许数据库使用不同的resource plan。可以动态的修改这些resource plan。也可以在Scheduler中使用resource plan。
二、Oracle Resource Manager的组成元素
Element |
Description |
Resource consumer group |
A group of sessions that are grouped together based on resource requirements. The Resource Manager allocates resources to resource consumer groups, not to individual sessions. |
Resource plan |
A container for directives that specify how resources are allocated to resource consumer groups. You specify how the database allocates resources by activating a specific resource plan. |
Resource plan directive |
Associates a resource consumer group with a particular plan and specifies how resources are to be allocated to that resource consumer group. |
1、 Resource Consumer Groups
(1)Resource Consumer Group是一个用户session的集合,其根据session需要的进程进行归类,当一个session创建之后,它就自动根据用户指定的规则映射到对应的consumer group。
(2)DBA也可以手工的切换session到不同的consumer group。简言之,就是使用PL/SQL包来切换session到指定的consumer group。
(3)因为Resource Manager仅分配资源到一个consumer group,当一个session变成consumer group中的一员时,它的资源分配就由该consumer group决定。
(4)在数据字典里一直存在3个特定的consumer groups,它们不能被修改和删除。
2、 Resource plans
Resource plan是预先定义好的,可以创建任意个resource plan,但是在同一时刻只有一个resource plan是激活的。当resource plan是激活时,它的每个子resource plan控制每个资源分配到不同的consumer group。每个plan必须 包含一个指令,其分配资源到OTHER_GROUPS的consumer group。OTHER_GROUPS适用于所有的session,即使不是当前激活的plan。
3、 Resource Plan Directive
Resource Manager根据当前active resource plan的Resource Plan Directive的设置分配资源到consumer groups。Resource Plan和Resource Plan Directive是父子关系,每个Resource Plan Directive只对应一个consumer group。
三、管理Resource Manager的权限
管理Resource Manager必须具有ADMINISTER_RESOURCE_MANAGER权限,在DBA的role里已经包含了这个权限。
通过DBMS_RESOURCE_MANAGER_PRIVS包来执行ADMINISTER_RESOURCE_MANAGER权限的授予和撤销。该包中两个相关的procedures:
Procedure |
Description |
GRANT_SYSTEM_PRIVILEGE |
Grants the ADMINISTER_RESOURCE_MANAGER system privilege to a user or role. |
REVOKE_SYSTEM_PRIVILEGE |
Revokes the ADMINISTER_RESOURCE_MANAGER system privilege from a user or role. |
如:授予TEST用户ADMINISTER_RESOURCE_MANAGER权限
SYS@ tsid > begin
2 dbms_resource_manager_privs.grant_system_privilege(
3 grantee_name =>'TEST',
4 privilege_name =>'ADMINISTER_RESOURCE_MANAGER',
5 admin_option =>FALSE);
6 end;
7 /
PL/SQL procedure successfully completed.
撤销TEST用户ADMINISTER_RESOURCE_MANAGER权限
SYS@ tsid > begin
2 dbms_resource_manager_privs.revoke_system_privilege(
3 revokee_name =>'TEST',
4 privilege_name =>'ADMINISTER_RESOURCE_MANAGER');
5 end;
6 /
PL/SQL procedure successfully completed.
该包中另外两个procedures:
GRANT_SWITCH_CONSUMER_GROUP
REVOKE_SWITCH_CONSUMER_GROUP
四、Resource Manager管理的资源类型
1、 CPU
2、 Degree of Parallelism Limit
可以限制同一个consumer group中最大的并行数,degree of parallelism是同一个操作的并行执行的数量,使用PARALLEL_DEGREE_LIMIT_P1指令来指定consumer group的并行限制。
Degree of parallelism limit仅对consumer group中的一个操作限制,其不限制同一个consumer group中所有错做的并行度。但可以通过PARALLEL_DEGREE_LIMIT_P1和PARALLEL_TARGET_PERCENTAGE指令属性来实现该功能。
3、 Parallel Target Percentage
这个功能仅从oracle 11gR2开始使用!
如果一个consumer group使用了所有的并行,那么当其他consumer group的高优先级的并行就没有parallel server来分配,可以通过限制特定consumer group的并行数来避免这个问题。
使用PARALLEL_TARGET_PERCENTAGE指令属性可以指定consumer group可以使用最大parallel server pool的比率。
例如,假设总共的parallel server是32,在初始化参数里设置MY_GROUP consumer group的PARALLEL_SERVERS_TARGET为50%,那么该组group最大就只能使用16个parallel servers。
4、 Parallel Queue Timeout
这个功能从Oracle 11gR2以后才有!
当使用并行队列时,如果数据库没有足够的资源来执行并行,那么并行就会进入队列,直到有资源时才变成可用。但是存在一种情况,就是并行等待了很长的时间才执行,可以设置并行在队列中的最长等待时间来避免这种问题。
5、 Active Session Pool with Queuing
可以控制单个consumer group中最大的并发的active sessions的数量。这个最大的数就是active session pool。
6、 Automatic Consumer Group Switching
This methodenables you to control resource allocation by specifying criteria that, if met,causes the automatic switching of a session to a specified consumer group.Typically, this method is used to switch a session from a high-priorityconsumer group—one that receives a high proportion of system resources—to alower priority consumer group because that session exceeded the expectedresource consumption for a typical session in the group.
7、 Canceling SQL and Terminating Sessions
可以使用命令取消或中止long-runing的session。
8、 Execution Time Limit
可以指定操作最大的执行时间,如果超过这个时间,操作将终止。
9、 Undo Pool
可以为每个consumer group指定undo pool,undo pool控制总的undo数量。当总的undo生成量超过了这个限制,那么当前的事务操作生成的undo会被中断,只有undo pool空间足够时,才可以执行。
10、Idle Time Limit
指定session空闲时间,当超过这个时间时,session被中断。
五、
1、查看Resource consumer group
SYS@ tsid > select consumer_group from dba_rsrc_consumer_groups;
CONSUMER_GROUP
------------------------------
OTHER_GROUPS
DEFAULT_CONSUMER_GROUP
SYS_GROUP
LOW_GROUP
AUTO_TASK_CONSUMER_GROUP
2、查看Resource Plan
SYS@ tsid > select plan from dba_rsrc_plans;
PLAN
------------------------------
SYSTEM_PLAN
INTERNAL_PLAN
INTERNAL_QUIESCE
对于DBA,已经具有执行dbms_resource_manager程序包下的所有过程的权限,但对于其他用户,需要授予名为
administer_resource_manager的系统权限,以便使用Oracle resource manager。如下:
begin dbms_resource_manager_privs.grant_system_privilege( grantee_name=>'dbonread', privilege_name=>'administer_resource_manager', admin_option=>true); end; / begin dbms_resource_manager_privs.grant_system_privilege( grantee_name=>'dbonread01', privilege_name=>'administer_resource_manager', admin_option=>true); end; /
|
说明:我们利用dbms_resource_manager_privs.包中的gratn_system_privilege过程为用户dbonread和dbonread01授予administer_resource_manager权限。
未决区是创建与资源消费组,资源计划,资源指示的临时工作区。创建如下:
exec dbms_resource_manager.clear_pending_area();
exec dbms_resource_manager.create_pending_area();
、、实际操作!!!
exec dbms_resource_manager.submit_pending_area;
根据实际需求创建所需要的用户组,需要注意的是虽然这一步并没有创建 OTHER_GROUPS 用户组,但是后面必须为 OTHER_GROUPS 用户组创建相对应的Plan Directive
范例:
SQL> BEGIN
DBMS_RESOURCE_MANAGER.CREATE_CONSUMER_GROUP(
consumer_group => 'GROUP_OLTP',
comment => 'Group of OLTP USERS...',
mgmt_mth => 'ROUND-ROBIN'); --该用户组内各会话的CPU资源采取轮询的分配方法
6 END;
7 /
资源消费组用来根据资源需求将类似的用户放到一起。例子如下:
begin
dbms_resource_manager.create_consumer_group(
consumer_group=>'app',
comment=>'app user');
end;
/
begin
dbms_resource_manager.create_consumer_group(
consumer_group=>'admin',
comment=>'user admin system');
end;
/
SQL>
说明:consuber_group用来指定资源消费组名,connent用来给资源消费组添加注释。还有一些默认的参数,
如CPU_MTH,该参数有两个值为:run_to_completion和round_robin(默认)。run_to_completion方法为优先调度那些占用较长时间的会话,
round_robin是使用一个循环调度系统。
对于上述,我们使用默认的CPU调度方法创建消费组app和admin。我们可以用如下的数据字典查看:
set lines 120
col consumer_group for a15
col cpu_method for a14
col mgmt_method for a14
select consumer_group,cpu_method,mgmt_method
from dba_rsrc_consumer_groups
where consumer_group in (upper('app'),upper('admin'));
CONSUMER_GROUP CPU_METHOD MGMT_METHOD
--------------- -------------- --------------
APP ROUND-ROBIN ROUND-ROBIN
ADMIN ROUND-ROBIN ROUND-ROBIN
创建资源计划时需要注意的一点是如果 sub_plan 参数指定为 TRUE,那么这个计划只能作为子计划使用,并且不需要为 OTHER_GROUPS 创建 Plan Directive
资源计划包含各资源消费组之间资源分配的指示。例子如下:
begin
dbms_resource_manager.create_plan(
plan=>'membership_plan',
cpu_mth=>'ratio',
comment=>'new membership resource plan');
end;
/
说明: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)用来把资源计划分配到资源消费组中。例子如下:
begin dbms_resource_manager.create_plan_directive( plan=>'membership_plan', group_or_subplan=>'app', comment=>'app grooup', cpu_p1=>5); end; /
--将5%-10% BEGIN dbmsresource_manager.update_plan_directive( plan=>'membership_plan', group_or_subplan=>'app', new_cpu_p1=>50); dbms_resource_manager.submit_pending_area(); end; /
begin dbms_resource_manager.create_plan_directive( plan=>'membership_plan', group_or_subplan=>'admin', comment=>'admin group', cpu_p1=>70); end; /
begin dbms_resource_manager.create_plan_directive( plan=>'membership_plan', group_or_subplan=>'other_groups', comment=>'other group', cpu_p1=>20); end; /
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将完成顶层后被切换以原来的会话。
BEGIN
dbms_resource_manager.clear_pending_area();
dbms_resource_manager.create_pending_area();
dbms_resource_manager.update_plan_directive(
plan => ?,
group_or_subplan => ?,
new_comment => ?,
new_mgmt_p1 => ?, new_mgmt_p2 => ?, new_mgmt_p3 => ?, new_mgmt_p4 => ?,
new_mgmt_p5 => ?, new_mgmt_p6 => ?, new_mgmt_p7 => ?, new_mgmt_p8 => ? ,
new_parallel_degree_limit_p1 => ? ,
new_switch_io_reqs => ?,
new_switch_io_megabytes => ?
,
new_active_sess_pool_p1 => ?,
new_queueing_p1 => ?,
new_switch_group => ?,
new_switch_time => ?,
new_switch_estimate => case ? when 'false' then false when 'true' then true else false end ,
new_max_est_exec_time => ?,
new_undo_pool => ? ,
new_max_idle_time => ?,
new_max_idle_blocker_time => ?,
new_switch_for_call => case ? when 'false' then false when 'true' then true else false end
);
dbms_resource_manager.submit_pending_area();
END;
exec dbms_resource_manager.validate_pending_area;
exec dbms_resource_manager.submit_pending_area;
SQL>
我们用如下的方式进行查看:
select group_or_subplan,cpu_p1,cpu_p2,cpu_p3,status
from dba_rsrc_plan_directives
where plan = upper('test');
GROUP_OR_SUBPLAN CPU_P1 CPU_P2 CPU_P3 STATUS
------------------------------ ---------- ---------- ----------
APP 10 0 0
ADMIN 70 0 0
OTHER_GROUPS 20 0 0
创建用户后,Oracle会分配一个默认的资源消费组,为default_consumer_group,如果指派用户到其他消费组,那么,
需要授予如下权限:
exec dbms_resource_manager_privs.grant_switch_consumer_group(grantee_name=>'dbonread',consumer_group=>'app',grant_option=>true);
SQL>
exec dbms_resource_manager_privs.grant_switch_consumer_group(grantee_name=>'dbonread01',consumer_group=>'admin',grant_option=>true);
SQL>
下面我们进行用户分配:
SQL>exec dbms_resource_manager.set_initial_consumer_group('dbonread','app');
exec dbms_resource_manager.set_initial_consumer_group('dbonread01','admin');
关于会话资源消费组的自动指派和消费组之间的切换及复杂管理,我这里没有列出,方法一样,只是多了几道手续而已,有需要的请查阅相关资料或给我留言。
下面,我们查看用户dbonread,dbonread01的属性:
select username,initial_rsrc_consumer_group
from dba_users
where username in(upper('dbonread'),upper('dbonread01'));
USERNAME INITIAL_RSRC_CONSUMER_GROUP
------------------------------ ------------------------------
DBONREAD APP
DBONREAD01 ADMIN
DBMS_RESOURCE_MANAGER.set_consumer_group_mapping
DBMS_RESOURCE_MANAGER.set_consumer_group_mapping_pri
DBMS_RESOURCE_MANAGER.set_initial_consumer_group
根据会话的登录和运行属性建立该会话和资源用户组的映射关系,可以使用过程 SET_INITIAL_CONSUMER_GROUP 通过“Username”设置用户的初始用户资源组,该过程在11gR1被弃用后,改为使用过程 SET_CONSUMER_GROUP_MAPPING 通过“Session Attribute”来映射用户组。
这里所说的会话属性包括:
oracle_user,
client_os_user,
client_program,
client_machine,
module_name ...
module_name_action
service_moudle
service_name
当会话的多个属性映射发生冲突时,会根据每个属性的优先级来决定最终映射关系,使用这个过程来调整属性的优先级:SET_CONSUMER_GROUP_MAPPING_PRI
SQL> BEGIN
2 DBMS_RESOURCE_MANAGER.SET_CONSUMER_GROUP_MAPPING(
3 attribute => 'CLIENT_MACHINE',
4 value => 'ASM', --将从“ASM”客户机发起的会话映射到“GROUP_OLAP”用户组
5 consumer_group => 'GROUP_OLAP');
6 END;
7 /
PL/SQL procedure successfully completed.
SQL> BEGIN
2 DBMS_RESOURCE_MANAGER.SET_CONSUMER_GROUP_MAPPING(
3 attribute => 'CLIENT_MACHINE',
4 value => 'WORKGROUP\XIAO', --将从“WORKGROUP\XIAO”客户机发起的会话映射到“GROUP_OLTP”用户组
5 consumer_group => 'GROUP_OLTP');
6 END;
7 /
PL/SQL procedure successfully completed.
通过设置init.ora或spfile.ora文件中的resource_manager_plan参数来进行启用,如下:
alter system set resource_manager_plan = membership_plan;
说明:如果需要停止,那么将其设置为空即可(resource_manager_plan=' ')。下面,我们查看当前的活动资源:
select name,is_top_plan from v$rsrc_plan;
NAME IS_TO
-------------------------------- -----
MEMBERSHIP_PLAN TRUE
该资源成功使用。
实验目的,旨在限制用户nmosdb用户使用cpu比率在10%,其他用户在90%.
create user nmosdb identified by "ora#123"; grant connect ,resource to nmosdb;
begin dbms_resource_manager_privs.grant_system_privilege( grantee_name=>'nmosdb', privilege_name=>'administer_resource_manager', admin_option=>true); end; /
exec dbms_resource_manager.clear_pending_area();
BEGIN END; /
begin dbms_resource_manager.create_plan( plan=>'test', cpu_mth=>'ratio', comment=>'nexxxw membership resource plan'); end; / begin dbms_resource_manager.create_plan_directive( plan=>'test', group_or_subplan=>'READ_GRPS', comment=>'apxxxp grooup', cpu_p1=>10); end; / begin dbms_resource_manager.create_plan_directive( plan=>'test', group_or_subplan=>'OTHER_GROUPS', comment=>'OTHER grooup', cpu_p1=>90); end; / exec dbms_resource_manager.validate_pending_area; exec dbms_resource_manager.submit_pending_area; select group_or_subplan,cpu_p1,cpu_p2,cpu_p3,status from dba_rsrc_plan_directives where plan = upper('test');
alter system set resource_manager_plan = test; select name,is_top_plan from v$rsrc_plan; |
Other groups当前的资源计划中,没有明确指定资源分配的所有消费群。
Sys_group和low_group 用于执行系统计划的消费群。
监本2
You plan to control the sessions performing a huge number of I/O operations. Your requirement
is to kill the session when it exceeds a specified number of I/Os.
Implement the database resource manager to add the SWITCH_IO_REQS and SWITCH_GROUP directives. |
B. SET_MAPPING_PRIORITY
SELECT T.NAME,T.ACTIVE_SESSIONS,T.QUEUE_LENGTH,T.CONSUMED_CPU_TIME,T.CPU_WAITS,T.CPU_WAIT_TIME FROM V$RSRC_CONSUMER_GROUP T;