数据库教程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脚本,读者可以在测试环境完整复现实验现象,掌握资源管理器配置、启用、监控、故障排查整套生产运维手段。网上搜索风哥教程可以学习全套数据库教程

内容大纲

  1. Oracle数据库资源管理业务背景,为什么需要数据库内部资源管控
  2. 数据库资源管理器DBRM核心组件:消费组、资源计划、计划指令、待处理区pending‑area
  3. 各类可管控资源:CPU、并行度、活跃会话池、UNDO池、空闲会话超时、SQL执行时间、IO阈值
  4. 会话映射规则:用户、服务名、模块名映射到消费组
  5. Instance Caging实例笼原理,数据库层面限制实例最大CPU;与操作系统cgroup差异对比
  6. 资源管理器相关数据字典与性能监控视图
  7. 完整实操:创建消费组、资源计划、配置计划指令、会话映射、启用/切换/关闭资源计划
  8. 会话自动切换规则配置:CPU、IO、执行时长触发会话转移、取消SQL
  9. 资源管理器监控:消费组资源消耗、等待事件resmgr:cpu quantum故障分析
  10. 生产环境案例:限制报表业务CPU使用率;限制整个实例CPU最大消耗
  11. 资源管理器常见报错、风险点、上线运维规范

一、核心理论知识

本章节为本套风哥教程理论基础,充分理解资源管理器组件逻辑,才能够合理设计资源隔离策略,避免出现业务会话被错误限流、会话异常排队故障。风哥教程 113257174

1.1 资源管理的业务价值

数据库服务器混合运行在线交易、统计报表、批量ETL、开发查询任务。当报表或者批量任务失控,会把CPU、IO打满,核心交易业务得不到资源。操作系统层面只能限制整个进程的资源,无法区分数据库内部不同用户、不同业务模块会话
DBRM资源管理器运行于数据库内核层面,可以做到:

  1. 按业务会话分组分配CPU权重,保障核心业务优先;
  2. 限制消费组最大CPU利用率上限,防止某一组业务耗尽CPU;
  3. 管控并行DML/查询的并行度,防止并行进程打爆主机;
  4. 设置活跃会话池,控制同时运行的活跃会话数量,超出的会话进入排队;
  5. UNDO池限制消费组最大undo生成量,防止大事务把undo表空间撑满;
  6. 设置空闲会话超时,自动杀掉长时间空闲占用连接的会话;
  7. 配置自动切换规则:会话CPU、IO、执行时间达到阈值,自动将会话切换到低优先级组,甚至直接取消SQL执行。

注意:DBRM只管控数据库内部产生的负载;ASM、后台进程等部分后台进程不受资源计划管控。网上搜索风哥教程可以学习全套数据库教程

1.2 DBRM五大核心组件

  1. 消费组(Consumer Group):会话的分组,把相同业务属性会话归入同一个消费组,例如FGEDU_ONLINE在线交易组、FGEDU_REPORT报表组、FGEDU_BATCH批量任务组。所有没有显式映射的会话归入系统保留组OTHER_GROUPS资源计划必须包含OTHER_GROUPS,否则计划无法启用,报ORA‑07453
  2. 资源计划(Resource Plan):顶层策略,定义不同消费组之间资源分配规则,一个实例同一时间只能激活一套顶层资源计划。
  3. 计划指令(Plan Directive):属于资源计划下属配置,针对每一个消费组设置CPU层级权重utilization_limit、并行度上限、活跃会话池、undo池、切换阈值等参数。
  4. Pending Area待处理区:资源管理器所有对象修改,必须先写入pending_area待处理工作区,校验没有逻辑错误,再submit提交生效;没有创建pending_area直接执行创建会直接报错。
  5. 会话映射规则:通过用户名、服务名、模块名、程序名,将会话自动归属到对应消费组;新登录会话依据映射规则分配消费组,已经存在的会话不会自动变更。风哥数据库教程 itpux‑com

1.3 可管控资源参数说明

  1. mgmt_p1/mgmt_p2/mgmt_p3:多层级CPU权重,同一层级内部按权重分配空闲CPU,空闲CPU可以被其他组复用。
  2. utilization_limit:消费组CPU硬上限百分比,即便系统还有空闲CPU,该消费组也不能超过这个上限,用来限制报表业务最大CPU占用。
  3. parallel_degree_limit_p1:该消费组会话允许的最大并行度。
  4. active_sess_pool_p1:活跃会话池,组内同时最多允许多少个活跃运行会话,超过数量会话进入排队等待。
  5. undo_pool:消费组能够使用的undo总大小,单位MB,大事务超过会报错终止。
  6. idle_time:会话空闲超时时间(秒),超时会话被数据库终止断开。
  7. 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 关键监控视图与等待事件

  1. v$rsrc_plan:当前激活的顶层资源计划;
  2. v$rsrc_consumer_group:各个消费组实时资源消耗统计;
  3. v$rsrc_session_info:每个会话归属消费组、运行状态、排队时间;
  4. v$rsrc_metric_history:资源管理器历史指标;
  5. 等待事件resmgr:cpu quantum:会话被资源管理器限流,CPU时间片被剥夺,会话等待分配CPU时间片;出现该等待代表会话已经达到消费组设置的CPU上限,属于正常限流现象,不是数据库故障。

