1. 首页 > Oracle教程 > 正文

数据库教程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)
“`bash
#确认主机名称
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`查看关键参数
“`sql
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标准配置
“`sql
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 用户权限准备
“`sql
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:其他未映射会话。

“`sql
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消费组。
“`sql
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 启用、切换、关闭资源管理器
“`sql
–激活资源计划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执行。
“`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 查询消费组实时统计
“`sql
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 查询每一个会话归属消费组,会话状态
“`sql
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 查看资源管理器历史指标
“`sql
select * from v$rsrc_metric_history order by begin_time desc;
“`

#### 2.6.4 排查resmgr:cpu‑quantum等待事件
“`sql
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 删除资源管理器对象清理脚本(测试环境复原)
>生产删除前先关闭资源计划。
“`sql
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业务负载比较单一的环境,可以不启用资源管理器;上线前完整在测试环境复现业务压力,验证限流、排队行为是否符合预期,再应用生产。

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息