数据库资源管理
从Oracle8i开始, oracle 提供了一个新的功能:数据库资源管理器(Database Resource Manager),它增强了数据库资源的管理能力。下面是简单的介绍:
§1.资源管理概述
资源管理器有三个部件组成:资源用户组(Resource consumer group )、资源规划(Resource plan )、资源分配方法(Resource allocation method)及资源计划目录(Resource plan directives) 。它们的功能如下:
部件 说明
资源用户组 根据数据库资源处理需求,将用户会话分成组
资源规划 指定哪些资源分配给资源用户的命令
资源分配方法 数据库资源管理器分配特殊资源时采用的方法,由资源用户组和资源规划来使用。
资源规划命令 管理员使用这些命令将资源用户组与特殊规划连接起来,并在资源用户组之间分配资源。
数据库资源管理器可以完成:
l 确保某些用户处理少量的资源,不考虑对系统的加载和用户的数量。
l 按比例将CPU时间分配给不同的用户和程序,分配有效的处理资源。
l 限制一组用户可以使用的并行度。
l 对实例进行配置,使其能使用特殊的资源分配方法。例如,DBA不用关闭数据库实例就可以动态地改变这些配置方法。
§2. 配置数据库资源管理器
要配置Oracle8i的数据库管理员,用户必须有ADMINISTER_RESOURCE_MANAGER权限。一般的ADMIN都有这样的权限。
ADMINISTER_RESOURCE_MANAGER是一个程序包,它包括有下面的过程:
过程 描述
CREATE_PLAN 命名资源规划并指定分配的方法
UPDATE_PLAN 更新资源规划的注释
DELETE_PLAN 删除资源规划及命令
DELETE_PLAN_CASCADE 删除资源规划及所有分支
CREATE_CONSUMER_GROUP 命名资源用户组并指定其分配方法
UPDATE_CONSUMER_GROUP 更新资源用户组的注释
DELETE_CONSUMER_GROUP 删除资源用户组
CREATE_PLAN_DIRECTIVE 指定一个规划中或多级规划模式命令
UPDATE_PLAN_DIRECTIVE 更新规划命令
DELETE_PLAN_DIRECTIVE 删除规划命令
CREATE_PENDING_AREA 在建立规划中挂起
VALIDATE_PENDING_AREA 确定挂起的规划
CLEAR_PENDING_AREA 清除挂起的规划
SUBMIT_PENDING_AREA 提交所有的规划模式
SET_INITIAL_CONSUMER_GROUP 为用户设置初始化用户组
SWITCH_CONSUMER_GROUP_FOR_SESS 切换指定会话的用户组
SWITCH_CONSUMER_GROUP_FOR_USES 切换属于指定用户的所有会话的用户组
作为ADMIN管理员,可能需要将管理员的权限授予其他的用户或角色。那么管理员还要具有DBMS_RESOURCE_MANAGER_PRIVS程序包的执行权。下表是该包的过程说明:
过程 描述
GRANT_SYSTEM_PRIVILEGE 授权ADMINISTER_RESOURCE_MANAGER系统权限给用户或角色
REVOKE_SYSTEM_PRIVILEGE 取消用户或角色的ADMINISTER_RESOURCE_MANAGER系统权限
GRANT_SWITCH_CONSUMER_GROUP 授权“许可”给用户、角色或PUBLIC,以便可切换到该指定的资源用户组
REVOKE_SWITCH_CONSUMER_GROUP 取消用户、角色或PUBLIC切换到指定的资源用户组的“许可”
例1:给SCOTT用户授权系统权限:
EXECUTE DBMS_RESOURCE_MANAGER_PRIVS.GRANT_SYSTEM_PRIVILEGE
(GRANTEE_NAME=>;’SCOTT’,
PRIVILEGE_NAME=>;’ADMINISTER_RESOURCE_MANAGER’,
ADMIN_OPTION=>;FALSE);
要取消SCOTT用户的权限,只能用
EXECUTE DBMS_RESOURCE_MANAGER_PRIVS.REVOKE_SYSTEM_PRIVILEGE来进行。如:
例2:取消SCOTT用户授权系统权限:
EXECUTE DBMS_RESOURCE_MANAGER_PRIVS. REVOKE _SYSTEM_PRIVILEGE
(GRANTEE_NAME=>;’SCOTT’,
PRIVILEGE_NAME=>;’ADMINISTER_RESOURCE_MANAGER’);
§3 建立和管理资源规划
一旦将系统的适当权限分配给了用户,则接下来就是用数据库资源管理器来创建数据库的对象(元素)。即创建:
l 资源用户组
l 资源规划命令
l 资源规划
这些规划建立完后,规划信息被存放在数据字典的表中。下图是资源规划和用户组的形象图:
图 28-1 一个简单的规划
上面的图是一个规划只包括一层资源用户组的情况。实际情况可以是一个规划包括其它的规划(子规划);子规划再对应到用户组。如下图:
§3.1 为创建规划模式使用挂起区域
为创建和修改规划模式,用户首先要创建挂起区域。这是一个临时的区域,在该区域里允许用户进行变化。
创建一个挂起区域:
使用下面语句创建一个挂起的区域:
EXEC DBMS_RESOURCE_MANAGER.CREATE_PENDING_AREA;
用户可以激活挂起的区域,并将所有现存的、活动规划模式加载到挂起的区域。这样可以实现更新或增加新的规划。活动规划模式是那些已由数据库管理器存储在数据字典中准备执行的模式。也就是说,用户得先激活挂起的区域才能更新规划或增加规划。规划的活动情况可以从数据库视图中查到(见后面章节)。
验证变化(validating changes):
当用户挂起区域的所有改变时,可以用下面过程来进行验证:
EXEC DBMS_RESOURCE_MANAGER.VALIDATE_PENDING_AREA;
例子:
SQL>; EXEC DBMS_RESOURCE_MANAGER.CREATE_PENDING_AREA;
PL/SQL procedure successfully completed.
SQL>; exec dbms_resource_manager.validate_pending_area;
PL/SQL procedure successfully completed.
提交变化:
在验证变化没有问题之后,可以用提交过程来将变化进行提交:
EXEC DBMS_RESOURCE_MANAGER_SUNMIT_PENDING_AREA;
提示:提交也需要验证,所以一般可以与其他的操作一起验证。
清除挂起区域:
一般用户在重新进行改变前都需要清除挂起区域。它有下面过程来实现:
EXEC DBAMS_RESOURCE_MANAGER.CLEAR_PENDING_AREA;
$3.2 创建资源规划
创建资源规划时可以指定下面的参数:
参数 描述
PLAN 规划的名称
COMMENT 任何注释
CPU_MTH CPU分配方法。EMPPHSIS是Oracle版本的缺省方法。
MAX_ACTIVE_SESS_TARGET_MTH 为以后版本预六的参数
PARALLEL_DEGREE_LIMIT_MTH 操作并行度限制。缺省为:PARALLEL_DEGREE_LIMIT_ABSOLUTE
创建一个规划:
使用CREATE_PLAN过程可以创建一个规划。如:
EXEC DBMS_RESOURCE_MANAGER.CREATE_PLAN(PLAN=>;’great_bread’,comment=>;’great plan’);
更新一个规划:
可以用UPDATE_PLAN过程来修改一个规划。如:
EXEC DBMS_RESOURCE_MANAGER.UPDATE_PLAN(
PLAN=>;’great_bread’,
NEW_COMMENT=>;’great plan for great bread’);
删除一个规划:
当不需要某个规划时,可以用DELETE_PLAN过程来删除一个规划。如:
EXEC DBMS_RESOURCE_MANAGER.DELETE_PLAN(PLAN=>;’great_bread’);
§3.3 创建用户组
资源应用组(Resource consumer group)用于定义一个应用的用户组。这里用户组非常类似于原来的Oracle角色。差别在应用组是用来管理资源;然而角色是用来管理数据库对象和系统权限。在缺省下,每个应用用户组都属于至少一个资源应用组。这些应用用户组是:
SQL>;select * from DBA_RSRC_CONSUMER_GROUPS
CONSUMER_GROUP CPU_METHOD COMMENTS STATUS MAN
---------------------- ----------- ---------------------------------------- -------- ---
OTHER_GROUPS ROUND-ROBIN consumer group for users not included in ACTIVE YES
any group in the active top-plan
DEFAULT_CONSUMER_GROUP ROUND-ROBIN consumer group for users not assigned to ACTIVE YES
any group
SYS_GROUP ROUND-ROBIN Group of system sessions ACTIVE NO
LOW_GROUP ROUND-ROBIN Group of low priority sessions ACTIVE NO
OTHER_GROUPS ROUND-ROBIN consumer group for users not included in PENDING YES
any group in the active top-plan
DEFAULT_CONSUMER_GROUP ROUND-ROBIN consumer group for users not assigned to PENDING YES
any group
SYS_GROUP ROUND-ROBIN Group of system sessions PENDING NO
LOW_GROUP ROUND-ROBIN Group of low priority sessions PENDING NO
8 rows selected.
资源组名称 描述
SYS_GROUP 这个组有很高的优先权,sys和system用户都指定到这个组。
LOW_GROUP 这个组有很低的优先权,每个用户都房屋这个组。
DEFAULT_CONSUMER_GROUP 不明确的用户都可以被指定到这个组。
OTHER_GROUP 没有被指定到规划中的所有用户组都属于这个组。
下表是创建用户组时可以指定的参数:
参数 描述
CONSUMER_GROUP 用户组名称
COMMENT 任何注释
CPU_MTH 为资源用户组分配CPU资源的方法,确定为ROUND_ROBIN,这是唯一的方法
创建一个用户组:
使用CREATE_CONSUMER_GROUP 过程实现创建一个资源用户组。如:
EXEC DBMS_RESOURCE_MANAGER.CREATE_CONSUMER_GROUP(
Consumer_group=>;’sales’
Comment=>;’retail and wholesale sales’);
更新一个用户组:
使用UPDATE_CONSUMER_GROUP 过程实现更新一个资源用户组的信息。如:
EXEC DBMS_RESOURCE_MANAGER.UPDATE_CONSUMER_GROUP(
Comment=>;’retail and wholesale sales !!’);
删除一个用户组:
使用DELETE_CONSUMER_GROUP 过程实现删除一个资源用户组的信息。
§3.4 指定资源规划指令
资源规划指令可为用户组指定资源规划和资源参数。在指定资源规划时可以用下面参数来为用户指定参数:
参数 描述
PLAN 资源规划名称
GROUP_OR_SUBPLAN 资源用户组或子规划的名称
COMMENT 任何注释
CPU_P1 指出第1级CPU的百分比
CPU_P2 指出第2级CPU的百分比
CPU_P3 指出第3级CPU的百分比
CPU_P4 指出第4级CPU的百分比
CPU_P5 指出第5级CPU的百分比
CPU_P6 指出第6级CPU的百分比
CPU_P7 指出第7级CPU的百分比
CPU_P8 指出第8级CPU的百分比
MAX_ACTIVE_SESS_TARGET_P1 为以后版本保留的参数
PARALLEL_DEGREE_LIMIT_P1 设置对任何操作系统并行度的限制
多级CPU资源分配提供了在一级规划模式中按照优先次序使用CPU的方法,第二级只得第一级分配之后的资源。注意,任何用户组都不得使用超过百分比的可用的CPU资源。
创建资源规划指令:
用CREATE_RESOURCE_PLAN 过程可以创建资源规划。看下面例子:
EXEC DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE(
PLAN=>;’great_bread’,
GROUP_OR_SUBPLAN=>;’sale’,
COMMENT=>;’Sales group’,
CPU_P1=>;60,
PARALLEL_DEGREE_LIMIT_P1=>;4 );
参照 “图 28-1 一个简单的规划” ,可以用下面语句来完成:
BEGIN
DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE(
PLAN=>;’great_bread’,
GROUP_OR_SUBPLAN=>;’market’,
COMMENT=>;’market group’,
CPU_P1=>;20 );
DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE(
PLAN=>;’ great_bread’,
GROUP_OR_SUBPLAN=>;’develop’,
COMMENT=>;’development group’,
CPU_P1=>;20 );
DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE(
PLAN=>;’ great_bread’,
GROUP_OR_SUBPLAN=>;’OTHER_GROUPS’,
COMMENT=>;’This one is required’,
CPU_P1=>;0,
CPU_P2=>;100 );
END;
更新资源规划组指令:
可以用DBMS_RESOURCE_MANAGER.UPDATE_PLAN_DIRECTIVE来更新资源规划的信息。如:
EXEC DBMS_RESOURCE_MANAGER.UPDATE_PLAN_DIRECTIVE(
PLAN=>;’great bread’,
GROUP_OR_SUBPLAN=>;’develop’, NEW_CPU_P1=15 );
删除资源规划组指令:
可以用DBMS_RESOURCE_MANAGER.DELETE_PLAN_DIRECTIVE来删除资源规划的信息。
§4管理资源用户组
用户在启用数据库资源管理器前,必须要将资源用户组分配给用户。DBMS_RESOURCE_MANAGER程序包除了提供创建、更新或删除数据库管理器所使用的资源外,还包含将资源用户组分配给用户的过程及提供临时将用户会话切换给其它资源用户的过程。
§4.1 指定初始资源用户组
一个初始用户组就是该用户最初创建会话所归属的用户组。如果没有为用户指定初始用户组,则该 用户的初始用户组为DEFAULT_CONSUMER_GROUP用户组。
在将用户组指定给用户前,先要切换权限给该用户。命令如下:
EXEC DBMS_RESOURCE_MANAGER_PRIVS.GRANT_SWTCH_CONSUMER_GROUP(
‘scott’, ‘sales’,TRUE);
EXEC DBMS_RESOURCE_MANAGER_INITIAL_CONSUMER_GROUP(‘scott’,’sales’);
§4.2 改变资源用户组
有两种改变的操作:
切换会话:
可以用SWITCH_CONSUMER_GROUP_FOR_SESS过程来将某个会话立即切换到指定的资源用户组上,以实现提高或降低优先权。
例:将sid=7,serial#=1234 的会话切换到high_prioity用户组上:
EXEC DBMS_RESOURCE_MANAGER.SWITCH_CONSUMER_GROUP_FOR_SESS(‘7’,’1234’,
‘High_priority’ ) ;
为用户切换会话:
同样可以用SWITCH_CONSUMER_GROUP_FOR_SESS过程来将某个用户的会话切换到指定的资源用户组上。如:
例:
EXEC DBMS_RESOURCE_MANAGER.SWITCH_CONSUMER_GROUP_FOR_SESS(
‘scott’,’low_group’);
§4.3 授予“切换权限”
Oracle的DBMS_RESOURCE_MANAGER_PRIVS过程包将切换权限授予一个用户、角色或PUBLIC或者从用户、角色、PUBLIC中撤消权限。
授予切换权限:
EXEC DBMS_RESOURCE_MANAGER_PRIVS.GRANT_SWITCH_CONSUMER_GROUP(
‘scott’,’bug_batch_group’,TRUE );
取消切换权限:
EXEC DBMS_RESOURCE_MANAGER_PRIVS.REVOKE_SWITCH_CONSUMER_GROUP(
‘scott’,’bug_batch_group’ );
除此之外,也可以用DBMS_SESSION程序包来完成切换用户组。另见PL/SQL包参考。
§5启动数据库资源管理器
通过设置RESOURCE_MANAGER_PLAN参数来实现启动数据库资源管理器的使用。如:
ALTER SYSTEM SET RESOURCE_MANAGER_PLAN=mydb_plan;
§6数据库资源管理器视图
与数据库资源管理器有关的数据字典有:
视图 描述
DBA_RSRC_CONSUMER_GROUP_PRIVS 所有资源用户组和用户及授权给它们的角色
DBA_RSRC_CONSUMER_GROUPS 数据库中所有资源用户组
DBA_RSRC_MANAGER_SYSTEM_PRIVS 所有授予数据库资源权限的用户和角色
DBA_RSRC_PLAN_DIRECTIVES 数据库中所有资源规划指令
DBA_RSRC_PLANS 数据库中所有资源规划信息
DBA_USERS 数据库中所有用户信息
USER_RSRC_CONSUMER_GROUP_PRIVS 授权给用户的资源用户组
USER_RSRC_MANAGER_SYSTEM_PRIVS 授予数据库资源权限的用户和角色
USER_USERS 当前用户的有关信息
V$PARALLEL_DEGREE_LIMIT_MTH 有效的并行度限制
V$RSRC_CONSUMER_GROUP 调整活动资源用户组的有关信息
V$RSRC_CONSUMER_GROUP_CPU_MTH 所有有效的CPU资源的分配方法
V$RSRC_PLAN 当前活动的资源规划的名称
V$RSRC_PLAN_CPU_MTH 资源规划的所有有效CPU资源的分配方法
V$SESSION 当前每个会话的信息
§7数据库资源管理器例子
下面例子参考图28-2的结构进行说明,详细见a76956:Oracle8i Administrator’s Guide中的 25 Database Resource Manager 。
BEGIN
DBMS_RESOURCE_MANAGER.CREATE_PENDING_AREA();
DBMS_RESOURCE_MANAGER.CREATE_PLAN(PLAN =>'bugdb_plan',COMMENT => 'Resource plan/method for bug users sessions');
DBMS_RESOURCE_MANAGER.CREATE_PLAN(PLAN =>'maildb_plan',COMMENT => 'Resource plan/method for mail users sessions');
DBMS_RESOURCE_MANAGER.CREATE_PLAN(PLAN =>'mydb_plan',COMMENT => 'Resource plan/method for bug and mail users sessions');
DBMS_RESOURCE_MANAGER.CREATE_CONSUMER_GROUP(CONSUMER_GROUP => 'Bug_Online_group',COMMENT => 'Resource consumer group/method for online bug users sessions');
DBMS_RESOURCE_MANAGER.CREATE_CONSUMER_GROUP(CONSUMER_GROUP => 'Bug_Batch_group',COMMENT => 'Resource consumer group/method for bug users sessions who run batch jobs');
DBMS_RESOURCE_MANAGER.CREATE_CONSUMER_GROUP(CONSUMER_GROUP => 'Bug_Maintenance_group',COMMENT => 'Resource consumer group/method for users sessions who maintainthe bug db');
DBMS_RESOURCE_MANAGER.CREATE_CONSUMER_GROUP(CONSUMER_GROUP => 'Mail_users_group',COMMENT => 'Resource consumer group/method for mail users sessions');
DBMS_RESOURCE_MANAGER.CREATE_CONSUMER_GROUP(CONSUMER_GROUP => 'Mail_Postman_group',COMMENT => 'Resource consumer group/method for mail postman');
DBMS_RESOURCE_MANAGER.CREATE_CONSUMER_GROUP(CONSUMER_GROUP => 'Mail_Maintenance_group',COMMENT => 'Resource consumer group/method for users sessions who maintain the maildb');
DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE(PLAN => 'bugdb_plan', GROUP_OR_SUBPLAN =>'Bug_Online_group',COMMENT => 'online bug users sessions at level 1', CPU_P1 => 80, CPU_P2=> 0,PARALLEL_DEGREE_LIMIT_P1 =>8);
DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE(PLAN => 'bugdb_plan', GROUP_OR_SUBPLAN =>'Bug_Batch_group',COMMENT => 'batch bug users sessions at level 1', CPU_P1 => 20, CPU_P2 => 0,PARALLEL_DEGREE_LIMIT_P1 => 2);
DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE(PLAN => 'bugdb_plan', GROUP_OR_SUBPLAN =>'Bug_Maintenance_group',COMMENT => 'bug maintenance users sessions at level 2', CPU_P1 => 0, CPU_P2 => 100,PARALLEL_DEGREE_LIMIT_P1 => 3);
DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE(PLAN => 'bugdb_plan', GROUP_OR_SUBPLAN =>'OTHER_GROUPS',COMMENT => 'all other users sessions at level 3', CPU_P1 => 0, CPU_P2 => 0, CPU_P3 =>100);
DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE(PLAN => 'maildb_plan', GROUP_OR_SUBPLAN =>'Mail_Postman_group',COMMENT => 'mail postman at level 1', CPU_P1 => 40, CPU_P2 => 0,PARALLEL_DEGREE_LIMIT_P1 => 4);
DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE(PLAN => 'maildb_plan', GROUP_OR_SUBPLAN =>'Mail_users_group',COMMENT => 'mail users sessions at level 2', CPU_P1 => 0, CPU_P2 => 80,PARALLEL_DEGREE_LIMIT_P1 => 4);
DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE(PLAN => 'maildb_plan', GROUP_OR_SUBPLAN =>'Mail_Maintenance_group',COMMENT => 'mail maintenance users sessions at level 2', CPU_P1 => 0, CPU_P2 => 20,PARALLEL_DEGREE_LIMIT_P1 => 2);
DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE(PLAN => 'maildb_plan', GROUP_OR_SUBPLAN =>'OTHER_GROUPS',COMMENT => 'all other users sessions at level 3', CPU_P1 => 0, CPU_P2 => 0, CPU_P3 =>100);
DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE(PLAN => 'mydb_plan', GROUP_OR_SUBPLAN =>'maildb_plan',COMMENT=> 'all mail users sessions at level 1', CPU_P1 => 30);
DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE(PLAN => 'mydb_plan', GROUP_OR_SUBPLAN =>'bugdb_plan',COMMENT => 'all bug users sessions at level 1', CPU_P1 => 70);
DBMS_RESOURCE_MANAGER.VALIDATE_PENDING_AREA();DBMS_RESOURCE_MANAGER.SUBMIT_PENDING_AREA();end;
这里的VALIDATE_PENDING_AREA可以省去,因为SUBMIT_PENDING_AREA已经隐含地执行。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/27038344/viewspace-747861/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/27038344/viewspace-747861/