Oracle DBMS_RESOURCE_MANAGER 用法例子

General

Note: Resource Manager requires a massive over-demand on CPU before the expected behavior starts to show: Generally speaking a 300% or 400% CPU load to see that the actual split gets closer to expectation, with the lower-privileged processes losing time in a wait state whose name includes 'resmgr: ....{something}..'

Source

{ORACLE_HOME}/rdbms/admin/dbmsrmad.sql

First Available

8.1.5


Consumer Group Mapping Constants

Name

Data Type

Value

client_machine

VARCHAR2(30)

'CLIENT_MACHINE'

client_os_user

VARCHAR2(30)

'CLIENT_OS_USER'

client_program

VARCHAR2(30)

'CLIENT_PROGRAM'

module_name

VARCHAR2(30)

'MODULE_NAME'

module_name_action

VARCHAR2(30)

'MODULE_NAME_ACTION'

oracle_user

VARCHAR2(30)

'ORACLE_USER'

performance_class

VARCHAR2(30)

'PERFORMANCE_CLASS'

service_module

VARCHAR2(30)

'SERVICE_MODULE'

service_module_action

VARCHAR2(30)

'SERVICE_MODULE_ACTION'

service_name

VARCHAR2(30)

'SERVICE_NAME'

 


Consumer Group Mapping Constants

Name

Data Type

Value

client_machine

VARCHAR2(30)

'CLIENT_MACHINE'

client_os_user

VARCHAR2(30)

'CLIENT_OS_USER'

client_program

VARCHAR2(30)

'CLIENT_PROGRAM'

module_name

VARCHAR2(30)

'MODULE_NAME'

module_name_action

VARCHAR2(30)

'MODULE_NAME_ACTION'

oracle_user

VARCHAR2(30)

'ORACLE_USER'

service_module

VARCHAR2(30)

'SERVICE_MODULE'

service_module_action

VARCHAR2(30)

'SERVICE_MODULE_ACTION'

service_name

VARCHAR2(30)

'SERVICE_NAME'

 

CLEAR_PENDING_AREA

Clears the work area for the resource manager

dbms_resource_manager.clear_pending_area;

exec dbms_resource_manager.clear_pending_area ;

CREATE_PENDING_AREA

Creates a work area for changes to resource manager objects

dbms_resource_manager.create_pending_area;

See Demo

DELETE_CONSUMER_GROUP

Delete entries that define resource consumer groups

dbms_resource_manager.delete_consumer_group(consumer_group IN VARCHAR2);

See Demo

 

DELETE_PLAN

Deletes the specified plan as well as all the plan directives to which it refers

dbms_resource_manager.delete_plan(plan IN VARCHAR2);

exec dbms_resource_manager.delete_plan ('UW_PLAN');

 

DELETE_PLAN_CASCADE

Deletes the specified plan as well as well as its descendants (plan directives, subplans, consumer groups)

dbms_resource_manager.delete_plan_cascade(plan IN VARCHAR2);

See Demo

 

DELETE_PLAN_DIRECTIVE

Delete resource plan directives

dbms_resource_manager.delete_plan_directive(
plan             IN VARCHAR2,
group_or_subplan IN VARCHAR2);

See Demo

 

SET_CONSUMER_GROUP_MAPPING

Adds, deletes, or modifies entries that map sessions to consumer groups, based on the session's login and runtime attributes

dbms_resource_manager.set_consumer_group_mapping(
attribute      IN VARCHAR2,
value          IN VARCHAR2,
consumer_group IN VARCHAR2 DEFAULT NULL);

TBD

 

SET_CONSUMER_GROUP_MAPPING_PRI


Creates the session attribute mapping priority list

The highest priority is 1, the lowest 10 (the docs are incorrect)

dbms_resource_manager.set_consumer_group_mapping_pri(
explicit              IN NUMBER,
oracle_user           IN NUMBER,
service_name          IN NUMBER,
client_os_user        IN NUMBER,
client_program        IN NUMBER,
client_machine        IN NUMBER,
module_name           IN NUMBER,
module_name_action    IN NUMBER,
service_module        IN NUMBER,
service_module_action IN NUMBER);

desc dba_rsrc_mapping_priority

SELECT *
FROM dba_rsrc_mapping_priority;

exec dbms_resource_manager.create_pending_area ;

