ITPub博客

首页 > 数据库 > Oracle > 数据库教程FGMT14‑Oracle性能优化之资源限制与资源管理

数据库教程FGMT14‑Oracle性能优化之资源限制与资源管理

原创 Oracle 作者:mfkqwyc86 时间:2026-09-16 10:53:25 0 删除 编辑

数据库教程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业务负载比较单一的环境,可以不启用资源管理器;上线前完整在测试环境复现业务压力,验证限流、排队行为是否符合预期,再应用生产。


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/9664900/viewspace-3182499/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
风哥Oracle,MySQL,PostgreSQL,Linux,大数据,国产数据库,中间件等教程

注册时间:2010-10-26

  • 博文量
    68
  • 访问量
    406003