Oracle 资源管理器(Resource Manager)

Oracle 资源管理器(Resource Manager)

适用版本:Oracle Database 8i / 9i / 10g / 11g / 12c / 19c / 23ai 文档版本:v1.0 / 2026-07


1. 概述

Resource Manager 控制资源分配[1]:

功能

  • CPU 分配
  • 并行度限制
  • 活动会话限制
  • 执行时间限制
  • undo 空间限制

2. 核心概念

2.1 Resource Plan

  • 资源计划
  • 顶层计划

2.2 Consumer Group

  • 消费者组
  • 用户/会话分组

2.3 Plan Directive

  • 计划指令
  • 资源分配规则

2.4 Pending Area

  • 编辑区
  • 提交前缓冲

3. 创建

3.1 创建 Pending Area

EXEC DBMS_RESOURCE_MANAGER.CREATE_PENDING_AREA;

3.2 创建 Consumer Group

BEGIN
  DBMS_RESOURCE_MANAGER.CREATE_CONSUMER_GROUP(
    consumer_group => 'OLTP_GROUP',
    comment => 'OLTP 应用组'
  );
  
  DBMS_RESOURCE_MANAGER.CREATE_CONSUMER_GROUP(
    consumer_group => 'BATCH_GROUP',
    comment => '批量任务组'
  );
  
  DBMS_RESOURCE_MANAGER.CREATE_CONSUMER_GROUP(
    consumer_group => 'ADHOC_GROUP',
    comment => '临时查询组'
  );
END;
/

3.3 创建 Plan

BEGIN
  DBMS_RESOURCE_MANAGER.CREATE_PLAN(
    plan => 'my_plan',
    comment => '我的资源计划'
  );
END;
/

3.4 创建 Plan Directive

BEGIN
  DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE(
    plan => 'my_plan',
    group_or_subplan => 'OLTP_GROUP',
    cpu_p1 => 70,
    parallel_degree_limit_p1 => 4,
    active_sess_pool_p1 => 20,
    comment => 'OLTP 优先'
  );
  
  DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE(
    plan => 'my_plan',
    group_or_subplan => 'BATCH_GROUP',
    cpu_p1 => 20,
    parallel_degree_limit_p1 => 8,
    active_sess_pool_p1 => 5,
    max_exec_time => 3600,
    comment => '批量限制'
  );
  
  DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE(
    plan => 'my_plan',
    group_or_subplan => 'ADHOC_GROUP',
    cpu_p1 => 10,
    parallel_degree_limit_p1 => 1,
    active_sess_pool_p1 => 3,
    comment => '临时查询限制'
  );
  
  -- OTHER_GROUPS 必需
  DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE(
    plan => 'my_plan',
    group_or_subplan => 'OTHER_GROUPS',
    cpu_p1 => 0,
    comment => '其他'
  );
END;
/

3.5 提交

EXEC DBMS_RESOURCE_MANAGER.SUBMIT_PENDING_AREA;

4. 用户/会话映射

4.1 用户映射

BEGIN
  DBMS_RESOURCE_MANAGER_PRIVS.GRANT_SWITCH_CONSUMER_GROUP(
    grantee_name => 'SCOTT',
    consumer_group => 'OLTP_GROUP',
    grant_option => FALSE
  );
END;
/

4.2 设置初始组

BEGIN
  DBMS_RESOURCE_MANAGER.SET_INITIAL_CONSUMER_GROUP(
    user => 'SCOTT',
    consumer_group => 'OLTP_GROUP'
  );
END;
/

4.3 会话切换

EXEC DBMS_SESSION.SWITCH_CURRENT_CONSUMER_GROUP('BATCH_GROUP', FALSE);

4.4 自动映射规则

BEGIN
  DBMS_RESOURCE_MANAGER.SET_CONSUMER_GROUP_MAPPING(
    attribute => DBMS_RESOURCE_MANAGER.CLIENT_MACHINE,
    value => 'batch_server',
    consumer_group => 'BATCH_GROUP'
  );
  
  DBMS_RESOURCE_MANAGER.SET_CONSUMER_GROUP_MAPPING(
    attribute => DBMS_RESOURCE_MANAGER.CLIENT_PROGRAM,
    value => 'sqlplus%',
    consumer_group => 'ADHOC_GROUP'
  );
  
  DBMS_RESOURCE_MANAGER.SET_CONSUMER_GROUP_MAPPING(
    attribute => DBMS_RESOURCE_MANAGER.SERVICE_NAME,
    value => 'oltp_svc',
    consumer_group => 'OLTP_GROUP'
  );