exec dbms_resource_manager.set_consumer_group_mapping_pri(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

exec dbms_resource_manager.validate_pending_area ;

exec dbms_resource_manager.submit_pending_area ;

SELECT *
FROM dba_rsrc_mapping_priority;

exec dbms_resource_manager.create_pending_area ;

exec dbms_resource_manager.set_consumer_group_mapping_pri(1, 7, 6, 9, 8, 10, 5, 4, 3, 2);

exec dbms_resource_manager.validate_pending_area ;

exec dbms_resource_manager.submit_pending_area ;

 

SET_INITIAL_CONSUMER_GROUP

Assigns the initial resource consumer group for a user: Obsolete

dbms_resource_manager.set_initial_consumer_group(
user           IN VARCHAR2,
consumer_group IN VARCHAR2);

Deprecated

 

SUBMIT_PENDING_AREA

Submits pending changes for the resource manager

dbms_resource_manager.submit_pending_area;

See Demo

 

SWITCH_CONSUMER_GROUP_FOR_SESS


Changes the resource consumer group of a specific session

dbms_resource_manager.switch_consumer_group_for_sess(
session_id     IN NUMBER,
session_serial IN NUMBER,
consumer_group IN VARCHAR2);

SELECT username, initial_rsrc_consumer_group
FROM dba_users
ORDER BY 1;

col schemaname format a15
col program format a20

SELECT sid, serial#, schemaname, osuser, program
FROM gv$session
WHERE service_name NOT LIKE '%BACK%';

exec dbms_resource_manager.switch_consumer_group_for_sess (147, 1883, 'SYS_GROUP');

SELECT username, initial_rsrc_consumer_group
FROM dba_users
ORDER BY 1;

exec dbms_resource_manager.switch_consumer_group_for_sess (147, 1883, 'DEFAULT_CONSUMER_GROUP');

 

SWITCH_CONSUMER_GROUP_FOR_USER

Changes the resource consumer group for all sessions with a given user name

dbms_resource_manager.switch_consumer_group_for_user(
user           IN VARCHAR2,
consumer_group IN VARCHAR2);

exec dbms_resource_manager.switch_consumer_group_for_user (
'UWCLASS', 'rpt_writers_grp');

 

SWITCH_PLAN

Sets the current resource manager plan

dbms_resource_manager.switch_plan(
plan_name                     IN VARCHAR2,
sid                           IN VARCHAR2 DEFAULT '*',
allow_scheduler_plan_switches IN BOOLEAN DEFAULT TRUE);

TBD

VALIDATE_PENDING_AREA

Validates pending changes for the resource manager

dbms_resource_manager.validate_pending_area;

See Demo

 

Demos


Create Plan 1 Demonstration

conn / as sysdba

desc dba_users

SELECT username, initial_rsrc_consumer_group
FROM dba_users
ORDER BY 1;

GRANT select ON dba_rsrc_consumer_groups TO uwclass;

-- create pointy-haired boss user
CREATE USER phb
IDENTIFIED BY phb
DEFAULT TABLESPACE uwdata
TEMPORARY TABLESPACE temp
QUOTA 1M ON uwdata;

GRANT create session TO phb;

SELECT username, initial_rsrc_consumer_group
FROM dba_users
ORDER BY 1;

desc dba_rsrc_consumer_group_privs

SELECT *
FROM dba_rsrc_consumer_group_privs;

set linesize 121
col plan format a30
col cpu_method format a10
col comments format a60

desc dba_rsrc_plans

SELECT plan, cpu_method, comments, mandatory
FROM dba_rsrc_plans;

col cpu_method format a15
col consumer_group format a25
col comments format a45

desc dba_rsrc_consumer_groups

SELECT *
FROM dba_rsrc_consumer_groups;

col value format a20

desc dba_rsrc_group_mappings

SELECT *
FROM dba_rsrc_group_mappings;

exec dbms_resource_manager_privs.grant_system_privilege ('UWCLASS', 'ADMINISTER_RESOURCE_MANAGER', FALSE);

conn uwclass/uwclass

-- create a pending area
exec dbms_resource_manager.create_pending_area ;

-- create two consumer groups: Workers and Managers
exec dbms_resource_manager.create_consumer_group ('Workers', 'Those that do actual work');

exec dbms_resource_manager.create_consumer_group ('Managers', 'Those that don''t but take all the credit');

SELECT *
FROM dba_rsrc_consumer_groups;

exec dbms_resource_manager.update_consumer_group ('Managers', 'The Cartesian products of the IT world');

SELECT *
FROM dba_rsrc_consumer_groups;

-- create resource management plan
exec dbms_resource_manager.create_plan ('UW_PLAN','Demo Resource Plan', 'RATIO');

-- create plan directives
exec dbms_resource_manager.create_plan_directive (plan=>'UW_PLAN', group_or_subplan=>'Workers', comment=>'Can Grab All The CPU', cpu_p1=>100);

exec dbms_resource_manager.create_plan_directive (plan=>'UW_PLAN', group_or_subplan=>'Managers', comment=>'Give Managers Little Weight', cpu_p1=>1);

-- validate the pending area
exec dbms_resource_manager.validate_pending_area ;

exec dbms_resource_manager.create_plan_directive (plan=>'UW_PLAN', group_or_subplan=>'OTHER_GROUPS', comment=>'Testing', cpu_p2=>0);

-- validate the pending area
exec dbms_resource_manager.validate_pending_area ;

-- oops ... go back and redo correctly
-- delete plan directives
exec dbms_resource_manager.delete_plan_directive ('UW_PLAN', 'Managers');

-- recreate plan directives
exec dbms_resource_manager.create_plan_directive (plan=>'UW_PLAN', group_or_subplan=>'Managers', comment=>'Infinite Weight', cpu_p1=>0);

-- revalidate the pending area
exec dbms_resource_manager.validate_pending_area ;

-- submit the pending area
exec dbms_resource_manager.submit_pending_area ;

SELECT plan, cpu_method, comments, status, mandatory
FROM dba_rsrc_plans;

SELECT *
FROM dba_rsrc_consumer_groups;

exec dbms_resource_manager_privs.grant_switch_consumer_group ( grantee_name=>'PHB', consumer_group=>'Managers', grant_option=>FALSE);

exec dbms_resource_manager.set_initial_consumer_group (user => 'SCHEDULE', consumer_group=>'Managers');

alter system set resource_manager_plan = 'UW_PLAN';

conn schedule/schedule

/* So PHB is in a group that should have no CPU. Does this
mean PHB can't do anything?
*/


SELECT COUNT(*) FROM all_tables;

/* PHB is fine. There's plenty of free CPU so even though the group
that PHB group belongs to "looks" like it should have no CPU, that doesn't have any effect in this case.
*/


Create Plan 2 Demonstration

/*
Resource Manager is only effective (from a CPU point of view)
once CPU utilization starts to max out. Oracle takes the attitude
that if there is spare CPU capacity, there is no need to limit
usage. Only when the resource becomes scarce does Oracle restrict
access.
*/


BEGIN
-- create pending area
dbms_resource_manager.create_pending_area ;

dbms_resource_manager.create_plan (plan=>'TEST2',
comment=>'Use 10g Feature');

dbms_resource_manager.create_plan_directive (plan=>'TEST2',
group_or_subplan=>'HAVES', comment=>'Testing', cpu_p1=>100);

dbms_resource_manager.create_plan_directive (plan=>'TEST2',
group_or_subplan=>'NOTS', comment=>'Testing', cpu_p1=>0,
max_est_exec_time=>0);

/*
Prevent the have Managers from running any operation that has
an estimated execution time > 0.
*/


dbms_resource_manager.create_plan_directive (plan=>'TEST2',
group_or_subplan=>'OTHER_GROUPS', comment=>'Testing', cpu_p2=>100);

dbms_resource_manager.validate_pending_area ;

dbms_resource_manager.submit_pending_area ;

dbms_resource_manager_privs.grant_switch_consumer_group (
grantee_name=>'PHB', consumer_group=>'Managers',
grant_option=>FALSE);

dbms_resource_manager.set_initial_consumer_group
(user =>
'SCHEDULE', consumer_group=>'Managers');
END;
/

ALTER SYSTEM SET resource_manager_plan = test2;

conn schedule/schedule

SELECT COUNT(*) FROM huge_table;

ERROR at line 1:
ORA-07455: estimated execution time (56 secs), exceeds limit (0 secs)

/*
However, the problem here is that Oracle kinda rounds *down* the
estimate execution time so providing I'm not being too greedy with my resources, Oracle can be a little lenient ...
*/

SELECT COUNT(*) FROM small_table;


Drop Plan Demonstration

conn / as sysdba

-- create pending area

exec dbms_resource_manager.create_pending_area ;

-- remove admin privilege from uwclass
exec dbms_resource_manager_privs.revoke_system_privilege ( 'UWCLASS', 'ADMINISTER_RESOURCE_MANAGER');

-- delete resource plan
exec dbms_resource_manager.delete_plan_cascade ('UW_PLAN');

-- validate pending area
exec dbms_resource_manager.validate_pending_area ;

SELECT username, initial_rsrc_consumer_group
FROM dba_users
ORDER BY 1;

-- switch consumer group for user SCHEDULES
exec dbms_resource_manager.switch_consumer_group_for_user ( 'SCHEDULE', 'DEFAULT_CONSUMER_GROUP');

BEGIN
dbms_resource_manager.create_pending_area ;
dbms_resource_manager.delete_plan_cascade ('UW_PLAN');
dbms_resource_manager.validate_pending_area ;
END;
/

-- submit pending area
exec dbms_resource_manager.submit_pending_area ;

-- revoke system privilege from user
exec dbms_resource_manager_privs.revoke_system_privilege ('UWCLASS');

 

参考至:http://hi.baidu.com/edeed/blog/item/33c6b901c36b3a07728da521.html

如有错误,欢迎指正

邮箱:czmcj@163.com

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值