OCA/OCP Oracle 数据库12c考试指南读书笔记:第20章: The Resource Manager

为保证SLA,用户要区别对待,牺牲一批人以保障一些人。

配置数据库资源管理

Oracle的资源管理与大机类似,可以保证无论负载如何,用户都可以获得约定SLA的服务。
资源管理的配置是简单的,但测试其效果和监控是难的。

资源管理的必要性

操作系统采用轮转时间片的方式分配资源,因此所有进程都是平等的,没有区别。因此Oracle的资源控制必需建立在操作系统之上。
只有在资源紧张时(有争用)时,资源管理才有必要。
本章使用的例子为一电话销售公司,有200个座席人员和10几个后台管理人员。任务类型分别为OLTP和DSS。

资源管理架构

Consumer Groups (消费组)

消费组是具有类似资源需求的一组用户。一个用户可以属于多个消费组,可以在多个消费组间切换,但任意时刻只能有一个消费组处于激活状态。
例如座席人员可属于OLTP组,后台管理人员可属于DSS组。
数据库会默认创建一些消费组:

  1. SYS_GROUP,系统管理组,SYS和SYSTEM用户属于此组
  2. DEFAULT_CONSUMER_GROUP,除SYS和SYSTEM外,所有用户的默认组
  3. OTHER_GROUPS,所有用户都属于此组
  4. 示范(Demonstration )组,用于区别不同工作负载,包括BATCH_GROUP, DSS_CRITICAL_GROUP, DSS_GROUP, ETL_GROUP, INTERACTIVE_GROUP和 LOW_GROUP。
  5. ORA$AUTOTASK,运行自动任务的会话属于此组。
  6. ORA$APPQOS_0ORA$APPQOS_7,在启用QoS后使用,只适用于集群系统

相关视图:DBA_RSRC_CONSUMER_GROUPS 和DBA_USERS。
示例:

SQL> select consumer_group, comments from dba_rsrc_consumer_groups;

CONSUMER_GROUP                   COMMENTS
-------------------------------- --------------------------------------------------------------------------------------------------------------
BATCH_GROUP                      Consumer group for batch operations
ORA$AUTOTASK                     Consumer group for autotask operations
INTERACTIVE_GROUP                Consumer group for interactive, OLTP operations
OTHER_GROUPS                     Consumer group for users not included in any consumer group with a directive in the currently active plan
DEFAULT_CONSUMER_GROUP           Consumer group for users not assigned to any consumer group
SYS_GROUP                        Consumer group for system administrators
LOW_GROUP                        Consumer group for low-priority sessions
ETL_GROUP                        Consumer group for ETL
DSS_GROUP                        Consumer group for DSS queries
DSS_CRITICAL_GROUP               Consumer group for critical DSS queries
ORA$APPQOS_0                     Consumer group for Application QOS
ORA$APPQOS_1                     Consumer group for Application QOS
ORA$APPQOS_2                     Consumer group for Application QOS
ORA$APPQOS_3                     Consumer group for Application QOS
ORA$APPQOS_4                     Consumer group for Application QOS
ORA$APPQOS_5                     Consumer group for Application QOS
ORA$APPQOS_6                     Consumer group for Application QOS
ORA$APPQOS_7                     Consumer group for Application QOS

18 rows selected.

SQL> select username, initial_rsrc_consumer_group from dba_users order by 2 desc, 1;

