








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脚本,读者可以在测试环境完整复现实验现象,掌握资源管理器配置、启用、监控、故障排查整套生产运维手段。网上搜索风哥教程可以学习全套数据库教程
本章节为本套风哥教程理论基础,充分理解资源管理器组件逻辑,才能够合理设计资源隔离策略,避免出现业务会话被错误限流、会话异常排队故障。风哥教程 113257174
数据库服务器混合运行在线交易、统计报表、批量ETL、开发查询任务。当报表或者批量任务失控,会把CPU、IO打满,核心交易业务得不到资源。操作系统层面只能限制整个进程的资源,无法区分数据库内部不同用户、不同业务模块会话。
DBRM资源管理器运行于数据库内核层面,可以做到:
注意:DBRM只管控数据库内部产生的负载;ASM、后台进程等部分后台进程不受资源计划管控。网上搜索风哥教程可以学习全套数据库教程
FGEDU_ONLINE在线交易组、FGEDU_REPORT报表组、FGEDU_BATCH批量任务组。所有没有显式映射的会话归入系统保留组OTHER_GROUPS,资源计划必须包含OTHER_GROUPS,否则计划无法启用,报ORA‑07453。Instance Caging用来限制整个数据库实例最大能够使用的CPU数量,通过初始化参数cpu_count配合资源计划开启。主机物理有8颗CPU,可以设置cpu_count=4,实例最多只能使用4颗CPU算力。
区分概念:
与Linux cgroup的区别:cgroup是操作系统层对Oracle进程做限制;Instance Caging是Oracle内核内部实现,不需要操作系统权限,只作用于本实例。二者可以同时使用,也可以单独选用其一。
v$rsrc_plan:当前激活的顶层资源计划;v$rsrc_consumer_group:各个消费组实时资源消耗统计;v$rsrc_session_info:每个会话归属消费组、运行状态、排队时间;v$rsrc_metric_history:资源管理器历史指标;resmgr:cpu quantum:会话被资源管理器限流,CPU时间片被剥夺,会话等待分配CPU时间片;出现该等待代表会话已经达到消费组设置的CPU上限,属于正常限流现象,不是数据库故障。本套风哥教程全部实战操作,操作主机fgedu‑net‑cn,数据库fgedudb,业务用户fgedu,目录/fgedudb,硬件规格64G内存8CPU。
环境说明:操作系统登录oracle用户,设置环境变量指向
fgedudb实例;DBMS_RESOURCE_MANAGER包操作需要sysdba权限。
#确认主机名称
hostname
#确认ORACLE_HOME路径全部指向/fgedudb
echo $ORACLE_HOME
#查看内存硬件,确认64G内存
free -h
#查看CPU,确认8CPU
lscpu
校验输出:hostname输出fgedu‑net‑cn,总内存64G,逻辑CPU数量8。
登录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为空代表资源管理器未激活。
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;
业务规划示例:
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();
实现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程序名,实现按业务程序自动分组。
--激活资源计划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不需要重启实例,动态生效;已经建立的老会话不会重新执行映射,新建立的会话才会应用映射规则。
示例:报表组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();
参数说明:
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;
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活跃会话池排队。
select * from v$rsrc_metric_history order by begin_time desc;
select sid,event,state,sql_id from v$session where event='resmgr:cpu quantum';
出现该等待代表会话被DBRM限流,是配置的utilization_limit上限生效,不是数据库故障,需要评估业务是否应该调高该消费组CPU上限。
需求:报表业务会话归属FGEDU_REPORT,最大允许消耗40%CPU,超过触发resmgr:cpu quantum等待,不允许抢占在线业务资源。
utilization_limit=>40;v$rsrc_consumer_group观察报表组CPU消耗;resmgr:cpu quantum等待,确认限流生效;业务报表运行变慢属于预期行为。cpu_count=4;生产删除前先关闭资源计划。
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();
resmgr:cpu quantum;v$rsrc_session_info确认会话归属哪一个消费组,state状态是RUNNING/WAIT_FOR_CPU/QUEUED;alter system set resource_manager_plan=''关闭资源管理器,恢复全部资源,再调整计划配置;本套风哥教程完整覆盖Oracle数据库资源管理器DBRM整套知识,包括消费组、资源计划、pending‑area待处理区、CPU权重、utilization_limit硬上限、活跃会话池、undo池、会话自动切换规则、Instance Caging实例笼原理,完整实操脚本,监控视图,以及两套真实生产案例、故障排查流程。
create_pending_area待处理区,校验通过submit_pending_area提交;提交不等于激活计划,还需要执行alter system设置resource_manager_plan动态激活。utilization_limit是消费组CPU硬上限,即使主机还有空闲CPU,该组会话也不允许超过;等待事件resmgr:cpu quantum是限流生效的正常现象,不是数据库BUG;出现大量该等待需要评估业务资源上限配置是否合理。alter system set resource_manager_plan='' scope=both,可以动态关闭资源管控,业务紧急故障时快速恢复全部资源。此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。