为什么要使用Oracle资源管理器 Oracle资源管理器简介 Oracle资源管理器(Oracle Database Resource Manager,以下简称DBRM)管理数据库资源,为不同的会话分配不同的数据库资源。资源管理器有三个部件组成:资源用户组(Resource consumer group )、资源规划(Resource plan )及资源计划指令(Resource plan directives) 。具体描述参见下表
子资源计划 资源指令除了给组分配资源,还可以为其他资源计划分配资源,被分配资源的计划成为子计划。下图是一个包含子计划的资源计划的例子。
资源管理器的默认设置 默认的三个系统资源计划:internal_plan、internal_quiesce,system_plan。其中internal_plan、internal_quiesce只是一个空壳,里面没有任何资源计划,可以通过对这两个资源计划进行修改来满足我们的需求。而system_plan只对cpu进行了限制。 默认的三个用户组 sys_group:作为sys和system用户的默认用户组。 other_group:如果当前用户不属于当前资源计划中的任何用户组,则会被纳入other_group.任何资源计划都必须包含other_group。 low_group:表示该用户对资源的请求级别是最低的。默认没有用户进入该用户组。 任何一个数据库用户都必须纳入到一个用户组中,该用户组被叫做初始用户组(initial consumer group)。如果没有显示的指定初始用户组,那么该用户的初始用户组为default_consumer_group。 Oracle资源管理 创建资源用户组
其中Scheduling Policy表示在同一用户组中的用户之间如何分配CPU Round Robin:在用户组成员之间平均分配CPU Run to Completion:运行时间最长的用户优先获得CPU 进行初始化用户组的设置
用户组与资源的映射关系 资源管理器提供了6种映射资源用户的方法。这6种映射方法分别是,指定通过某个特定操作系统用户登录到数据库所产生的session属于某个用户组;指定某个特定的客户端计算机名称登录的数据库所产生的session属于某个用户组;指定某个应用程序登录到数据库所产生的session属于某个用户组。指定通过某个服务名登录到数据库所产生的session属于某个用户组;指定通过特定模块登录到数据库所产生的session属于某个用户组;指定通过特定模块并执行特定动作登录到数据库所产生的session属于某个用户组。
用户组与资源映射的优先级 由于我们可以设置登录操作系统的用户所对应的用户组(比如oracle用户对应OS_GRP),同时设置登录数据库的用户对应的用户组(比如用户HR属于OLTP_GRP)。因此,就存在一个问题:如果两者的设置矛盾怎么办?在资源管理器中通过指定映射关系的优先级来解决这个问题
创建资源计划
Active this plan:激活该资源计划。 我们也可以在sqlplus里激活该资源计划 SQL> alter system set resource_manager_plan='MY_DAY_PLAN';
SQL> show parameter resource_manager_plan Automatic Plan Switch Enabled:表示该计划激活后可以被其他的时间窗(window)激活其他计划。 在资源计划中我们一共可以设置8个CPU使用的优先级,级别1为最高,级别8为最低。注意,在不同级别中CPU的总额不能超过100%。同时,只有在CPU使用率达到100%的时候,这里指定的不同级别所使用的CPU百分值才会生效。也就是说,即使系统完全空闲时,那么other_group的用户登录系统一样也可以使用100%的CPU。而如果当other_group用户在执行操作过程中sys_group组用户登录数据库,造成系统CPU满负荷运转。那么Oracle会优先为sys_group组分配CPU,只有当sys_group执行完毕后才会为other_group组成员分配CPU。 换句话说,LEVEL 3所能获得的全部资源就是LEVEL 2所未能使用的那部分资源。 需要强调的一点是OTHER_GROUPS这个资源用户组。任何一个资源计划必须要包括这个OTHER_GROUPS用户组,如果你的资源计划没有包括这个用户组,那么将会得到一个ORA-07453的错误,要求你必须添加此用户组。这个用户组的作用就是作为一个候选项,当一个没有匹配到任何资源用户组的SESSION连接到数据库的时候会自动的匹配到OTHER_GROUPS下面,按照OTHER_GROUPS的资源限定执行SQL。 使用DBMS_RESOURCE_MANAGER包创建的sql如下
DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE(PLAN=>'MY_DAY_PLAN',GROUP_OR_SUBPLAN => ' SYS_GROUP ',COMMENT => ' ',CPU_P1 => 100); 验证资源计划是否对CPU进行分配 思路,让BATCH_GRP和OLTP_GRP分别运行dead.sql脚本,该脚本为死循环的开方脚本,可消耗系统cpu而不是消耗系统内存。 dead.sql脚本如下 [oracle@dg1 ~]$ cat dead.sql SQL> conn hr/hr; SQL> show user; 两个会话同时执行dead.sql SQL> @/home/oracle/dead.sql
可以看到BATCH_GRP用户组消耗了1795.99秒的CPU时间,可以看到OLTP_GRP用户组消耗了7125.53秒的CPU时间,同时图饼也显示BATCH_GRP消耗20%的CPU资源,OLTP_GRP消耗80%的CPU资源。 |
|
来自: wghbeyond > 《oracle优化》