USERNAME                 INITIAL_RSRC_CONSUMER_GROUP
------------------------ ----------------------------------------------------------------
SYS                      SYS_GROUP
SYSTEM                   SYS_GROUP
ANONYMOUS                DEFAULT_CONSUMER_GROUP
APPQOSSYS                DEFAULT_CONSUMER_GROUP
AUDSYS                   DEFAULT_CONSUMER_GROUP
BI                       DEFAULT_CONSUMER_GROUP
CTXSYS                   DEFAULT_CONSUMER_GROUP
DBSFWUSER                DEFAULT_CONSUMER_GROUP
DBSNMP                   DEFAULT_CONSUMER_GROUP
DIP                      DEFAULT_CONSUMER_GROUP
DVF                      DEFAULT_CONSUMER_GROUP
DVSYS                    DEFAULT_CONSUMER_GROUP
GGSYS                    DEFAULT_CONSUMER_GROUP
GSMADMIN_INTERNAL        DEFAULT_CONSUMER_GROUP
GSMCATUSER               DEFAULT_CONSUMER_GROUP
GSMUSER                  DEFAULT_CONSUMER_GROUP
HR                       DEFAULT_CONSUMER_GROUP
IX                       DEFAULT_CONSUMER_GROUP
LBACSYS                  DEFAULT_CONSUMER_GROUP
MDDATA                   DEFAULT_CONSUMER_GROUP
MDSYS                    DEFAULT_CONSUMER_GROUP
OE                       DEFAULT_CONSUMER_GROUP
OJVMSYS                  DEFAULT_CONSUMER_GROUP
OLAPSYS                  DEFAULT_CONSUMER_GROUP
ORACLE_OCM               DEFAULT_CONSUMER_GROUP
ORDDATA                  DEFAULT_CONSUMER_GROUP
ORDPLUGINS               DEFAULT_CONSUMER_GROUP
ORDSYS                   DEFAULT_CONSUMER_GROUP
OUTLN                    DEFAULT_CONSUMER_GROUP
PDBADMIN                 DEFAULT_CONSUMER_GROUP
PM                       DEFAULT_CONSUMER_GROUP
REMOTE_SCHEDULER_AGENT   DEFAULT_CONSUMER_GROUP
SH                       DEFAULT_CONSUMER_GROUP
SI_INFORMTN_SCHEMA       DEFAULT_CONSUMER_GROUP
SYS$UMF                  DEFAULT_CONSUMER_GROUP
SYSBACKUP                DEFAULT_CONSUMER_GROUP
SYSDG                    DEFAULT_CONSUMER_GROUP
SYSKM                    DEFAULT_CONSUMER_GROUP
SYSRAC                   DEFAULT_CONSUMER_GROUP
WMSYS                    DEFAULT_CONSUMER_GROUP
XDB                      DEFAULT_CONSUMER_GROUP
XS$NULL                  DEFAULT_CONSUMER_GROUP

42 rows selected.

Resource Manager Plans(资源管理计划)

资源管理计划最常用于分配CPU资源。任意时刻只能有一个资源管理计划激活,资源管理计划控制整个实例,可管理的资源包括:

  • 消费组中所有会话的CPU使用
  • 组中会话的并行度
  • 组中最大活动会话数
  • 组中的UNODO空间限制
  • 终止不活动会话的时间
  • 会话中调用的最长执行时间,并可触发切换到另一消费组

相关信息可查询DBA_RSRC_PLANS 。
例如可以分为3个计划,日间计划(OLTP),夜间计划(DSS)和月末计划(BATCH)。
计划包含多个directive(指示),指示以特定的优先级将资源分配给消费组。
系统自带的计划包括:

  • INTERNAL_PLAN,内部使用,禁止资源管理
  • DEFAULT_PLAN,包含3个指示,第一个指示按90:9:1的比例将CPU资源分配给SYS_GROUP、OTHER_GROUPS和ORA$AUTOTASK
  • DEFAULT_MAINTENANCE_PLAN,用于维护任务,留25%给其它用户
  • INTERNAL_QUIESCE
  • MIXED_WORKLOAD_PLAN
  • ORA$AUTOTASK_PLAN
  • ORA$ROOT_PLAN,只与多租户容器数据库有关
  • ORA$QOS_PLAN,QoS系统使用

示例,P1, P2和P3表示Priority:

SQL> select group_or_subplan, cpu_p1, cpu_p2, cpu_p3 from dba_rsrc_plan_directives where plan='DEFAULT_PLAN';

GROUP_OR_SUBPLAN         CPU_P1     CPU_P2     CPU_P3
-------------------- ---------- ---------- ----------
SYS_GROUP                    90          0          0
OTHER_GROUPS                  9          0          0
ORA$AUTOTASK                  1          0          0
SQL> select group_or_subplan, cpu_p1, cpu_p2, cpu_p3 from dba_rsrc_plan_directives where plan='DEFAULT_MAINTENANCE_PLAN';

