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. 最佳实践
- 分业务组:OLTP/BATCH/ADHOC
- OLTP 优先:高 CPU
- 限制批量:避免影响
- 限制 ADHOC:防止滥用
- PDB 隔离:12c+
- 服务映射:自动分组
- 监控使用:调优
- 测试验证:效果
- 文档化:维护
- 定期评估:调整
13. 参考资料
[1] Oracle Database Administrator’s Guide 19c, “Resource Manager” https://docs.oracle.com/en/database/oracle/oracle-database/19/admin/resource-manager.html