数据库教程FGMT14‑Oracle性能优化之资源限制与资源管理
数据库教程FGMT14‑Oracle性能优化之资源限制与资源管理
前言
Oracle数据库在多业务混合部署场景下,经常会出现某一类业务或者某一条SQL耗尽实例CPU、IO、并行、UNDO等全部资源,挤压核心在线业务,引发整体业务雪崩。单纯依靠操作系统层面限制无法区分数据库内部用户、会话、业务模块,Oracle数据库资源管理器(Database Resource Manager,DBRM)可以在数据库内部实现资源隔离,对不同业务会话分组分配CPU、并行度、IO、UNDO、会话执行时长等资源,保障核心业务优先获得系统资源,限制非核心报表、批量任务的资源消耗。风哥教程本文围绕资源管理器底层原理、消费组、资源计划、指令参数、会话映射、实例笼(Instance Caging)、操作系统cgroup区别、全套实操脚本、生产故障排查案例完整展开讲解。风哥 itpux‑com
本套风哥教程面向DBA、运维工程师、数据库架构师,全部实验标准化环境配置:主机名称fgedu‑net‑cn,硬件规格64G物理内存、8颗CPU;数据库实例名fgedudb,数据库名fgedudb,测试业务用户名fgedu,文件根目录统一为/fgedudb,整套实验基于Oracle19c企业版完成。风哥教程本文分为前言大纲介绍、核心理论知识、实战操作演练、总结四大模块;实战章节包含大量可直接复制运行SQL脚本,读者可以在测试环境完整复现实验现象,掌握资源管理器配置、启用、监控、故障排查整套生产运维手段。网上搜索风哥教程可以学习全套数据库教程
内容大纲
- Oracle数据库资源管理业务背景,为什么需要数据库内部资源管控
- 数据库资源管理器DBRM核心组件:消费组、资源计划、计划指令、待处理区pending‑area
- 各类可管控资源:CPU、并行度、活跃会话池、UNDO池、空闲会话超时、SQL执行时间、IO阈值
- 会话映射规则:用户、服务名、模块名映射到消费组
- Instance Caging实例笼原理,数据库层面限制实例最大CPU;与操作系统cgroup差异对比
- 资源管理器相关数据字典与性能监控视图
- 完整实操:创建消费组、资源计划、配置计划指令、会话映射、启用/切换/关闭资源计划
- 会话自动切换规则配置:CPU、IO、执行时长触发会话转移、取消SQL
- 资源管理器监控:消费组资源消耗、等待事件resmgr:cpu quantum故障分析
- 生产环境案例:限制报表业务CPU使用率;限制整个实例CPU最大消耗
- 资源管理器常见报错、风险点、上线运维规范
一、核心理论知识
本章节为本套风哥教程理论基础,充分理解资源管理器组件逻辑,才能够合理设计资源隔离策略,避免出现业务会话被错误限流、会话异常排队故障。风哥教程 113257174
1.1 资源管理的业务价值
数据库服务器混合运行在线交易、统计报表、批量ETL、开发查询任务。当报表或者批量任务失控,会把CPU、IO打满,核心交易业务得不到资源。操作系统层面只能限制整个进程的资源,无法区分数据库内部不同用户、不同业务模块会话。
DBRM资源管理器运行于数据库内核层面,可以做到:
- 按业务会话分组分配CPU权重,保障核心业务优先;
- 限制消费组最大CPU利用率上限,防止某一组业务耗尽CPU;
- 管控并行DML/查询的并行度,防止并行进程打爆主机;
- 设置活跃会话池,控制同时运行的活跃会话数量,超出的会话进入排队;
- UNDO池限制消费组最大undo生成量,防止大事务把undo表空间撑满;
- 设置空闲会话超时,自动杀掉长时间空闲占用连接的会话;
- 配置自动切换规则:会话CPU、IO、执行时间达到阈值,自动将会话切换到低优先级组,甚至直接取消SQL执行。
注意:DBRM只管控数据库内部产生的负载;ASM、后台进程等部分后台进程不受资源计划管控。网上搜索风哥教程可以学习全套数据库教程
1.2 DBRM五大核心组件
- 消费组(Consumer Group):会话的分组,把相同业务属性会话归入同一个消费组,例如
FGEDU_ONLINE在线交易组、FGEDU_REPORT报表组、FGEDU_BATCH批量任务组。所有没有显式映射的会话归入系统保留组OTHER_GROUPS,资源计划必须包含OTHER_GROUPS,否则计划无法启用,报ORA‑07453。 - 资源计划(Resource Plan):顶层策略,定义不同消费组之间资源分配规则,一个实例同一时间只能激活一套顶层资源计划。
- 计划指令(Plan Directive):属于资源计划下属配置,针对每一个消费组设置CPU层级权重utilization_limit、并行度上限、活跃会话池、undo池、切换阈值等参数。
- Pending Area待处理区:资源管理器所有对象修改,必须先写入pending_area待处理工作区,校验没有逻辑错误,再submit提交生效;没有创建pending_area直接执行创建会直接报错。
- 会话映射规则:通过用户名、服务名、模块名、程序名,将会话自动归属到对应消费组;新登录会话依据映射规则分配消费组,已经存在的会话不会自动变更。风哥数据库教程 itpux‑com
1.3 可管控资源参数说明
- mgmt_p1/mgmt_p2/mgmt_p3:多层级CPU权重,同一层级内部按权重分配空闲CPU,空闲CPU可以被其他组复用。
- utilization_limit:消费组CPU硬上限百分比,即便系统还有空闲CPU,该消费组也不能超过这个上限,用来限制报表业务最大CPU占用。
- parallel_degree_limit_p1:该消费组会话允许的最大并行度。
- active_sess_pool_p1:活跃会话池,组内同时最多允许多少个活跃运行会话,超过数量会话进入排队等待。
- undo_pool:消费组能够使用的undo总大小,单位MB,大事务超过会报错终止。
- idle_time:会话空闲超时时间(秒),超时会话被数据库终止断开。
- switch_time / switch_io_megabytes / switch_cpu_time:自动触发条件;会话CPU、IO、执行时间达到阈值,执行switch_group转移会话,或者switch_sql取消当前SQL。
1.4 Instance Caging实例笼
Instance Caging用来限制整个数据库实例最大能够使用的CPU数量,通过初始化参数cpu_count配合资源计划开启。主机物理有8颗CPU,可以设置cpu_count=4,实例最多只能使用4颗CPU算力。
区分概念:
- DBRM消费组utilization_limit:组内会话的CPU上限,实例内部各组之间隔离。
- Instance Caging:整个实例全局CPU上限,保护主机上其他实例/应用。
与Linux cgroup的区别:cgroup是操作系统层对Oracle进程做限制;Instance Caging是Oracle内核内部实现,不需要操作系统权限,只作用于本实例。二者可以同时使用,也可以单独选用其一。
1.5 关键监控视图与等待事件
v$rsrc_plan:当前激活的顶层资源计划;v$rsrc_consumer_group:各个消费组实时资源消耗统计;v$rsrc_session_info:每个会话归属消费组、运行状态、排队时间;v$rsrc_metric_history:资源管理器历史指标;- 等待事件
resmgr:cpu quantum:会话被资源管理器限流,CPU时间片被剥夺,会话等待分配CPU时间片;出现该等待代表会话已经达到消费组设置的CPU上限,属于正常限流现象,不是数据库故障。
1.6 生产环境风险提示
- 资源计划修改必须走pending_area,提交之后还需要alter system set才会激活;提交pending_area不等于激活计划。
- 上线前务必在测试环境完整验证,错误的计划配置会造成业务大量会话排队、SQL被取消,影响业务。
- OTHER_GROUPS必须配置指令,否则计划无法加载,ORA‑07453报错。
- 资源管理器对SYS、SYSTEM用户会话默认不生效;
- 维护窗口自动会启用内部资源计划,如果需要完全关闭,需要特殊下划线参数,不建议随意修改。
二、实战操作演练
本套风哥教程全部实战操作,操作主机fgedu‑net‑cn,数据库fgedudb,业务用户fgedu,目录/fgedudb,硬件规格64G内存8CPU。
环境说明:操作系统登录oracle用户,设置环境变量指向
fgedudb实例;DBMS_RESOURCE_MANAGER包操作需要sysdba权限。
2.1 操作系统与数据库环境校验
2.1.1操作系统层面检查(主机fgedu‑net‑cn)
#确认主机名称
hostname
#确认ORACLE_HOME路径全部指向/fgedudb
echo $ORACLE_HOME
#查看内存硬件,确认64G内存
free -h
#查看CPU,确认8CPU
lscpu
校验输出:hostname输出fgedu‑net‑cn,总内存64G,逻辑CPU数量8。
2.1.2 数据库关键初始化参数确认(64G内存8CPU规格)
登录sqlplus / as sysdba查看关键参数
show parameter memory_target;
show parameter sga_target;
show parameter pga_aggregate_target;
show parameter resource_manager_plan;
show parameter cpu_count;
show parameter statistics_level;
适配64G内存主机spfile标准配置
alter system set memory_max_target=48G scope=spfile;
alter system set memory_target=48G scope=spfile;
alter system set statistics_level=TYPICAL scope=spfile;
-- instance caging示例:全局最多使用4颗CPU,按需开启
alter system set cpu_count=4 scope=spfile;
cpu_count修改实例笼需要重启实例生效;resource_manager_plan为空代表资源管理器未激活。
2.1.3 用户权限准备
create user fgedu identified by fgedudb default tablespace users temporary tablespace temp;
grant connect,resource to fgedu;
grant select_catalog_role to fgedu;
grant execute on dbms_resource_manager to fgedu;
grant execute on dbms_resource_manager_privs to fgedu;
2.2 创建消费组、资源计划完整实操
业务规划示例:
- FGEDU_ONLINE:在线交易业务,高优先级;
- FGEDU_REPORT:报表统计业务,限制CPU最大40%;
- FGEDU_BATCH:批量ETL任务;
- OTHER_GROUPS:其他未映射会话。
conn / as sysdba
--1.清空旧待处理区
exec dbms_resource_manager.clear_pending_area();
--2.创建待处理工作区
exec dbms_resource_manager.create_pending_area();
--3.创建3个业务消费组
BEGIN
dbms_resource_manager.create_consumer_group(
consumer_group=>'FGEDU_ONLINE',
comment=>'fgedu在线交易业务组');
dbms_resource_manager.create_consumer_group(
consumer_group=>'FGEDU_REPORT',
comment=>'fgedu报表统计业务组');
dbms_resource_manager.create_consumer_group(
consumer_group=>'FGEDU_BATCH',
comment=>'fgedu批量ETL任务组');
END;
/
--4.创建顶层资源计划FGEDU_MAIN_PLAN
BEGIN
dbms_resource_manager.create_plan(
plan=>'FGEDU_MAIN_PLAN',
comment=>'fgedudb生产业务资源管控主计划');
END;
/
--5.编写计划指令,分配各个消费组资源
BEGIN
--在线业务,一级权重60,并行度8
dbms_resource_manager.create_plan_directive(
plan=>'FGEDU_MAIN_PLAN',
group_or_subplan=>'FGEDU_ONLINE',
comment=>'在线交易业务高优先级',
mgmt_p1=>60,
parallel_degree_limit_p1=>8
);
--报表业务,一级权重30,硬CPU上限40%,并行度4
dbms_resource_manager.create_plan_directive(
plan=>'FGEDU_MAIN_PLAN',
group_or_subplan=>'FGEDU_REPORT',
comment=>'报表业务,CPU上限40%',
mgmt_p1=>30,
utilization_limit=>40,
parallel_degree_limit_p1=>4
);
--批量任务,一级权重10,并行度2,undo池1024MB
dbms_resource_manager.create_plan_directive(
plan=>'FGEDU_MAIN_PLAN',
group_or_subplan=>'FGEDU_BATCH',
comment=>'批量ETL任务',
mgmt_p1=>10,
parallel_degree_limit_p1=>2,
undo_pool=>1024
);
--必须配置OTHER_GROUPS,否则计划加载报错ORA‑07453
dbms_resource_manager.create_plan_directive(
plan=>'FGEDU_MAIN_PLAN',
group_or_subplan=>'OTHER_GROUPS',
comment=>'未映射会话默认组',
mgmt_p1=>10
);
END;
/
--6.提交待处理区,校验对象逻辑并写入数据字典
exec dbms_resource_manager.submit_pending_area();
2.3 配置会话映射规则(用户名映射消费组)
实现fgedu用户登录自动归属FGEDU_ONLINE消费组。
BEGIN
dbms_resource_manager.set_consumer_group_mapping(
attribute=>'ORACLE_USER',
value=>'FGEDU',
consumer_group=>'FGEDU_ONLINE'
);
END;
/
其他映射属性支持:
SERVICE_NAME服务名、MODULE_NAME模块名、PROGRAM_NAME程序名,实现按业务程序自动分组。
2.4 启用、切换、关闭资源管理器
--激活资源计划FGEDU_MAIN_PLAN,开启资源管理器
alter system set resource_manager_plan='FGEDU_MAIN_PLAN' scope=both;
--查看当前生效顶层资源计划
select plan_name,is_top_plan,cpu_managed from v$rsrc_plan;
--关闭资源管理器,设置为空
alter system set resource_manager_plan='' scope=both;
注意:alter system设置resource_manager_plan不需要重启实例,动态生效;已经建立的老会话不会重新执行映射,新建立的会话才会应用映射规则。
2.5 配置会话自动切换策略实战
示例:报表组FGEDU_REPORT,SQL累计CPU超过30秒,自动取消这条SQL执行。
exec dbms_resource_manager.clear_pending_area();
exec dbms_resource_manager.create_pending_area();
BEGIN
dbms_resource_manager.update_plan_directive(
plan=>'FGEDU_MAIN_PLAN',
group_or_subplan=>'FGEDU_REPORT',
new_switch_cpu_time=>30,
new_switch_group=>'CANCEL_SQL',
new_switch_for_call=>TRUE
);
END;
/
exec dbms_resource_manager.submit_pending_area();
参数说明:
- switch_cpu_time:SQL消耗CPU时间阈值,单位秒;
- switch_group=>'CANCEL_SQL':达到阈值直接终止当前SQL;
- 可选值也可以填写其他消费组名称,会话转移到低优先级消费组继续运行。
2.6 资源管理器监控查询实操
2.6.1 查询消费组实时统计
set linesize 200
col consumer_group format a30
col cpu_wait_time format 99999999
col consumed_cpu_time format 99999999
select name consumer_group,cpu_wait_time,consumed_cpu_time,queued_requests,running_requests
from v$rsrc_consumer_group;
2.6.2 查询每一个会话归属消费组,会话状态
set linesize 220
col sid format 9999
col serial# format 9999
col consumer_group format a30
col state format a20
select s.sid,s.serial#,cg.name consumer_group,si.state,si.queued_time
from v$session s
join v$rsrc_session_info si on s.sid=si.sid and s.serial#=si.serial#
join v$rsrc_consumer_group cg on si.current_consumer_group_id=cg.id;
state字段常见值:RUNNING运行中;WAIT_FOR_CPU等待CPU配额;QUEUED活跃会话池排队。
2.6.3 查看资源管理器历史指标
select * from v$rsrc_metric_history order by begin_time desc;
2.6.4 排查resmgr:cpu‑quantum等待事件
select sid,event,state,sql_id from v$session where event='resmgr:cpu quantum';
出现该等待代表会话被DBRM限流,是配置的utilization_limit上限生效,不是数据库故障,需要评估业务是否应该调高该消费组CPU上限。
2.7 生产案例一:限制报表业务最大CPU使用率
需求:报表业务会话归属FGEDU_REPORT,最大允许消耗40%CPU,超过触发resmgr:cpu quantum等待,不允许抢占在线业务资源。
- 用户/应用程序使用对应账号或者业务模块映射进入FGEDU_REPORT消费组;
- 计划指令设置
utilization_limit=>40; - 激活资源计划;
- 通过
v$rsrc_consumer_group观察报表组CPU消耗; - 出现大量
resmgr:cpu quantum等待,确认限流生效;业务报表运行变慢属于预期行为。
2.8 生产案例二:Instance Caging限制整个实例CPU(主机8核,实例最多使用4核)
- 修改spfile参数
cpu_count=4; - 重启数据库实例,参数生效;
- 激活任意资源计划,Instance Caging自动启用;
- 数据库实例整体不会消耗超过4颗CPU算力,保护主机上其他应用或者其他数据库实例。
2.9 删除资源管理器对象清理脚本(测试环境复原)
生产删除前先关闭资源计划。
alter system set resource_manager_plan='' scope=both;
exec dbms_resource_manager.clear_pending_area();
exec dbms_resource_manager.create_pending_area();
BEGIN
dbms_resource_manager.delete_plan(plan=>'FGEDU_MAIN_PLAN');
dbms_resource_manager.delete_consumer_group(consumer_group=>'FGEDU_ONLINE');
dbms_resource_manager.delete_consumer_group(consumer_group=>'FGEDU_REPORT');
dbms_resource_manager.delete_consumer_group(consumer_group=>'FGEDU_BATCH');
END;
/
exec dbms_resource_manager.submit_pending_area();
2.10 故障排查标准流程
- 业务反馈会话卡顿、SQL执行缓慢,首先查看等待事件是否大量出现
resmgr:cpu quantum; - 查询
v$rsrc_session_info确认会话归属哪一个消费组,state状态是RUNNING/WAIT_FOR_CPU/QUEUED; - 核对资源计划指令:mgmt_p1权重、utilization_limit、active_sess_pool_p1参数配置;
- 核对会话映射规则,确认会话是否被映射到错误消费组;老会话不会应用映射规则,需要重连;
- ORA‑07453报错:资源计划缺少OTHER_GROUPS指令,补充计划指令,重新提交pending_area;
- 如果业务出现大量会话排队,评估是否调高活跃会话池、CPU权重、utilization_limit上限;
- 临时应急:
alter system set resource_manager_plan=''关闭资源管理器,恢复全部资源,再调整计划配置; - 修改完成之后,新建立会话验证效果,保留关闭资源计划的应急回退脚本。
三、风哥针对本文总结
本套风哥教程完整覆盖Oracle数据库资源管理器DBRM整套知识,包括消费组、资源计划、pending‑area待处理区、CPU权重、utilization_limit硬上限、活跃会话池、undo池、会话自动切换规则、Instance Caging实例笼原理,完整实操脚本,监控视图,以及两套真实生产案例、故障排查流程。
- DBRM是数据库内核内部资源隔离方案,可以区分数据库内部不同业务会话分组;它不等同操作系统cgroup;cgroup管控整个Oracle进程,DBRM管控实例内部各个业务会话,二者可以配合使用。
- 所有资源计划、消费组修改,必须经过
create_pending_area待处理区,校验通过submit_pending_area提交;提交不等于激活计划,还需要执行alter system设置resource_manager_plan动态激活。 - OTHER_GROUPS是强制要求,任何资源计划必须配置该组的计划指令,否则无法加载,抛出ORA‑07453错误。
- 会话映射规则只对新登录会话生效;已经存在的旧会话不会自动重新映射消费组,测试验证需要重连数据库会话。
utilization_limit是消费组CPU硬上限,即使主机还有空闲CPU,该组会话也不允许超过;等待事件resmgr:cpu quantum是限流生效的正常现象,不是数据库BUG;出现大量该等待需要评估业务资源上限配置是否合理。- Instance Caging通过cpu_count参数实现整个实例全局CPU上限,修改cpu_count需要重启实例;适合一台主机部署多套Oracle实例,用来做实例之间资源隔离。
- 上线资源管理器务必准备应急回退手段:
alter system set resource_manager_plan='' scope=both,可以动态关闭资源管控,业务紧急故障时快速恢复全部资源。 - 资源管理器优先用于混合负载环境,在线OLTP+报表批量ETL混合场景;纯OLTP业务负载比较单一的环境,可以不启用资源管理器;上线前完整在测试环境复现业务压力,验证限流、排队行为是否符合预期,再应用生产。

浙公网安备 33010602011771号