GROUP_OR_SUBPLAN         CPU_P1     CPU_P2     CPU_P3
-------------------- ---------- ---------- ----------
SYS_GROUP                    75          0          0
OTHER_GROUPS                 20          0          0
ORA$AUTOTASK                  5          0          0

SQL> select group_or_subplan, cpu_p1, cpu_p2, cpu_p3 from dba_rsrc_plan_directives where plan='MIXED_WORKLOAD_PLAN';

GROUP_OR_SUBPLAN         CPU_P1     CPU_P2     CPU_P3
-------------------- ---------- ---------- ----------
SYS_GROUP                    75          0          0
OTHER_GROUPS                  2          0          0
INTERACTIVE_GROUP            20          0          0
BATCH_GROUP                   2          0          0
ORA$AUTOTASK                  1          0          0

资源管理采用trickle-down(滴漏)方式,某优先级中未用的资源可供下一级使用,同一级内未用的资源可供其它消费组使用。

资源管理配置

PL/SQL API,包括两个包,DBMS_RESOURCE_MANAGER_PRIVS 和 DBMS_RESOURCE_MANAGER。前者将用户放到消费组。后者用于创建消费组,资源计划和指示。资源计划只有验证有效后才会存到数据字典中。
连接时,会话将默认的消费组赋予用户,如果用户有多个消费组,可自动或手工在之间切换(DBMS_SESSION.SWITCH_CURRENT_CONSUMER_GROUP)。有管理权限的用户还可以切换其它人,利用DBMS_RESOURCE_MANAGER包中的SWITCH_CONSUMER_GROUP_FOR_USER或SWITCH_CONSUMER_GROUP_FOR_SESS。

访问和创建资源计划

计划中包括多个指示来将资源在多个消费组间划分,可通过以下的原则控制:

  • CPU
  • 活动会话数量
  • 并行度
  • 操作执行时间
  • 空闲时间
  • UNDO数据容量

CPU百分比(percentage)

对于本例日间计划可以这么设计:

优先级 Group CPU%
1 SYS_GROUP 100
2 OLTP 100
3 DSS 50
3 BATCH 50
4 OTHER_GROUPS 100

总共有8个优先级,这里用到4个。每一级的CPU总和不应超过100,否则无法通过验证。小于100可以,但不常见。
SYS_GROUP优先级应总设为最高,以防有管理任务。

夜间计划设计如下:

优先级 Group CPU%
1 SYS_GROUP 100
2 OLTP 50
2 DSS 25
2 BATCH 25
3 OTHER_GROUPS 100

月末计划设计如下:

优先级 Group CPU%
1 SYS_GROUP 100
2 BATCH 100
3 DSS 50
3 OLTP 50
4 OTHER_GROUPS 100

CPU使用未达到100时,这些计划是不生效的。
每一个计划都必须定义OTHERS_GROUP。
计划可以有子计划,例如可以为一级单位建立计划,客户可以为二级单位制定子计划。
示例:

-- create user defined comsumer groups
exec dbms_resource_manager.create_consumer_group( consumer_group => 'OLTP');
exec dbms_resource_manager.create_consumer_group( consumer_group => 'DSS');
exec dbms_resource_manager.create_consumer_group( consumer_group => 'BATCH');

-- create pending area
exec dbms_resource_manager.create_pending_area;

-- create plan
exec dbms_resource_manager.create_plan(plan=>'DAY', comment=>'plan for normal working hours');

-- create plan directives
exec dbms_resource_manager.create_plan_directive(plan=>'DAY', group_or_subplan=>'SYS_GROUP', mgmt_p1=>100, comment=>'give sys_group users top priority');
exec dbms_resource_manager.create_plan_directive(plan=>'DAY', group_or_subplan=>'OLTP', mgmt_p2=>100, comment=>'give oltp users next priority');
exec dbms_resource_manager.create_plan_directive(plan=>'DAY', group_or_subplan=>'DSS', mgmt_p3=>50, comment=>'dss user have half at level3');
exec dbms_resource_manager.create_plan_directive(plan=>'DAY', group_or_subplan=>'BATCH', mgmt_p3=>50, comment=>'dss user have half at level3');
exec dbms_resource_manager.create_plan_directive(plan=>'DAY', group_or_subplan=>'OTHER_GROUPS', mgmt_p4=>100, comment=>'dss user have half at level3');