END;
/

5. 启用计划

5.1 系统级

ALTER SYSTEM SET resource_manager_plan = 'my_plan' SCOPE=BOTH;

5.2 PDB 级(12c+)

ALTER PLUGGABLE DATABASE hrpdb SET resource_manager_plan = 'hrpdb_plan';

6. 资源限制

6.1 CPU

-- cpu_p1, cpu_p2, ... cpu_p8
-- 不同优先级

6.2 并行度

parallel_degree_limit_p1 => 4

6.3 活动会话池

active_sess_pool_p1 => 10
queueing_p1 => 600  -- 排队等待秒数

6.4 执行时间

max_exec_time => 3600  -- 秒

6.5 Undo

undo_pool => 100  -- MB

6.6 闲置时间

max_idle_time => 600  -- 秒
max_idle_blocker_time => 60

7. 多级计划

-- 顶层计划
CREATE_PLAN('top_plan');

-- 子计划
CREATE_PLAN('oltp_subplan');

-- 顶层指令指向子计划
CREATE_PLAN_DIRECTIVE(
  plan => 'top_plan',
  group_or_subplan => 'oltp_subplan',
  cpu_p1 => 70
);

-- 子计划指令
CREATE_PLAN_DIRECTIVE(
  plan => 'oltp_subplan',
  group_or_subplan => 'OLTP_GROUP',
  cpu_p1 => 80
);

8. 查看

8.1 计划

SELECT plan, status FROM dba_rsrc_plans;

8.2 消费者组

SELECT consumer_group, status FROM dba_rsrc_consumer_groups;

8.3 指令

SELECT 
  plan,
  group_or_subplan,
  cpu_p1,
  parallel_degree_limit_p1,
  active_sess_pool_p1
FROM dba_rsrc_plan_directives
WHERE plan = 'MY_PLAN';

8.4 当前会话组

SELECT 
  sid,
  serial#,
  resource_consumer_group
FROM v$session
WHERE username IS NOT NULL;

9. 监控

9.1 资源使用

SELECT * FROM v$rsrc_consumer_group;

9.2 计划历史

SELECT * FROM dba_rsrc_plan_directives;

9.3 CPU 使用

SELECT 
  name,
  consumed_cpu_time,
  cpu_waits,
  cpu_wait_time
FROM v$rsrc_consumer_group
ORDER BY consumed_cpu_time DESC;

10. 12c+ 新特性

10.1 PDB 资源管理

-- PDB 内创建计划
ALTER SESSION SET CONTAINER = hrpdb;
EXEC DBMS_RESOURCE_MANAGER.CREATE_PENDING_AREA;
...
EXEC DBMS_RESOURCE_MANAGER.SUBMIT_PENDING_AREA;

10.2 CPU 共享

-- CDB 计划分配 CPU 给 PDB
CREATE_PLAN_DIRECTIVE(
  plan => 'cdb_plan',
  group_or_subplan => 'hrpdb',
  shares => 3,
  utilization_limit => 70,
  parallel_server_limit => 50
);

10.3 Memory

-- 12c+ 内存限制
memory_limit => 50  -- %

11. 常见坑与排错

11.1 计划不生效

-- 1. 检查参数
SHOW PARAMETER resource_manager_plan

-- 2. 检查状态
SELECT status FROM dba_rsrc_plans WHERE plan = 'MY_PLAN';

11.2 用户无法切换

-- 检查权限
SELECT * FROM dba_rsrc_consumer_group_privs WHERE grantee = 'SCOTT';

11.3 OTHER_GROUPS 缺失

-- 每个计划必须包含 OTHER_GROUPS

12. 最佳实践

  1. 分业务组:OLTP/BATCH/ADHOC
  2. OLTP 优先:高 CPU
  3. 限制批量:避免影响
  4. 限制 ADHOC:防止滥用
  5. PDB 隔离:12c+
  6. 服务映射:自动分组
  7. 监控使用:调优
  8. 测试验证:效果
  9. 文档化:维护
  10. 定期评估:调整

13. 参考资料

[1] Oracle Database Administrator’s Guide 19c, “Resource Manager” https://docs.oracle.com/en/database/oracle/oracle-database/19/admin/resource-manager.html