一、資源管理器(DRM)由三個要素組成:
資源消費羣(resource consumer group)
資源計劃(resource plan)
資源計劃指令(resource plan directive)
執行與DRM有關的操作,必須具有 administer_resource_manager 系統權限。
二、資源消費羣
一個用戶可以隸屬於多個消費羣,但一個會話同一時間只能隸屬於一個消費羣。
ORACLE 已經預定義了4個消費羣:
default_consumer_group :未分配消費羣的用戶和會話。
other_groups :當前的資源計劃中沒有明確指定資源分配所有消費羣。任何一個資源計劃中都必須包含此羣。
sys_group 和 low_group :用於執行系統計劃的消費羣。
1、創建、更新、刪除消費羣()
創建:exec dbms_resource_manager.create_cosumer_group('羣名','註釋');
更新:exec dbms_resource_manager.update_consumer_group('羣名','註釋');
刪除:exec dbms_resource_manager.delete_consumer_group('羣名');
執行此命令後,隸屬於此羣的用戶和會話將自動轉到 default_consumer_group.
2、將用戶會話分配給消費羣(消費羣映射)
可以基於會話的屬性將會話動態分配給消費羣,成爲消費羣映射。
(1)設定映射:
dbms_resource_manager.set_consumer_group_mapping(
attribute => oracle_user,
value => 'user1',
consumer_group => 'low_group');
如上,當會話的oracle用戶屬性值爲user1時,就將之分配給消費羣low_group。
(2)設定映射優先權:
由於可能會出現某會話的兩個屬性分別滿足兩個不同的映射規則,那麼該服從哪個規則呢?——可以設定各個屬性的優先權,服從優先級高的屬性。
dbms_resource_manager.set_mapping_priority(
oracle_user => 1,
client_os_user => 2);
(3)動態轉換會話的消費羣
基於會話的唯一標識轉換消費羣:(會話唯一標識由 session_id 和 session_serial 共同組成,這兩個參數的值在 v$session 視圖中)。
BEGIN
DBMS_RESOURCE_MANAGER.SWITCH_CONSUMER_GROUP_FOR_SESS ('17', '12345',
'HIGH_PRIORITY');
END;
/
基於會話所屬的用戶轉換消費羣:(將用戶下的所有會話轉換消費羣)
BEGIN DBMS_RESOURCE_MANAGER.SWITCH_CONSUMER_GROUP_FOR_USER ('HR', 'LOW_GROUP'); END; /
用戶轉換自己當前會話的消費羣:(使用 dbms_session 包)
SET serveroutput on DECLARE old_group varchar2(30); BEGIN DBMS_SESSION.SWITCH_CURRENT_CONSUMER_GROUP('BATCH_GROUP', old_group, FALSE); END; /
轉換自己當前會話的消費羣需要特定權限:
dbms_resource_manager_privs.grant_switch_consumer_group( grantee_name => 'user1', consumer_group => 'low_group', grant_option => 'false');
撤銷此權限: dbms_resource_manager_privs.revoke_switch_consumer_group( grantee_name => 'user1', consumer_group => 'low_group');
三、資源計劃
分爲簡單資源計劃和複雜資源計劃。
1、簡單資源計劃
有如下特點:
(1)三要素在一個過程中定義。
(2)只能分配cpu資源。
(3)只能使用emphasis方式分配cpu資源(即百分比)。
(4)分配的消費羣最大數爲8個。
創建:
dbms_resource_manager.create_simple_plan(
simple_plan => '計劃名',
consumer_group1 => '消費羣1',
group1_cpu => 50,
consumer_group2 => '消費羣2',
group2_cpu => 50);
2、複雜資源計劃
特點:
(1)三要素必須單獨創建。
(2)可以嵌套子計劃。
創建:
dbms_resource_manager.create_plan(
plan => '計劃名',
comment => '註釋');
如:創建一個名爲DAYTIME的資源計劃
BEGIN DBMS_RESOURCE_MANAGER.CREATE_PLAN( PLAN => 'DAYTIME', COMMENT => 'More resources for OLTP applications'); END; /
3、修改資源計劃:
dbms_resource_manager.update_plan(
plan => '計劃名',
new_屬性 => '新值');
如:
BEGIN DBMS_RESOURCE_MANAGER.UPDATE_PLAN( PLAN => 'DAYTIME', NEW_COMMENT => '50% more resources for OLTP applications'); END; /
4、刪除資源計劃:
dbms_resource_manager.delete_plan('計劃名');
或
dbms_resource_manager.delete_plan_cascade('計劃名');
加上cascade參數,刪除計劃內的要素。
如:
BEGIN DBMS_RESOURCE_MANAGER.DELETE_PLAN(PLAN => 'great_bread'); END; /
四、計劃指令
創建:
dbms_resource_manager.create_plan_directive(
plan => '計劃名',
group_or_subplan => '消費羣或子計劃',
資源限制參數);
如:創建一個用於OLTP羣,如果超過10000的I / O請求或超過2500字節的數據轉移資源計劃到LOW_GROUP。會話調用完成後返回到其原始組
BEGIN DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE ( PLAN => 'DAYTIME', GROUP_OR_SUBPLAN => 'OLTP', COMMENT => 'OLTP group', MGMT_P1 => 75, SWITCH_GROUP => 'LOW_GROUP', SWITCH_IO_REQS => 10000, SWITCH_IO_MEGABYTES => 2500, SWITCH_FOR_CALL => TRUE); END; /
注:可以爲子計劃創建指令,但只能分配cpu資源。
更新:
dbms_resource_manager.update_plan_directive(
兩個必需參數,
new_屬性 => '新值');
如:
BEGIN DBMS_RESOURCE_MANAGER.CLEAR_PENDING_AREA(); DBMS_RESOURCE_MANAGER.CREATE_PENDING_AREA(); DBMS_RESOURCE_MANAGER.UPDATE_PLAN_DIRECTIVE( PLAN => 'SIMPLE_PLAN1', GROUP_OR_SUBPLAN => 'MYGROUP1', NEW_COMMENT => 'Higher priority' ); DBMS_RESOURCE_MANAGER.SUBMIT_PENDING_AREA(); END; /
刪除:
dbms_resource_manager.delete_plan_directive(
兩個必需參數);
參考官網:http://docs.oracle.com/cd/E11882_01/server.112/e25494/dbrm.htm#ADMIN11842