-- validate and submit plan
exec dbms_resource_manager.validate_pending_area;
exec dbms_resource_manager.submit_pending_area;

CPU比率(ratio)

CPU百分比指定了绝对值,如果要新增一个消费组,则必需全部调整。而使用比率就方便很多。系统会自动根据比率计算出百分比。

活动会话池

限制了消费组中并发执行语句的数量,与登录用户数无关。
活动会话是指正在执行操作或存在未提交事务的会话。
如果不能执行,会话会进入队列并永久等待,也可以设置等待超时。
例如:

execute dbms_resource_manager.update_plan_directive(plan=>'DAY', group_or_subplan=>'DSS', new_active_sess_pool_pl=>3, new_queueing_p1=>60);

相关视图,V$SESSION.CURRENT_QUEUE_DURATIONV$RSRC_CONSUMER_GROUP
ALTER SYSTEM QUIESCE RESTRICTED会将除SYS_GROUP外的所有活动会话池设为0,已有的会话会继续,除SYS_GROUP组中成员外新的会话不允许,相当于只有管理员可进行操作。通过ALTER SYSTEM UNQUIESCE.进行解除。
这对于一些需要短暂排它锁的DDL操作非常有用,如重建索引。

限制并行度

无论是SELECT还是DML,并行操作可提升性能,但会影响其它用户。因此我们可以限制每一会话的最大并行进程数或禁止并行。例如:

execute dbms_resource_manager.update_plan_directive(plan=>'DAY', group_or_subplan=>'DSS', new_parallel_degree_limit_pl=>4, new_queueing_p1=>60);

执行时间

当执行时间超过阈值时切换到更低优先级的消费组。

  • SWITCH_GROUP 目标组
  • SWITCH_TIME 时间阈值
    • SWITCH_ELAPSED_TIME 评估时间阈值,如评估启用,则评估时间超过阈值时,语句直接切换
    • SWITCH_ESTIMATE 是否启用评估
    • MAX_EST_EXEC_TIME 最大评估时间,如超过,则会被阻塞

空闲时间

每一个会话在服务器端都有一个进程和PGA,因此即使会话不活动,也会浪费资源。也会参与时间片轮转,也会进行上下文切换(context switch)。
根据两个标准,资源管理可以关闭会话:

  1. 空闲时间(未活动时间)- MAX_IDLE_TIME
  2. 持有行或表锁超过一定时间 - MAX_IDLE_BLOCKER_TIME

注意,空闲时间是指服务器端而非客户端,例如用户下载数据在客户端进行加工,若设置不当,会发现提交时服务器端会话已经关闭了。

限制Undo数据的产生

每一个事务都会产生undo,所有的undo数据会写到undo表空间,未提交的事务undo不允许被覆盖。因此,大事务或长事务可能将undo填满,导致其它事务无法执行。开发者可以将大事务拆成小事务。
对于DBA而言,可以利用资源管理,进行undo表空间分区,以对应不同的消费组。
V$TRANSACTION.USED_UBLK显示正在进行事务所需的undo。
当消费组中所有会话消耗的undo达到阈值时,这些会话不允许产生新的undo,因此会挂起知道有事务提交。这时,其它消费组的会话不受影响。

示例:

-- 创建4个用户
grant connect to clerk identified by clerk;
grant connect to acct identified by acct;
grant connect to batch identified by batch;
grant connect to mgr identified by mgr;

-- create consumer group
exec dbms_resource_manager.create_pending_area;
exec dbms_resource_manager.create_consumer_group( consumer_group => 'OLTP');
exec dbms_resource_manager.create_consumer_group( consumer_group => 'DSS');
exec dbms_resource_manager.submit_pending_area;

-- 将用户赋予消费组并设置初始消费组
exec dbms_resource_manager_privs.grant_switch_consumer_group('CLERK', 'OLTP', false);
exec dbms_resource_manager_privs.grant_switch_consumer_group('MGR', 'OLTP', false);exec dbms_resource_manager_privs.grant_switch_consumer_group('ACCT', 'DSS', false);
exec dbms_resource_manager_privs.grant_switch_consumer_group('BATCH', 'DSS', false);

