外观
Oracle 资源管理器配置最佳实践
Oracle资源管理器(Resource Manager)是Oracle数据库提供的一种资源管理工具,用于在多用户环境中分配和管理系统资源,如CPU、内存和I/O。通过资源管理器,可以确保关键业务应用获得足够的资源,提高系统的整体性能和稳定性。
资源管理器概述
资源管理器的核心功能
- 按用户、角色或服务分配CPU资源
- 限制会话和调用的CPU使用时间
- 管理并行执行服务器资源
- 限制会话的并行度
- 管理SQL语句的执行优先级
- 限制会话的PGA使用
- 管理I/O资源(Oracle 11g及以上版本)
资源管理器的应用场景
- 混合工作负载环境:同时运行OLTP和OLAP工作负载的数据库
- 多租户环境:在同一数据库中运行多个独立应用
- 高并发环境:大量用户同时访问数据库的场景
- 资源争用严重的环境:不同业务之间经常发生资源争用的情况
- 关键业务保障:需要确保关键业务获得足够资源的场景
资源管理器组件
核心组件
| 组件名称 | 描述 |
|---|---|
| 资源使用者组 | 一组用户、角色或服务,共享相同的资源分配策略 |
| 资源计划 | 定义资源使用者组之间的资源分配规则 |
| 资源计划指令 | 定义资源计划中每个资源使用者组的资源分配 |
| 资源分配方法 | 定义资源分配的算法,如CPU方法、并行度限制等 |
预定义的资源使用者组
| 使用者组名称 | 描述 |
|---|---|
| SYS_GROUP | 系统用户组,如SYS和SYSTEM |
| DEFAULT_CONSUMER_GROUP | 默认用户组,所有未分配到其他组的用户都属于该组 |
| LOW_GROUP | 低优先级用户组 |
| MEDIUM_GROUP | 中优先级用户组 |
| HIGH_GROUP | 高优先级用户组 |
| ORA$AUTOTASK_SUB_PLAN | 自动任务子计划组 |
资源管理器配置步骤
创建资源使用者组
在创建资源计划之前,需要先创建资源使用者组,将不同类型的用户或服务分类管理。
sql
-- 创建资源使用者组
BEGIN
-- 创建OLTP业务组
dbms_resource_manager.create_consumer_group(
consumer_group => 'OLTP_GROUP',
comment => 'OLTP applications consumer group');
-- 创建数据仓库组
dbms_resource_manager.create_consumer_group(
consumer_group => 'DWH_GROUP',
comment => 'Data Warehouse applications consumer group');
-- 创建报表组
dbms_resource_manager.create_consumer_group(
consumer_group => 'REPORTING_GROUP',
comment => 'Reporting applications consumer group');
-- 创建批处理组
dbms_resource_manager.create_consumer_group(
consumer_group => 'BATCH_GROUP',
comment => 'Batch processing applications consumer group');
END;
/创建资源计划
资源计划是资源管理的核心,定义了不同资源使用者组之间的资源分配规则。
sql
-- 创建资源计划
BEGIN
dbms_resource_manager.create_plan(
plan => 'PROD_PLAN',
comment => 'Production database resource plan');
END;
/创建资源计划指令
资源计划指令定义了每个资源使用者组的具体资源分配情况,包括CPU、并行度、活跃会话限制等。
sql
-- 创建资源计划指令
BEGIN
-- 为OLTP组分配40%的CPU资源,最高优先级
dbms_resource_manager.create_plan_directive(
plan => 'PROD_PLAN',
group_or_subplan => 'OLTP_GROUP',
comment => 'OLTP applications directive',
cpu_p1 => 40, -- 最高优先级CPU分配
cpu_p2 => 0,
cpu_p3 => 0,
cpu_p4 => 0,
parallel_degree_limit_p1 => 8, -- 并行度限制
active_sessions_limit => 100, -- 活跃会话限制
parallel_server_limit => 64, -- 并行服务器限制
pga_aggregate_limit_p1 => 2000000000); -- PGA限制(字节)
-- 为DWH组分配30%的CPU资源,第二优先级
dbms_resource_manager.create_plan_directive(
plan => 'PROD_PLAN',
group_or_subplan => 'DWH_GROUP',
comment => 'Data Warehouse applications directive',
cpu_p1 => 0,
cpu_p2 => 30, -- 第二优先级CPU分配
cpu_p3 => 0,
cpu_p4 => 0,
parallel_degree_limit_p1 => 16,
active_sessions_limit => 50,
parallel_server_limit => 128,
pga_aggregate_limit_p1 => 4000000000);
-- 为报表组分配20%的CPU资源,第三优先级
dbms_resource_manager.create_plan_directive(
plan => 'PROD_PLAN',
group_or_subplan => 'REPORTING_GROUP',
comment => 'Reporting applications directive',
cpu_p1 => 0,
cpu_p2 => 0,
cpu_p3 => 20, -- 第三优先级CPU分配
cpu_p4 => 0,
parallel_degree_limit_p1 => 4,
active_sessions_limit => 20,
parallel_server_limit => 32,
pga_aggregate_limit_p1 => 1000000000);
-- 为批处理组分配10%的CPU资源,第四优先级
dbms_resource_manager.create_plan_directive(
plan => 'PROD_PLAN',
group_or_subplan => 'BATCH_GROUP',
comment => 'Batch processing directive',
cpu_p1 => 0,
cpu_p2 => 0,
cpu_p3 => 0,
cpu_p4 => 10, -- 第四优先级CPU分配
parallel_degree_limit_p1 => 24,
active_sessions_limit => 10,
parallel_server_limit => 96,
pga_aggregate_limit_p1 => 3000000000);
-- 为默认组分配剩余资源,最低优先级
dbms_resource_manager.create_plan_directive(
plan => 'PROD_PLAN',
group_or_subplan => 'DEFAULT_CONSUMER_GROUP',
comment => 'Default consumer group directive',
cpu_p1 => 0,
cpu_p2 => 0,
cpu_p3 => 0,
cpu_p4 => 0, -- 无固定分配,使用剩余资源
parallel_degree_limit_p1 => 2,
active_sessions_limit => 10,
parallel_server_limit => 8,
pga_aggregate_limit_p1 => 500000000);
-- 为SYS组分配不受限制的资源
dbms_resource_manager.create_plan_directive(
plan => 'PROD_PLAN',
group_or_subplan => 'SYS_GROUP',
comment => 'SYS group directive',
cpu_p1 => 100, -- SYS组始终获得所需资源
cpu_p2 => 0,
cpu_p3 => 0,
cpu_p4 => 0,
parallel_degree_limit_p1 => unlimited,
active_sessions_limit => unlimited,
parallel_server_limit => unlimited,
pga_aggregate_limit_p1 => unlimited);
END;
/验证资源计划
在激活资源计划之前,建议先验证资源计划的配置是否正确。
sql
-- 验证资源计划
BEGIN
dbms_resource_manager.validate_plan(plan => 'PROD_PLAN');
END;
/创建资源映射规则
资源映射规则用于将用户、服务或模块分配到相应的资源使用者组。
sql
-- 创建资源映射规则,将用户分配到资源使用者组
BEGIN
-- 将OLTP用户分配到OLTP_GROUP
dbms_resource_manager.set_consumer_group_mapping(
attribute => 'ORACLE_USER',
value => 'OLTP_USER',
consumer_group => 'OLTP_GROUP');
-- 将DWH用户分配到DWH_GROUP
dbms_resource_manager.set_consumer_group_mapping(
attribute => 'ORACLE_USER',
value => 'DWH_USER',
consumer_group => 'DWH_GROUP');
-- 将报表用户分配到REPORTING_GROUP
dbms_resource_manager.set_consumer_group_mapping(
attribute => 'ORACLE_USER',
value => 'REPORTING_USER',
consumer_group => 'REPORTING_GROUP');
-- 将批处理用户分配到BATCH_GROUP
dbms_resource_manager.set_consumer_group_mapping(
attribute => 'ORACLE_USER',
value => 'BATCH_USER',
consumer_group => 'BATCH_GROUP');
-- 根据服务名称分配资源使用者组
dbms_resource_manager.set_consumer_group_mapping(
attribute => 'SERVICE_NAME',
value => 'OLTP_SERVICE',
consumer_group => 'OLTP_GROUP');
dbms_resource_manager.set_consumer_group_mapping(
attribute => 'SERVICE_NAME',
value => 'DWH_SERVICE',
consumer_group => 'DWH_GROUP');
-- 根据模块名称分配资源使用者组(适合应用程序使用DBMS_APPLICATION_INFO设置模块名称的场景)
dbms_resource_manager.set_consumer_group_mapping(
attribute => 'MODULE_NAME',
value => 'REPORTING_MODULE',
consumer_group => 'REPORTING_GROUP');
END;
/激活资源计划
资源计划创建完成后,可以激活资源计划,使其生效。
sql
-- 激活资源计划
ALTER SYSTEM SET resource_manager_plan = 'PROD_PLAN' SCOPE=BOTH;
-- 查看当前激活的资源计划
SHOW PARAMETER resource_manager_plan;
-- 或者使用以下查询查看
SELECT name, is_top_plan FROM v$rsrc_plan;资源管理器监控
查看资源使用者组
sql
-- 查看所有资源使用者组
SELECT consumer_group, comment$ FROM dba_rsrc_consumer_groups;
-- 查看用户所属的资源使用者组
SELECT username, initial_rsrc_consumer_group FROM dba_users;
-- 查看当前会话的资源使用者组
SELECT sid, serial#, username, resource_consumer_group
FROM v$session
WHERE username IS NOT NULL;查看资源计划
sql
-- 查看所有资源计划
SELECT plan, comment$ FROM dba_rsrc_plans;
-- 查看资源计划指令的详细配置
SELECT plan, group_or_subplan,
cpu_p1, cpu_p2, cpu_p3, cpu_p4,
parallel_degree_limit_p1,
active_sessions_limit,
parallel_server_limit,
pga_aggregate_limit_p1
FROM dba_rsrc_plan_directives
WHERE plan = 'PROD_PLAN';
-- 查看当前激活的资源计划
SELECT name, is_top_plan FROM v$rsrc_plan;监控资源使用情况
实时监控
sql
-- 查看资源使用者组的实时资源使用情况
SELECT consumer_group_name,
cpu_consumed_time/100 AS cpu_consumed_sec,
cpu_wait_time/100 AS cpu_wait_sec,
active_sessions,
queue_length
FROM v$rsrc_consumer_group_stats;
-- 查看会话的资源使用情况
SELECT s.sid, s.serial#, s.username, s.resource_consumer_group,
r.cpu_consumed_time/100 AS cpu_consumed_sec,
r.cpu_wait_time/100 AS cpu_wait_sec,
s.status
FROM v$session s, v$rsrc_session_info r
WHERE s.sid = r.sid
AND s.username IS NOT NULL
ORDER BY r.cpu_consumed_time DESC;历史监控
使用AWR报告可以查看资源管理器的历史使用情况:
sql
-- 生成AWR报告
@$ORACLE_HOME/rdbms/admin/awrrpt.sql在AWR报告中,查看以下部分:
- Resource Manager Statistics:资源管理器统计信息
- Top Consumer Groups by CPU Usage:按CPU使用率排序的顶级使用者组
- Top Consumer Groups by Wait Time:按等待时间排序的顶级使用者组
资源管理器优化
CPU资源优化
动态调整CPU分配
根据业务负载的变化,可以动态调整资源使用者组的CPU分配比例。
sql
-- 动态调整OLTP组的CPU分配比例
BEGIN
dbms_resource_manager.update_plan_directive(
plan => 'PROD_PLAN',
group_or_subplan => 'OLTP_GROUP',
new_cpu_p1 => 50, -- 将OLTP组的CPU分配从40%调整为50%
new_cpu_p2 => 0,
new_cpu_p3 => 0,
new_cpu_p4 => 0);
END;
/使用多级CPU调度
利用CPU_P1到CPU_P8参数实现多级CPU调度,确保关键业务在高优先级队列中获得足够的CPU资源。
并行度优化
根据业务类型调整并行度限制,防止并行查询占用过多的系统资源。
sql
-- 调整DWH组的并行度限制
BEGIN
dbms_resource_manager.update_plan_directive(
plan => 'PROD_PLAN',
group_or_subplan => 'DWH_GROUP',
new_parallel_degree_limit_p1 => 20); -- 将并行度从16调整为20
END;
/I/O资源优化
Oracle 11g及以上版本支持I/O资源管理,可以限制资源使用者组的I/O带宽和I/O服务时间。
sql
-- 为资源使用者组分配I/O资源
BEGIN
-- 为OLTP组设置I/O限制
dbms_resource_manager.update_plan_directive(
plan => 'PROD_PLAN',
group_or_subplan => 'OLTP_GROUP',
new_io_megabytes_per_second_limit => 200, -- I/O带宽限制(MB/s)
new_io_service_time_limit => 30); -- I/O服务时间限制(毫秒)
-- 为DWH组设置I/O限制
dbms_resource_manager.update_plan_directive(
plan => 'PROD_PLAN',
group_or_subplan => 'DWH_GROUP',
new_io_megabytes_per_second_limit => 500, -- I/O带宽限制(MB/s)
new_io_service_time_limit => 100); -- I/O服务时间限制(毫秒)
END;
/内存资源优化
通过限制PGA使用,可以防止某个资源使用者组占用过多的内存资源。
sql
-- 调整OLTP组的PGA限制
BEGIN
dbms_resource_manager.update_plan_directive(
plan => 'PROD_PLAN',
group_or_subplan => 'OLTP_GROUP',
new_pga_aggregate_limit_p1 => 3000000000); -- 将PGA限制从2GB调整为3GB
END;
/Oracle 19c vs 21c 资源管理器差异
核心差异对比
| 特性 | Oracle 19c | Oracle 21c |
|---|---|---|
| 资源管理功能 | 支持CPU、内存、I/O和并行度管理 | 增强了资源管理功能,支持更多的资源类型和更细粒度的控制 |
| 自动资源管理 | 支持基本的自动资源管理 | 优化了自动资源管理算法,引入了自适应资源管理,能够根据实际负载自动调整资源分配 |
| 资源监控 | 基础监控视图和指标 | 新增了V$RSRC_CONSUMER_GROUP_STATS_HISTORY视图,提供资源使用的历史统计信息;增强了V$RSRC_SESSION_INFO视图,提供更详细的会话资源信息 |
| 资源计划模板 | 提供有限的预定义模板 | 提供了更多的预定义资源计划模板,包括针对混合工作负载、数据仓库和云环境的模板 |
| I/O资源管理 | 支持I/O带宽和I/O服务时间限制 | 增强了I/O资源管理,支持按文件类型和表空间进行I/O控制 |
| 内存资源管理 | 支持PGA聚合限制 | 增强了内存资源管理,支持SGA和PGA的更细粒度控制 |
| 资源分配算法 | 基于优先级的分配算法 | 优化了资源分配算法,引入了更智能的资源调度机制,提高了资源利用率 |
| 并行度管理 | 支持并行度限制 | 增强了并行度管理,支持按查询类型和用户设置不同的并行度限制 |
| 会话资源管理 | 支持活跃会话限制 | 增强了会话资源管理,支持按会话类型和应用程序设置不同的会话限制 |
Oracle 21c 新特性
自适应资源管理
Oracle 21c引入了自适应资源管理功能,能够根据实际负载自动调整资源分配,提高资源利用率和系统性能。
sql
-- Oracle 21c新特性:创建自适应资源计划
BEGIN
dbms_resource_manager.create_plan(
plan => 'ADAPTIVE_PROD_PLAN',
comment => 'Adaptive production database resource plan',
is_top_plan => TRUE,
mgmt_method => 'ADAPTIVE'); -- 使用自适应管理方法
END;
/增强的I/O资源管理
Oracle 21c增强了I/O资源管理,支持按文件类型和表空间进行I/O控制。
sql
-- Oracle 21c新特性:按表空间设置I/O限制
BEGIN
dbms_resource_manager.create_plan_directive(
plan => 'PROD_PLAN',
group_or_subplan => 'DWH_GROUP',
comment => 'DWH I/O directive with tablespace limit',
cpu_p1 => 30,
io_tablespace => 'DWH_TABLESPACE', -- 针对特定表空间
io_megabytes_per_second_limit => 300);
END;
/增强的并行度管理
Oracle 21c增强了并行度管理,支持更灵活的并行度设置。
sql
-- Oracle 21c新特性:设置并行度限制范围
BEGIN
dbms_resource_manager.create_plan_directive(
plan => 'PROD_PLAN',
group_or_subplan => 'DWH_GROUP',
comment => 'DWH directive with parallel degree range',
cpu_p1 => 30,
parallel_degree_limit_min => 4, -- 最小并行度
parallel_degree_limit_max => 20); -- 最大并行度
END;
/常见问题(FAQ)
如何确定资源使用者组的CPU分配比例?
确定资源使用者组CPU分配比例的方法:
- 分析业务优先级:关键业务分配更高的CPU比例
- 监控历史负载:使用AWR报告分析不同业务类型的历史CPU使用情况
- 考虑峰值负载:根据业务的峰值负载调整CPU分配比例
- 进行压力测试:在压力测试环境中验证CPU分配比例的合理性
- 预留缓冲空间:不要将所有CPU资源都分配出去,预留10-20%的缓冲空间
- 持续优化:根据业务变化和系统负载持续调整CPU分配比例
如何处理资源使用者组之间的资源争用?
处理资源使用者组之间资源争用的方法:
- 调整资源分配比例:增加关键业务的资源分配比例
- 使用多级CPU调度:为关键业务分配更高的优先级
- 限制活跃会话数量:防止某个组占用过多的会话资源
- 限制并行度:防止并行查询占用过多的系统资源
- 调整I/O资源分配:根据业务需求分配I/O资源
- 使用资源限制:设置CPU使用时间限制和I/O服务时间限制
如何将用户分配到资源使用者组?
将用户分配到资源使用者组的方法:
- 使用映射规则:通过
DBMS_RESOURCE_MANAGER.SET_CONSUMER_GROUP_MAPPING函数创建映射规则 - 直接设置用户属性:使用
ALTER USER命令设置用户的初始资源使用者组sqlALTER USER oltp_user INITIAL_RSRC_CONSUMER_GROUP = 'OLTP_GROUP'; - 动态切换:使用
DBMS_RESOURCE_MANAGER.SWITCH_CONSUMER_GROUP_FOR_USER函数动态切换用户的资源使用者组 - 基于服务名称:根据连接的服务名称自动分配资源使用者组
- 基于模块名称:根据应用程序设置的模块名称自动分配资源使用者组
如何禁用资源管理器?
禁用资源管理器的步骤:
取消激活资源计划:
sqlALTER SYSTEM SET resource_manager_plan = '' SCOPE=BOTH;验证资源计划已禁用:
sqlSHOW PARAMETER resource_manager_plan;如果需要,可以删除资源计划和资源使用者组:
sql-- 删除资源计划 BEGIN dbms_resource_manager.delete_plan(plan => 'PROD_PLAN'); END; / -- 删除资源使用者组 BEGIN dbms_resource_manager.delete_consumer_group(consumer_group => 'OLTP_GROUP'); dbms_resource_manager.delete_consumer_group(consumer_group => 'DWH_GROUP'); dbms_resource_manager.delete_consumer_group(consumer_group => 'REPORTING_GROUP'); END; /
资源管理器对系统性能有什么影响?
资源管理器对系统性能的影响:
正面影响:
- 确保关键业务获得足够的资源
- 防止某个业务占用过多的系统资源
- 提高系统的整体吞吐量和响应速度
- 便于管理和监控系统资源
- 减少资源争用,提高系统稳定性
负面影响:
- 可能会增加系统的开销(通常很小,在可接受范围内)
- 配置不当可能会导致资源分配不合理,影响系统性能
- 可能会影响某些查询的性能,特别是当资源限制过于严格时
如何备份和恢复资源管理器配置?
备份和恢复资源管理器配置的方法:
使用DBMS_RESOURCE_MANAGER.EXPORT_PLAN和IMPORT_PLAN函数:
sql-- 备份资源管理器配置 EXECUTE dbms_resource_manager.export_plan(plan => 'PROD_PLAN', filename => 'prod_plan.dmp', directory => 'DATA_PUMP_DIR'); -- 恢复资源管理器配置 EXECUTE dbms_resource_manager.import_plan(plan => 'PROD_PLAN', filename => 'prod_plan.dmp', directory => 'DATA_PUMP_DIR');使用数据泵导出和导入整个数据库:
- 数据泵导出会包含资源管理器配置
- 可以使用
EXPDP和IMPDP命令进行备份和恢复
手动备份:
- 可以将创建资源计划和资源使用者组的SQL脚本保存下来,作为备份
- 在需要恢复时,执行这些SQL脚本即可
如何在RAC环境中使用资源管理器?
在RAC环境中使用资源管理器的方法:
- 全局资源计划:在RAC环境中,资源计划是全局的,会应用到所有节点
- 节点级资源管理:可以使用
DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE函数的node_list参数,为不同节点设置不同的资源分配 - 服务级资源管理:结合Oracle RAC服务,为不同的服务设置不同的资源分配
- 监控所有节点:使用
GV$RSRC_CONSUMER_GROUP_STATS和GV$RSRC_SESSION_INFO视图监控所有节点的资源使用情况
如何处理资源管理器相关的错误?
常见的资源管理器错误及处理方法:
ORA-29371:资源计划未验证:
- 处理方法:使用
DBMS_RESOURCE_MANAGER.VALIDATE_PLAN函数验证资源计划,修复验证过程中发现的问题
- 处理方法:使用
ORA-29372:资源使用者组不存在:
- 处理方法:确保资源使用者组已创建,或检查资源映射规则中的资源使用者组名称是否正确
ORA-29373:资源计划指令冲突:
- 处理方法:检查资源计划指令的配置,确保没有冲突的资源分配
ORA-29374:资源计划已激活:
- 处理方法:在修改资源计划之前,先禁用资源计划
最佳实践
设计资源计划
- 根据业务优先级设计:将业务按照优先级分为不同的资源使用者组,为高优先级业务分配更多的资源
- 使用多级CPU调度:利用CPU_P1到CPU_P8参数实现多级CPU调度,确保关键业务获得足够的CPU资源
- 预留缓冲资源:不要将所有资源都分配出去,预留10-20%的缓冲资源,用于处理突发负载
- 考虑峰值负载:根据业务的峰值负载设计资源计划,确保在峰值负载下系统仍能稳定运行
- 使用资源限制:合理设置活跃会话限制、并行度限制和PGA限制,防止资源耗尽
配置和管理
- 从小规模开始:先从简单的资源计划开始,逐步优化和扩展
- 测试和验证:在测试环境中验证资源计划的合理性和有效性,再应用到生产环境
- 定期监控:定期监控资源使用情况,及时调整资源分配比例
- 动态调整:根据业务负载的变化,动态调整资源分配比例
- 备份配置:定期备份资源管理器配置,防止配置丢失
监控和优化
- 使用AWR报告:定期生成AWR报告,分析资源使用情况和性能趋势
- 监控等待事件:监控与资源管理相关的等待事件,如
resmgr:cpu quantum和resmgr:cpu wait - 分析资源争用:分析不同资源使用者组之间的资源争用情况,及时调整资源分配
- 优化SQL语句:优化消耗资源较多的SQL语句,减少资源使用
- 持续优化:根据业务变化和系统负载持续优化资源计划
安全性
- 遵循最小权限原则:只授予必要的用户管理资源管理器的权限
- 限制资源管理器管理员:限制能够管理资源管理器的用户数量
- 审计资源管理器操作:启用审计,记录资源管理器的配置和变更操作
- 保护资源管理器配置:定期备份资源管理器配置,防止配置被恶意修改
总结
Oracle资源管理器是一个强大的工具,可以帮助DBA有效地管理和分配系统资源,确保关键业务获得足够的资源,提高系统的整体性能和稳定性。通过合理配置资源使用者组、资源计划和资源计划指令,可以实现对CPU、内存、I/O和并行度等资源的精细管理。
在实际生产环境中,需要根据业务需求和系统负载,设计和优化资源计划,持续监控资源使用情况,确保资源管理器的有效运行。Oracle 21c增强了资源管理器的功能和性能,提供了更好的监控和管理能力,包括自适应资源管理、增强的I/O资源管理和并行度管理等新特性。
通过遵循最佳实践,DBA可以确保Oracle资源管理器的有效使用,为业务提供可靠的数据库服务,提高系统的整体性能和稳定性。
