Resource Manager資源管理之使用組切換分析

物理狂人發表於2011-12-09

一、建立實驗所需計劃、使用者組等


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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章