exec dbms_resource_manager.set_initial_consumer_group('CLERK', 'OLTP');
exec dbms_resource_manager.set_initial_consumer_group('ACCT', 'DSS');
exec dbms_resource_manager.set_initial_consumer_group('BATCH', 'DSS');
exec dbms_resource_manager.set_initial_consumer_group('MGR', 'OLTP');

-- 创建plan
exec dbms_resource_manager.create_simple_plan(simple_plan=>'my_plan', consumer_group1=>'OLTP', group1_percent=>80, consumer_group2=>'DSS', group2_percent=>20);

-- 激活plan
alter system set resource_manager_plan=my_plan scope=memory;

监控资源管理

资源管理配置相关视图:

  • DBA_RSRC_PLANS 资源计划与状态
  • DBA_RSRC_PLAN_DIRECTIVES 指示
  • DBA_RSRC_CONSUMER_GROUPS 消费组

状态:

  • V$SESSION 会话当前激活的消费组
  • V$RSRC_PLAN 当前的计划
  • V$RSRC_CONSUMER_GROUP 消费组统计

资源管理在系统不忙时无任何左右,当一个会话被资源管理影响时,在V$SESSION.EVENT列会显示等待时间resmgr:cpu

示例,测试和监控资源管理:

-- 会话1,确认当前plan
SQL> select name from V$RSRC_PLAN;

NAME
--------------------------------
MY_PLAN

SQL> show parameter RESOURCE_MANAGER_PLAN

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
resource_manager_plan                string      MY_PLAN

-- 会话1
alter system set cpu_count=1 scope=memory;
-- 会话2
sqlplus acct/acct@orclpdb1
-- 会话3
sqlplus clerk/clerk@orclpdb1
-- 会话1
SQL> select username, resource_consumer_group from v$session where username is not null;

USERNAME   RESOURCE_CONSUMER_GROUP
---------- --------------------------------
SYS        _ORACLE_BACKGROUND_GROUP_
CLERK      OLTP
ACCT       DSS
SYSTEM     OTHER_GROUPS
SQL> select name, active_sessions, consumed_cpu_time from v$rsrc_consumer_group;

NAME                             ACTIVE_SESSIONS CONSUMED_CPU_TIME
-------------------------------- --------------- -----------------
DSS                                            0                 0
OLTP                                           0                 0
OTHER_GROUPS                                   1               211

-- 会话2 和 会话3 同时执行
select count(*) from all_objects, all_objects;

-- 会话1 结果应显示OLTP消耗CPU是DSS的4倍(我的结果不是)
select name, active_sessions, consumed_cpu_time from v$rsrc_consumer_group;SQL> select name, active_sessions, consumed_cpu_time from v$rsrc_consumer_group;

NAME                             ACTIVE_SESSIONS CONSUMED_CPU_TIME
-------------------------------- --------------- -----------------
DSS                                            1             71842
OLTP                                           1             71719
OTHER_GROUPS                                   1                49

-- 会话1
SQL> select s.username, e.event, e.time_waited from v$session_event e join v$session s using (sid) where e.event like 'resmgr:cpu%';

USERNAME   EVENT                          TIME_WAITED
---------- ------------------------------ -----------
           resmgr:cpu quantum                      13
           resmgr:cpu quantum                      53
           resmgr:cpu quantum                      58
CLERK      resmgr:cpu quantum                    7497
           resmgr:cpu quantum                      31
           resmgr:cpu quantum                       0
           resmgr:cpu quantum                      55
           resmgr:cpu quantum                      57
ACCT       resmgr:cpu quantum                    7626
           resmgr:cpu quantum                     372
SYSTEM     resmgr:cpu quantum                    2226
           resmgr:cpu quantum                       5
           resmgr:cpu quantum                       2

13 rows selected.

参考

  1. https://oracle-base.com/articles/8i/resource-manager-8i
发布了342 篇原创文章 · 获赞 42 · 访问量 54万+

猜你喜欢

转载自blog.csdn.net/stevensxiao/article/details/102944305