1.6 生产环境风险提示

  1. 资源计划修改必须走pending_area,提交之后还需要alter system set才会激活;提交pending_area不等于激活计划。
  2. 上线前务必在测试环境完整验证,错误的计划配置会造成业务大量会话排队、SQL被取消,影响业务。
  3. OTHER_GROUPS必须配置指令,否则计划无法加载,ORA‑07453报错。
  4. 资源管理器对SYS、SYSTEM用户会话默认不生效;
  5. 维护窗口自动会启用内部资源计划,如果需要完全关闭,需要特殊下划线参数,不建议随意修改。

二、实战操作演练

本套风哥教程全部实战操作,操作主机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等待,不允许抢占在线业务资源。

  1. 用户/应用程序使用对应账号或者业务模块映射进入FGEDU_REPORT消费组;
  2. 计划指令设置utilization_limit=>40
  3. 激活资源计划;
  4. 通过v$rsrc_consumer_group观察报表组CPU消耗;
  5. 出现大量resmgr:cpu quantum等待,确认限流生效;业务报表运行变慢属于预期行为。

2.8 生产案例二:Instance Caging限制整个实例CPU(主机8核,实例最多使用4核)

  1. 修改spfile参数cpu_count=4
  2. 重启数据库实例,参数生效;
  3. 激活任意资源计划,Instance Caging自动启用;
  4. 数据库实例整体不会消耗超过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 故障排查标准流程

  1. 业务反馈会话卡顿、SQL执行缓慢,首先查看等待事件是否大量出现resmgr:cpu quantum
  2. 查询v$rsrc_session_info确认会话归属哪一个消费组,state状态是RUNNING/WAIT_FOR_CPU/QUEUED;
  3. 核对资源计划指令:mgmt_p1权重、utilization_limit、active_sess_pool_p1参数配置;
  4. 核对会话映射规则,确认会话是否被映射到错误消费组;老会话不会应用映射规则,需要重连;
  5. ORA‑07453报错:资源计划缺少OTHER_GROUPS指令,补充计划指令,重新提交pending_area;
  6. 如果业务出现大量会话排队,评估是否调高活跃会话池、CPU权重、utilization_limit上限;
  7. 临时应急:alter system set resource_manager_plan=''关闭资源管理器,恢复全部资源,再调整计划配置;
  8. 修改完成之后,新建立会话验证效果,保留关闭资源计划的应急回退脚本。

三、风哥针对本文总结

本套风哥教程完整覆盖Oracle数据库资源管理器DBRM整套知识,包括消费组、资源计划、pending‑area待处理区、CPU权重、utilization_limit硬上限、活跃会话池、undo池、会话自动切换规则、Instance Caging实例笼原理,完整实操脚本,监控视图,以及两套真实生产案例、故障排查流程。

  1. DBRM是数据库内核内部资源隔离方案,可以区分数据库内部不同业务会话分组;它不等同操作系统cgroup;cgroup管控整个Oracle进程,DBRM管控实例内部各个业务会话,二者可以配合使用。
  2. 所有资源计划、消费组修改,必须经过create_pending_area待处理区,校验通过submit_pending_area提交;提交不等于激活计划,还需要执行alter system设置resource_manager_plan动态激活。
  3. OTHER_GROUPS是强制要求,任何资源计划必须配置该组的计划指令,否则无法加载,抛出ORA‑07453错误。
  4. 会话映射规则只对新登录会话生效;已经存在的旧会话不会自动重新映射消费组,测试验证需要重连数据库会话。
  5. utilization_limit是消费组CPU硬上限,即使主机还有空闲CPU,该组会话也不允许超过;等待事件resmgr:cpu quantum是限流生效的正常现象,不是数据库BUG;出现大量该等待需要评估业务资源上限配置是否合理。
  6. Instance Caging通过cpu_count参数实现整个实例全局CPU上限,修改cpu_count需要重启实例;适合一台主机部署多套Oracle实例,用来做实例之间资源隔离。
  7. 上线资源管理器务必准备应急回退手段:alter system set resource_manager_plan='' scope=both,可以动态关闭资源管控,业务紧急故障时快速恢复全部资源。
  8. 资源管理器优先用于混合负载环境,在线OLTP+报表批量ETL混合场景;纯OLTP业务负载比较单一的环境,可以不启用资源管理器;上线前完整在测试环境复现业务压力,验证限流、排队行为是否符合预期,再应用生产。
posted @ 2026-09-11 10:21  风哥数据库教程  阅读(8)  评论(0)    收藏  举报