ITPub博客

首页 > Linux操作系统 > Linux操作系统 > Resource Manager资源管理之使用组切换分析

Resource Manager资源管理之使用组切换分析

原创 Linux操作系统 作者:物理狂人 时间:2011-12-09 10:55:30 0 删除 编辑

一、创建实验所需计划、用户组等


1)创建erp_plan计划,otlpbatch用户组

 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)授予用户oltpbatch切换权限后,用户可以切换到指导使用者组

 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) 设置oltpbatch默认用户组

 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



二、准备实验测试分析


创建batcholtp表,并查看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                    0

OTHER_GROU               1                   0                    0

PS

OLTP                     0                   0                    1


batchundo_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使用组,因为我们只分配一个sessionbatch使用组

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秒,所以不是由于执行时间导致的使用组切换,当我们把batchundo_pool设置为100时,并在batch会话执行同样的insert 语句,我们发现ORA-30027: 违反还原限额的错误。故说明了当oltp会话在执行插入语句时,发现产生的undo数据大于oltp组的限制,于是切换到batch组,此时batch组的限额为50000,满足需求,故能完成插入操作。如果还是不能满足,则还是要报错。



实验二:


batchundo_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/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2010-06-16

  • 博文量
    80
  • 访问量
    140499