一、创建实验所需计划、用户组等
1)创建erp_plan计划,otlp、batch用户组
1 BEGIN
2 DBMS_RESOURCE_MANAGER.CREATE_PENDING_AREA();
3 DBMS_RESOURCE_MANAGER.CREATE_PLAN(PLAN => 'erp_plan',
4 COMMENT => 'Resource plan/method for ERP Database');
5 DBMS_RESOURCE_MANAGER.CREATE_CONSUMER_GROUP(CONSUMER_GROUP => 'oltp',
6 COMMENT => 'Resource consumer group/method for OLTP jobs');
7 DBMS_RESOURCE_MANAGER.CREATE_CONSUMER_GROUP(CONSUMER_GROUP => 'batch',
8 COMMENT => 'Resource consumer group/method for BATCH jobs');
9 DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE(PLAN => 'erp_plan',
10 GROUP_OR_SUBPLAN => 'oltp', COMMENT => 'OLTP sessions', CPU_P1 => 80,
11 SWITCH_GROUP => 'batch', SWITCH_TIME => 1,SWITCH_ESTIMATE => TRUE,
12 UNDO_POOL => 100);
13 DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE(PLAN => 'erp_plan',
14 GROUP_OR_SUBPLAN => 'batch', COMMENT => 'BATCH sessions', CPU_P2 => 100,
15 ACTIVE_SESS_POOL_P1 => 1, QUEUEING_P1 => 5,
16 UNDO_POOL=>50000);
17 DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE(PLAN => 'erp_plan',
18 GROUP_OR_SUBPLAN => 'OTHER_GROUPS', COMMENT => 'mandatory', CPU_P3 => 100
;
19 DBMS_RESOURCE_MANAGER.VALIDATE_PENDING_AREA();
20 DBMS_RESOURCE_MANAGER.SUBMIT_PENDING_AREA();
21* END;
2)授予用户oltp、batch切换权限后,用户可以切换到指导使用者组
1 begin
2 dbms_resource_manager_privs.grant_switch_consumer_group(
3 grantee_name => 'oltp',
4 consumer_group => 'oltp',
5 grant_option => false );
6* end;
1 begin
2 dbms_resource_manager_privs.grant_switch_consumer_group(
3 grantee_name => 'batch',
4 consumer_group => 'batch',
5 grant_option => false );
6* end;
3) 设置oltp、batch默认用户组
1 begin
2 dbms_resource_manager.set_initial_consumer_group(
3 user => 'oltp', consumer_group => 'oltp');
4* end;
1 begin
2 dbms_resource_manager.set_initial_consumer_group(
3 user => 'batch', consumer_group => 'batch');
4* end;
4) 查看当前会话的资源用户组
SQL> show user;
USER 为 "BATCH"
SQL> select resource_consumer_group from v$session
2 where sid =(select sid from v$mystat where rownum=1);
RESOURCE_CONSUMER_GROUP
--------------------------------
BATCH
SQL> show user;
USER 为 "OLTP"
SQL> select resource_consumer_group from v$session
2 where sid =(select sid from v$mystat where rownum=1);
RESOURCE_CONSUMER_GROUP
--------------------------------
OLTP
5) 激活erp_plan计划
SQL> alter system set resource_manager_plan='ERP_PLAN';
系统已更改。
SQL> select * from v$rsrc_plan;
ID NAME IS_TO
---------- -------------------------------- -----
56227 ERP_PLAN TRUE
二、准备实验测试分析
创建batch、oltp表,并查看v$rsrc_consumer_group
Create table batch as select * from dba_objects;
Create table oltp as select * from dba_objects;
SQL> select name,active_sessions, session_switches_in, session_switches_out,req
uests from v$rsrc_consumer_group;
NAME ACTIVE_SESSIONS SESSION_SWITCHES_IN SESSION_SWITCHES_OUT
---------- --------------- ------------------- --------------------
BATCH 0 0 0
OTHER_GROU 1 0 0
PS
OLTP 0 0 0
SQL> select plan,group_or_subplan, undo_pool from DBA_RSRC_PLAN_DIRECTIVES where
plan= 'ERP_PLAN';
PLAN GROUP_OR_SUBPLAN UNDO_POOL
------------------------------ ------------------------------ ----------
ERP_PLAN BATCH 50000
ERP_PLAN OTHER_GROUPS
ERP_PLAN OLTP 100
实验一:
在oltp会话执行:
SQL> set timing on
SQL> insert into oltp select * from oltp;
已创建50652行。
已用时间: 00: 00: 00.25
NAME ACTIVE_SESSIONS SESSION_SWITCHES_IN SESSION_SWITCHES_OUT
---------- --------------- ------------------- -------------------- -
BATCH 1 1 0
OTHER_GROU 1 0 0
PS
OLTP 0 0 1
将batch的undo_pool改为100
SQL> select plan,group_or_subplan, undo_pool from DBA_RSRC_PLAN_DIRECTIVES where
plan= 'ERP_PLAN';
PLAN GROUP_OR_SUBPLAN UNDO_POOL
------------------------------ ------------------------------ ----------
ERP_PLAN BATCH 100
ERP_PLAN OTHER_GROUPS
ERP_PLAN OLTP 100
先关闭oltp会话,使其退出batch使用组,因为我们只分配一个session给batch使用组
NAME ACTIVE_SESSIONS SESSION_SWITCHES_IN SESSION_SWITCHES_OUT
---------- --------------- ------------------- --------------------
BATCH 0 0 1
OTHER_GROU 1 0 0
PS
OLTP 0 1 0
在batch会话执行:
SQL> set timing on
SQL> insert into batch select * from batch;
insert into batch select * from batch
*
第 1 行出现错误:
ORA-30027: 违反还原限额 - 无法获得 128 个(字节)
已用时间: 00: 00: 00.06
在oltp会话执行:
SQL> set timing on
SQL> insert into oltp select * from oltp;
insert into oltp select * from oltp
*
第 1 行出现错误:
ORA-30027: 违反还原限额 - 无法获得 200 个(字节)
分析:发现在oltp会话执行插入时发生了一次使用组切换,从oltp到batch,并且处于活动会话状态,根据我们的设置可以发现,switch_time=1,执行时间并没有超过1秒,所以不是由于执行时间导致的使用组切换,当我们把batch的undo_pool设置为100时,并在batch会话执行同样的insert 语句,我们发现ORA-30027: 违反还原限额的错误。故说明了当oltp会话在执行插入语句时,发现产生的undo数据大于oltp组的限制,于是切换到batch组,此时batch组的限额为50000,满足需求,故能完成插入操作。如果还是不能满足,则还是要报错。
实验二:
将batch的undo_pool设置回50000,然后在oltp执行刚才的插入操作
PLAN GROUP_OR_SUBPLAN UNDO_POOL
------------------------------ ------------------------------ ----------
ERP_PLAN BATCH 50000
ERP_PLAN OTHER_GROUPS
ERP_PLAN OLTP 100
在oltp插入数据:
SQL> insert into oltp select * from oltp;
已创建101304行。
已用时间: 00: 00: 00.25
此时系统中有batch活动会话存在
NAME ACTIVE_SESSIONS SESSION_SWITCHES_IN SESSION_SWITCHES_OUT
---------- --------------- ------------------- --------------------
BATCH 1 0 1
OTHER_GROU 1 0 0
PS
OLTP 0 1 0
当在另一个窗口想以batch登录时显示超时错误,因为计划中只允许一个活动会话存在:
E:\Documents and Settings\Administrator>sqlplus batch/batch
SQL*Plus: Release 10.2.0.4.0 - Production on 星期五 12月 9 13:15:50 2011
Copyright (c) 1982, 2007, Oracle. All Rights Reserved.
ERROR:
ORA-07454: 队列超时, 已超过 5 秒
然后,当我们在另一个窗口打开oltp,并执行插入插入,并切换到batch组时,我们发现:
NAME ACTIVE_SESSIONS SESSION_SWITCHES_IN SESSION_SWITCHES_OUT
---------- --------------- ------------------- --------------------
BATCH 2 2 0
OTHER_GROU 1 0 0
PS
OLTP 0 0 2
分析:计划指定中设定的最大会话池,只能限定新的会话打开,即当已有活动会话数达到上限时,不能再让新的会话登录,但它对从其他用户组切换进来的会话没有限制作用,即当活动会话数达到上限时,otlp因为达到没有标准而切换到batch,此时还是可以成功。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/24104518/viewspace-713032/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/24104518/viewspace-713032/
本文详细介绍了如何创建ERP数据库资源计划、设置用户组、切换权限、设置默认用户组及观察并发操作行为,通过实验展示了数据库资源管理与并发控制的重要性。
105

被折叠的 条评论
为什么被折叠?



