Oracle资源管理器
Oracle资源管理器简介
Oracle资源管理器(Oracle Database Resource Manager,以下简称DBRM)管理数据库资源,为不同的会话分配不同的数据库资源。DBRM管理的资源主要包括CPU时间。下面分以下几个章节介绍:
•Oracle DBRM帮你处理哪些问题
•Oracle DBRM是怎样处理这些问题的
•Oracle DBRM包含的内容
•Oracle DBRM资源分配方法
•Oracle DBRM的权限管理
Oracle DBRM帮你处理哪些问题
当数据库服务器资源由操作系统来分配时,你可能会遇到以下问题:
•过多的资源开销
当服务器进程数很多时,操作系统进程和数据库服务进程间的来回切换会导致CPU占用率或内存使用率高。
•低效的调度
操作系统调度数据库服务时占用寄存器,这样做效率很低。
•资源分配的不合理
操作系统平均分配系统资源给活动的进程(对数据库进程来说),不能判断它们的优先级高低。
•不能管理数据库特有的资源,例如:并行执行的服务数和活动的会话数。
Oracle RMDB是如何解决这些问题的
Oracle RMDB把硬件等资源的分配交给数据库服务器本身来解决以上问题。在某个数据库环境中,可能同时存在着多个用户请求数据库服务,并且他们所要完成的任务优先级不同,那么我们就应该区别对待这些会话请求。Oracle RMDB能让你根据各个会话的应用属性,将它们分组,然后为每组分配不同的数据库资源,最大化提高你的数据库应用性能。
Oracle RMDB的具体功能:
•RMDB可以在系统启动时,限制某些会话请求只分配到最少的进程资源和用户使用上限。
•为不同的用户或应用分配不同的CPU时间。在一个数据仓库应用中,ROLAP(relational online analytical processing)应用分配到的比例就应该比批处理任务高。
•限制同一组内用户对数据库操作的并行度。
•建立一个活动的会话池。会话池由一组用户活动会话组成,对某一组用户来说,同一时间活动的会话数有特别的数量上限。如果会话池满了,新的会话请求会被放入等待队列,而且你还可以设置一个时间上限,超过这个上限,等待队列会被停止。会话池限制了同一时间活动的会话请求数量,保证了活动的会话请求更快的完成任务。
•管理长时间未响应的会话或请求,这些会话或请求往往占用了很多的CPU或I/O资源。这些会话能被自动的结束掉,或者将它们换到其他低级的组去。
•优化器会估算请求的运行时间,如果超出了某个显示,RMDB会阻止它的请求。
•限制一个会话的空闲等待时间。
•根据不同的资源分配需求,配置不同的模式。你可以动态的改变这些模式,例如,从白天运行模式变到夜间运行模式,而不用重启数据库服务。你还可以通过Oracle调度器来管理模式的改变。详细内容请见: Chapter 26, "Oracle Scheduler Concepts"。
Oracle RDMB的组成元素
下表介绍了Oracle RDMB的组成元素。
元素 描述
资源使用组 根据会话的资源请求将它们分为一组。RDMB按组管理会话的资源分配,而不是按单个的会话。
资源计划 资源计划包含一系列指令,这些指令就决定了给每个组的资源分配配置。要执行资源的分配,你只需执行相应的资源计划。
资源计划指令 资源计划指令指定了资源计划和组之间的映射关系。
Oracle是通过存储过程来实现这些功能的,你可以在以下包里找到这些存储过程:DBMS_RESOURCE_MANAGER.
资源使用组
资源使用组由许多用户会话组成,这些会话有相同的资源使用请求。新创建一个会话时,RDMB会根据你的设定自动把它分配到某个组。数据库管理员还可以手动的调整某个会话所属的组。
下面三类特别的组是系统组,它们不能被修改或删除。
•SYS_GROUP
•DEFAULT_CONSUMER_GROUP
•OTHER_GROUP
资源计划指令
RDMB根据当前活动资源计划中的一系列资源计划指令为资源使用组分配资源。资源计划和指令间有着一对多的关系,资源计划中不能包含两条相同的指令。
有很多种不同分配资源的指令,例如给某个组分配一定百分比的总的CPU时间,或者限制一个组内最大活动的会话数。
资源计划
在一个数据库中同一时间只有一个资源计划起作用。一个资源计划还可以包含子资源计划。每个资源计划都必须包含给OTHER_GROUP分配支援的指令。
例子:一个简单的资源计划
下图显示的是包含OLTP(online transaction processing)应用和报表系统数据库系统的白天的资源分配计划。
它为OLTP应用分配75%的CPU时间,为报表系统分配15%的CPU时间,剩下的是为OTHER_GROUPS分配的。
子资源计划
资源指令除了给组分配资源,还可以为其他资源计划分配资源,被分配资源的计划成为子计划。下图是一个包含子计划的资源计划的例子。
DBRM管理的内容
资源分配方法指定资源分配给组或子计划的百分比。DBRM管理的资源包括以下内容:
CPU Time
Active Session Pool With Queuing
你可以设定某组的最大活动会话数,会话池满后,新的会话会被放入等待队列。
Degree Of Parallelism Limit
限制并行运行的会话数。
Automatic Consumer Group Switching
此功能类似于触发器机制,当某个会话满足设定的条件,它会自动被分配到其他组中去。
Cancelling SQL and Terminating Sessions
DBRM可以取消那些长时间运行的SQL查询或会话活动。
Excution Time Limit
DMRM可以估算某个操作的运行时间,如果超过了设定的值,数据库不会执行它。
Undo Pool
Idle Time Limit
设定一个会话的最长未响应时间。
================================================================
oracle 资源管理器
一、资源管理器(DRM)由三个要素组成:
资源消费群(resource_consumer_group)
资源计划(resource_plan)
资源计划指令(resource_plan_directive)
执行与DRM有关的操作,必须具有 administer_resource_manager 系统权限。
二、未决域(pending area)
DRM的三个要素都必须创建在未决域中,然后提交。
1、创建未决域
exec dbms_resource_manager.create_pending_area;
2、验证未决域
exec dbms_resource_manager.validate_pending_area;
验证域中的内容是否合法。
3、清除未决域
exec dbms_resource_manager.clear_pending_area;
执行此命令后,未决域以及未决域中的内容一起被删除。
4、提交未决域
exec dbms_resource_manager.submit_pending_area;
执行此命令后,相当于执行了验证、提交、清除三个命令。未决域中的内容会被存储在数据字典中,等待启用。
三、资源消费群
一个用户可以隶属于多个消费群,但一个会话同一时间只能隶属于一个消费群。
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 视图中)。
dbms_resource_manager.switch_consumer_group_for_sess(
session_id => '56',
session_serial => '106',
consumer_group => 'low_group');
基于会话所属的用户转换消费群:(将用户下的所有会话转换消费群)
dbms_resource_manager.switch_consumer_group_for_user(
user => 'user1',
consumer_group => 'low_group');
用户转换自己当前会话的消费群:(使用 dbms_session 包)
dbms_session.switch_current_consumer_group(
new_consumer_group => 'low_group');
转换自己当前会话的消费群需要特定权限:
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 => '注释');
3、修改资源计划:
dbms_resource_manager.update_plan(
plan => '计划名',
new_属性 => '新值');
4、删除资源计划:
dbms_resource_manager.delete_plan('计划名');
或
dbms_resource_manager.delete_plan_cascade('计划名');
加上cascade参数,删除计划内的要素。
五、计划指令
创建:
dbms_resource_manager.create_plan_directive(
plan => '计划名',
group_or_subplan => '消费群或子计划',
资源限制参数);
注:可以为子计划创建指令,但只能分配cpu资源。
更新:
dbms_resource_manager.update_plan_directive(
两个必需参数,
new_属性 => '新值');
删除:
dbms_resource_manager.delete_plan_directive(
两个必需参数);
=================================================================
Oracle 11g R1中资源管理器增强-性能调优
本文概述了Oracle 11g R1中资源管理器的所有增强内容,包括:
(1) I/O校准
(2) 每会话I/O限制
(3) AWR中的资源管理器统计
(4) 内置资源计划
I/O校准
DBMS_RESOURCE_MANAGER包包括一个CALIBRATE_IO存储过程,它通过执行一个I/O密集的只读工作量来评估数据库服务器的存储系统的I/O性能,这个评估操作应该在非业务高峰期间执行,以确保校准不影响生产的工作量,以及生产的工作量对校准结果的影响。
只有开启了异步I/O时才能使用该存储过程,否则会报下面的错误:
DECLARE
*
ERROR at line 1:
ORA-56708: Could not find any datafiles with asynchronous i/o capability
ORA-06512: at "SYS.DBMS_RMIN", line 453
ORA-06512: at "SYS.DBMS_RESOURCE_MANAGER", line 1153
ORA-06512: at line 6
SQL>
通过设置参数FILESYSTEMIO_OPTIONS为ASYNC或SETALL来启用异步I/O.
SQL>SHOW PARAMETER FILESYSTEMIO_OPTIONS
NAME TYPE VALUE
----------------------------------------------- -----------------------
filesystemio_options string none
SQL>
SQL>ALTER SYSTEM SET FILESYSTEMIO_OPTIONS=SETALL SCOPE=SPFILE;
SQL>SHUTDOWN IMMEDIATE;
SQL>STARTUP;
该CALIBRATE_IO存储过程接受两个参数来指定物理磁盘(默认1)和可承受的最大延迟(默认20ms)的数目,它返回每秒最大数量I/O请求,每秒最大Mb数和真实的延迟。
SET SERVEROUTPUT ON
DECLARE
l_max_iops PLS_INTEGER;
l_max_mbps PLS_INTEGER;
l_actual_latency PLS_INTEGER;
BEGIN
DBMS_RESOURCE_MANAGER.calibrate_io (
num_physical_disks => 1,
max_latency => 20,
max_iops => l_max_iops,
max_mbps => l_max_mbps,
actual_latency => l_actual_latency);
DBMS_OUTPUT.put_line ('l_max_iops = ' || l_max_iops);
DBMS_OUTPUT.put_line ('l_max_mbps = ' || l_max_mbps);
DBMS_OUTPUT.put_line ('l_actual_latency = ' || l_actual_latency);
END;
/
l_max_iops = 556
l_max_mbps = 48
l_actual_latency = 17
PL/SQL procedure successfully completed.
SQL>
同一时间只能执行一个校准操作,在RAC环境中,工作量发起的所有节点都可以执行。
[G]V$IO_CALIBRATION_STATUS视图显示了当前校准运行的状况。在运行过程中,会显示一个'IN PROGRESS' 的状态'.一旦运行完成状态切换到'READY',并且会显示校准时间。
SQL> SELECT * FROM v$io_calibration_status;
STATUS CALIBRATION_TIME
------------- -------------------------------
IN PROGRESS
SQL> SELECT * FROM v$io_calibration_status;
STATUS CALIBRATION_TIME
---------------------------------------------------------------------------
READY 28-JUL-2008 14:37:38.410
1 row selected.
SQL>
通过DBA_RSRC_IO_CALIBRATE视图可以显示校准信息。
SET LINESIZE 150
COLUMN start_time FORMAT A30
COLUMN end_time FORMAT A30
SELECT * FROM dba_rsrc_io_calibrate;
START_TIME END_TIME MAX_IOPS MAX_MBPS MAX_PMBPS LATENCY NUM_PHYSICAL_DISKS
----------------- ---------- ---------- ---------- ------------------
28-JUL-2008 14:32:33.68 28-JUL-2008 14:37:38.40 556 48 48 17 1
1 row selected.
SQL>
每会话I/O限制
在Oracle之前的版本中,资源组自动切换完全基于单个会话的时间或单个调用的时间,Oracle 11g现在可以基于I/O阀值(最大请求数或M字节)进行资源组自动切换,新的阀值通过CREATE_PLAN_DIRECTIVE存储过程执行,其中包含了大量的改变。
(1) CPU_P1-CPU_P8参数已经废弃,改为使用MGMT_P1-MGMT_P8参数。
(2) SWITCH_TIME_IN_CALL参数已被汰,换作了SWITCH_FOR_CALL参数。
(3) SWITCH_IO_MEGABYTES和SWITCH_IO_REQS参数现在已经可用,此外还有SWITCH_TIME参数,这三个参数默认为NULL,意味着无限制。
新的I/O参数意味着可以切换资源组了,可以基于消耗时间、I/O请求和I/O数量的任何组合来取消SQL或杀死会话,下面的例子显示如果消耗时间超过120秒、I/O请求数量超过5000或I/O请求超过1024M,会将当前会话从资源消耗组oltp_group切换到batch_group组。
BEGIN
DBMS_RESOURCE_MANAGER.create_plan_directive (
plan => 'my_plan',
group_or_subplan => 'oltp_group',
comment => 'OLTP Group',
mgmt_p1 => 70,
switch_group => 'batch_group',
switch_time => 120,
switch_io_reqs => 5000,
switch_io_megabytes => 1024,
switch_for_call => TRUE);
END;
/
下面的例子显示如果I/O资源消耗超过了4096M,会话将会被杀掉。
BEGIN
DBMS_RESOURCE_MANAGER.create_plan_directive (
plan => 'my_plan',
group_or_subplan => 'oltp_group',
comment => 'OLTP Group',
mgmt_p1 => 70,
switch_group => 'KILL_SESSION',
switch_io_megabytes => 4096);
END;
/
AWR中的资源管理器统计
新DBA_HIST_RSRC_PLAN和DBA_HIST_RSRC_CONSUMER_GROUP视图已加入到V$ RSRC_PLAN_HISTORY和V$RSRC_CONS_GROUP_HISTORY视图中,提供了一个历史数据的查看。
V$RSRCMGRMETRIC_HISTORY视图显示取自V$RSRCMGRMETRIC视图的一个小时的数据。
在http://download.oracle.com/docs/cd/B28359_01/server.111/b28310/dbrm011.htm#ADMIN11916有完整的资源管理视图介绍。
内置资源计划
Oracle 11g包括一个内置的MIXED_WORKLOAD_PLAN资源计划,旨在给的OLTP业务批量操作优先权,这个计划包括两个资源消耗组(INTERACTIVE_GROUP和BATCH_GROUP),如果分配给INTERACTIVE_GROUP组时超过60秒,就会自动切换到BATCH_GROUP组。
RESOURCE_MANAGER_PLAN参数用来告诉实例使用哪个资源计划。
ALTER SYSTEM SET RESOURCE_MANAGER_PLAN = MIXED_WORKLOAD_PLAN;
然后你必须将资源消耗组授权给单个用户,下面的例子显示将两个资源消耗组授权给TEST用户,并指定默认的资源消耗组是INTERACTIVE_GROUP.查询DBA_USERS视图可以获得已经设置好的默认设置。
BEGIN
-- Assign users to consumer groups
DBMS_RESOURCE_MANAGER_PRIVS.grant_switch_consumer_group(
grantee_name => 'test',
consumer_group => 'interactive_group',
grant_option => FALSE);
DBMS_RESOURCE_MANAGER_PRIVS.grant_switch_consumer_group(
grantee_name => 'test',
consumer_group => 'batch_group',
grant_option => FALSE);
DBMS_RESOURCE_MANAGER.set_initial_consumer_group('test', 'interactive_group');
END;
/
SELECT initial_rsrc_consumer_group FROM dba_users WHERE username = 'TEST';
INITIAL_RSRC_CONSUMER_GROUP
------------------------------
INTERACTIVE_GROUP
1 row selected.
SQL>
以TEST用户连接到数据库,查询v$session视图正在工作的资源消耗组。
CONN test/test
SELECT resource_consumer_group
FROM v$session
WHERE audsid = SYS_CONTEXT('USERENV', 'SESSIONID');
RESOURCE_CONSUMER_GROUP
--------------------------------
INTERACTIVE_GROUP
1 row selected.
SQL>
如果我们创建一个长时间的调用,可以看到资源消耗组的切换。
CONN test/test
SET SERVEROUTPUT ON
DECLARE
l_cg v$session.resource_consumer_group%TYPE;
BEGIN
SELECT resource_consumer_group
INTO l_cg
FROM v$session
WHERE audsid = SYS_CONTEXT('USERENV', 'SESSIONID');
DBMS_OUTPUT.put_line('Current Consumer Group: ' || l_cg);
-- Sleep to cause switch based on time.
DBMS_LOCK.sleep(65);
SELECT resource_consumer_group
INTO l_cg
FROM v$session
WHERE audsid = SYS_CONTEXT('USERENV', 'SESSIONID');
DBMS_OUTPUT.put_line('Current Consumer Group: ' || l_cg);
END;
/
Current Consumer Group: INTERACTIVE_GROUP
Current Consumer Group: BATCH_GROUP
PL/SQL procedure successfully completed.
SQL>
正如我们所期望的,调用最初分配的是INTERACTIVE_GROUP资源组,当调用超过60秒时就切换到BATCH_GROUP组了