本文档风哥主要介绍Oracle数据库消费者组相关知识,包括消费者组的概念、架构、优势、规划、创建、分配、监控、优化等内容,由风哥教程参考Oracle官方文档Performance内容编写,适合DBA人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。
Part01-基础概念与理论知识
1.1 消费者组的概念
Oracle数据库消费者组(Consumer Group)是资源管理器(Resource Manager)中的一个核心概念,用于对数据库用户或应用的资源使用进行分类和管理。消费者组可以根据业务需求和优先级,为不同的用户或应用分配不同的系统资源,如CPU、内存、I/O等。更多视频教程www.fgedu.net.cn
- 用于对数据库用户或应用的资源使用进行分类
- 可以为不同的消费者组分配不同的资源配额
- 可以设置资源限制和优先级
- 可以监控和管理不同消费者组的资源使用情况
- 是资源管理器的基本管理单位
1.2 消费者组的架构
Oracle数据库消费者组的架构包括以下组件:
- 资源计划(Resource Plan):定义资源分配策略,包含多个资源计划指令
- 资源计划指令(Resource Plan Directive):为每个消费者组分配资源配额
- 消费者组(Consumer Group):用户或会话的集合,共享相同的资源分配
- 会话(Session):被分配到特定的消费者组
- 资源管理器(Resource Manager):执行资源分配策略
1.3 消费者组的优势
Oracle数据库消费者组的优势:
- 资源隔离:不同消费者组之间的资源使用相互隔离
- 资源优先级:可以为关键业务设置更高的资源优先级
- 资源限制:可以限制非关键业务的资源使用
- 资源监控:可以监控不同消费者组的资源使用情况
- 性能优化:通过合理的资源分配提高整体性能
- 公平性:确保资源在不同业务之间的公平分配
Part02-生产环境规划与建议
2.1 消费者组规划
Oracle数据库消费者组规划要点:
1. 分析业务需求和优先级
2. 识别关键业务和非关键业务
3. 确定资源分配策略
4. 设计消费者组结构
5. 制定资源计划
6. 实施和测试
7. 监控和优化
# 消费者组分类建议
– 关键业务消费者组:高优先级,分配更多资源
– 普通业务消费者组:中等优先级,分配适量资源
– 批处理消费者组:低优先级,分配较少资源
– 系统消费者组:系统内部使用
– 空闲消费者组:默认消费者组
2.2 消费者组设计
Oracle数据库消费者组设计建议:
– 基于业务优先级设计
– 基于资源需求设计
– 基于时间特性设计(如批处理vs实时)
– 基于用户类型设计
– 保持消费者组数量合理(建议不超过10个)
# 消费者组命名规范
– 清晰反映业务类型
– 遵循统一命名规则
– 便于管理和监控
# 示例消费者组结构
– OLTP_GROUP:在线交易处理
– BATCH_GROUP:批处理作业
– REPORT_GROUP:报表查询
– ADMIN_GROUP:管理员操作
– DEFAULT_GROUP:默认消费者组
2.3 消费者组最佳实践
Oracle数据库消费者组最佳实践:
- 合理设置资源分配:根据业务优先级分配资源
- 设置资源限制:防止单个消费者组占用过多资源
- 定期监控:监控消费者组的资源使用情况
- 动态调整:根据业务需求动态调整资源分配
- 测试验证:在实施前进行充分测试
- 文档化:记录消费者组的设计和配置
Part03-生产环境项目实施方案
3.1 消费者组创建
3.1.1 创建消费者组
SQL> BEGIN
DBMS_RESOURCE_MANAGER.CREATE_CONSUMER_GROUP(
consumer_group => ‘OLTP_GROUP’,
comment => ‘在线交易处理消费者组’);
DBMS_RESOURCE_MANAGER.CREATE_CONSUMER_GROUP(
consumer_group => ‘BATCH_GROUP’,
comment => ‘批处理作业消费者组’);
DBMS_RESOURCE_MANAGER.CREATE_CONSUMER_GROUP(
consumer_group => ‘REPORT_GROUP’,
comment => ‘报表查询消费者组’);
END;
/
# 验证消费者组创建
SQL> SELECT consumer_group, comments
FROM dba_rsrc_consumer_groups
WHERE consumer_group IN (‘OLTP_GROUP’, ‘BATCH_GROUP’, ‘REPORT_GROUP’);
CONSUMER_GROUP COMMENTS
——————– ——————————
OLTP_GROUP 在线交易处理消费者组
BATCH_GROUP 批处理作业消费者组
REPORT_GROUP 报表查询消费者组
3.1.2 创建资源计划
SQL> BEGIN
DBMS_RESOURCE_MANAGER.CREATE_PLAN(
plan => ‘FGEDU_PLAN’,
comment => ‘风哥教育资源计划’);
— 为OLTP_GROUP分配40%CPU
DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE(
plan => ‘FGEDU_PLAN’,
group_or_subplan => ‘OLTP_GROUP’,
comment => ‘OLTP消费者组’,
mgmt_p1 => 40, — 40% CPU at level 1
mgmt_p2 => 30, — 30% CPU at level 2
utilization_limit => 80); — 最大使用80%
— 为BATCH_GROUP分配30%CPU
DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE(
plan => ‘FGEDU_PLAN’,
group_or_subplan => ‘BATCH_GROUP’,
comment => ‘批处理消费者组’,
mgmt_p1 => 30, — 30% CPU at level 1
mgmt_p2 => 40, — 40% CPU at level 2
utilization_limit => 60); — 最大使用60%
— 为REPORT_GROUP分配20%CPU
DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE(
plan => ‘FGEDU_PLAN’,
group_or_subplan => ‘REPORT_GROUP’,
comment => ‘报表查询消费者组’,
mgmt_p1 => 20, — 20% CPU at level 1
mgmt_p2 => 20, — 20% CPU at level 2
utilization_limit => 50); — 最大使用50%
— 为OTHER_GROUPS分配10%CPU
DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE(
plan => ‘FGEDU_PLAN’,
group_or_subplan => ‘OTHER_GROUPS’,
comment => ‘其他消费者组’,
mgmt_p1 => 10, — 10% CPU at level 1
mgmt_p2 => 10, — 10% CPU at level 2
utilization_limit => 30); — 最大使用30%
END;
/
# 验证资源计划创建
SQL> SELECT plan, group_or_subplan, mgmt_p1, mgmt_p2, utilization_limit
FROM dba_rsrc_plan_directives
WHERE plan = ‘FGEDU_PLAN’;
PLAN GROUP_OR_SUBPLAN MGMT_P1 MGMT_P2 UTILIZATION_LIMIT
————- ——————– ———- ———- —————-
FGEDU_PLAN OLTP_GROUP 40 30 80
FGEDU_PLAN BATCH_GROUP 30 40 60
FGEDU_PLAN REPORT_GROUP 20 20 50
FGEDU_PLAN OTHER_GROUPS 10 10 30
3.2 消费者组分配
3.2.1 为用户分配消费者组
SQL> BEGIN
DBMS_RESOURCE_MANAGER_PRIVS.GRANT_SWITCH_CONSUMER_GROUP(
grantee_name => ‘FGEDU’,
consumer_group => ‘OLTP_GROUP’,
grant_option => FALSE);
DBMS_RESOURCE_MANAGER.SET_INITIAL_CONSUMER_GROUP(
user => ‘FGEDU’,
consumer_group => ‘OLTP_GROUP’);
END;
/
# 验证用户消费者组分配
SQL> SELECT username, initial_rsrc_consumer_group
FROM dba_users
WHERE username = ‘FGEDU’;
USERNAME INITIAL_RSRC_CONSUMER_GROUP
———- ——————————
FGEDU OLTP_GROUP
# 为会话切换消费者组
SQL> EXEC DBMS_SESSION.SWITCH_CURRENT_CONSUMER_GROUP(‘BATCH_GROUP’, TRUE);
PL/SQL procedure successfully completed.
# 验证当前会话消费者组
SQL> SELECT SYS_CONTEXT(‘USERENV’, ‘CURRENT_CONSUMER_GROUP’)
FROM dual;
SYS_CONTEXT(‘USERENV’,’CURRENT_CONSUMER_GROUP’)
————————————————
BATCH_GROUP
3.3 消费者组监控
3.3.1 监控消费者组资源使用情况
SQL> ALTER SYSTEM SET resource_manager_plan = ‘FGEDU_PLAN’ SCOPE=BOTH;
System altered.
# 监控消费者组CPU使用情况
SQL> SELECT
consumer_group_name,
cpu_wait_time,
cpu_used_time,
current_utilization,
max_utilization
FROM v$rsrc_consumer_group
WHERE consumer_group_name IN (‘OLTP_GROUP’, ‘BATCH_GROUP’, ‘REPORT_GROUP’);
CONSUMER_GROUP_NAME CPU_WAIT_TIME CPU_USED_TIME CURRENT_UTILIZATION MAX_UTILIZATION
———————— ————- ————- ——————- —————
OLTP_GROUP 1000 5000 45 75
BATCH_GROUP 2000 3000 30 55
REPORT_GROUP 1500 2000 20 45
# 监控消费者组会话数
SQL> SELECT
consumer_group_name,
count(*) session_count
FROM v$session
GROUP BY consumer_group_name;
CONSUMER_GROUP_NAME SESSION_COUNT
———————— ————-
OLTP_GROUP 10
BATCH_GROUP 5
REPORT_GROUP 3
OTHER_GROUPS 2
# 监控消费者组等待事件
SQL> SELECT
c.consumer_group_name,
e.event,
count(*)
FROM v$session s,
v$rsrc_consumer_group c,
v$session_wait e
WHERE s.resource_consumer_group_id = c.id
AND s.sid = e.sid
GROUP BY c.consumer_group_name, e.event
ORDER BY c.consumer_group_name, count(*) DESC;
CONSUMER_GROUP_NAME EVENT COUNT(*)
———————— —————————— ———-
OLTP_GROUP db file sequential read 3
OLTP_GROUP log file sync 2
BATCH_GROUP direct path read 2
REPORT_GROUP db file scattered read 1
Part04-生产案例与实战讲解
4.1 消费者组管理案例
在某电商网站的生产环境中,需要为不同类型的业务设置消费者组,以确保关键业务的性能。
– 电商网站有在线交易、批处理作业和报表查询三种主要业务
– 在线交易需要高优先级,确保响应速度
– 批处理作业可以在低峰期运行
– 报表查询需要一定资源,但优先级较低
# 实施方案
1. 创建消费者组
SQL> BEGIN
DBMS_RESOURCE_MANAGER.CREATE_CONSUMER_GROUP(‘ECOMMERCE_GROUP’, ‘电商交易消费者组’);
DBMS_RESOURCE_MANAGER.CREATE_CONSUMER_GROUP(‘BATCH_GROUP’, ‘批处理消费者组’);
DBMS_RESOURCE_MANAGER.CREATE_CONSUMER_GROUP(‘REPORT_GROUP’, ‘报表查询消费者组’);
END;
/
2. 创建资源计划
SQL> BEGIN
DBMS_RESOURCE_MANAGER.CREATE_PLAN(‘ECOMMERCE_PLAN’, ‘电商资源计划’);
DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE(
plan => ‘ECOMMERCE_PLAN’,
group_or_subplan => ‘ECOMMERCE_GROUP’,
comment => ‘电商交易’,
mgmt_p1 => 50, — 50% CPU
utilization_limit => 90);
DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE(
plan => ‘ECOMMERCE_PLAN’,
group_or_subplan => ‘BATCH_GROUP’,
comment => ‘批处理’,
mgmt_p1 => 30, — 30% CPU
utilization_limit => 60);
DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE(
plan => ‘ECOMMERCE_PLAN’,
group_or_subplan => ‘REPORT_GROUP’,
comment => ‘报表查询’,
mgmt_p1 => 15, — 15% CPU
utilization_limit => 50);
DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE(
plan => ‘ECOMMERCE_PLAN’,
group_or_subplan => ‘OTHER_GROUPS’,
comment => ‘其他’,
mgmt_p1 => 5, — 5% CPU
utilization_limit => 30);
END;
/
3. 分配用户到消费者组
SQL> BEGIN
— 电商交易用户
DBMS_RESOURCE_MANAGER_PRIVS.GRANT_SWITCH_CONSUMER_GROUP(‘ECOMM_USER’, ‘ECOMMERCE_GROUP’, FALSE);
DBMS_RESOURCE_MANAGER.SET_INITIAL_CONSUMER_GROUP(‘ECOMM_USER’, ‘ECOMMERCE_GROUP’);
— 批处理用户
DBMS_RESOURCE_MANAGER_PRIVS.GRANT_SWITCH_CONSUMER_GROUP(‘BATCH_USER’, ‘BATCH_GROUP’, FALSE);
DBMS_RESOURCE_MANAGER.SET_INITIAL_CONSUMER_GROUP(‘BATCH_USER’, ‘BATCH_GROUP’);
— 报表用户
DBMS_RESOURCE_MANAGER_PRIVS.GRANT_SWITCH_CONSUMER_GROUP(‘REPORT_USER’, ‘REPORT_GROUP’, FALSE);
DBMS_RESOURCE_MANAGER.SET_INITIAL_CONSUMER_GROUP(‘REPORT_USER’, ‘REPORT_GROUP’);
END;
/
4. 启用资源计划
SQL> ALTER SYSTEM SET resource_manager_plan = ‘ECOMMERCE_PLAN’ SCOPE=BOTH;
5. 监控效果
SQL> SELECT
consumer_group_name,
cpu_used_time,
current_utilization
FROM v$rsrc_consumer_group
WHERE consumer_group_name IN (‘ECOMMERCE_GROUP’, ‘BATCH_GROUP’, ‘REPORT_GROUP’);
CONSUMER_GROUP_NAME CPU_USED_TIME CURRENT_UTILIZATION
———————— ————- ——————-
ECOMMERCE_GROUP 120000 48
BATCH_GROUP 60000 28
REPORT_GROUP 30000 15
# 实施效果
– 电商交易响应时间明显改善
– 批处理作业在低峰期正常运行
– 报表查询不影响核心业务
– 整体系统资源利用率提高
4.2 消费者组优化案例
在某金融机构的生产环境中,需要优化消费者组配置,提高系统性能。
– 金融机构有核心交易、批量处理和分析查询三种业务
– 核心交易响应时间变长
– 批量处理影响核心交易
– 分析查询占用过多资源
# 优化方案
1. 分析当前消费者组配置
SQL> SELECT plan, group_or_subplan, mgmt_p1, utilization_limit
FROM dba_rsrc_plan_directives
WHERE plan = ‘FINANCE_PLAN’;
PLAN GROUP_OR_SUBPLAN MGMT_P1 UTILIZATION_LIMIT
————- ——————– ———- —————-
FINANCE_PLAN CORE_GROUP 30 80
FINANCE_PLAN BATCH_GROUP 40 70
FINANCE_PLAN ANALYZE_GROUP 20 60
FINANCE_PLAN OTHER_GROUPS 10 30
2. 调整消费者组配置
SQL> BEGIN
— 删除旧的资源计划指令
DBMS_RESOURCE_MANAGER.DELETE_PLAN_DIRECTIVE(‘FINANCE_PLAN’, ‘CORE_GROUP’);
DBMS_RESOURCE_MANAGER.DELETE_PLAN_DIRECTIVE(‘FINANCE_PLAN’, ‘BATCH_GROUP’);
DBMS_RESOURCE_MANAGER.DELETE_PLAN_DIRECTIVE(‘FINANCE_PLAN’, ‘ANALYZE_GROUP’);
DBMS_RESOURCE_MANAGER.DELETE_PLAN_DIRECTIVE(‘FINANCE_PLAN’, ‘OTHER_GROUPS’);
— 创建新的资源计划指令
DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE(
plan => ‘FINANCE_PLAN’,
group_or_subplan => ‘CORE_GROUP’,
comment => ‘核心交易’,
mgmt_p1 => 50, — 提高到50% CPU
utilization_limit => 90);
DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE(
plan => ‘FINANCE_PLAN’,
group_or_subplan => ‘BATCH_GROUP’,
comment => ‘批量处理’,
mgmt_p1 => 25, — 降低到25% CPU
utilization_limit => 60);
DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE(
plan => ‘FINANCE_PLAN’,
group_or_subplan => ‘ANALYZE_GROUP’,
comment => ‘分析查询’,
mgmt_p1 => 20, — 保持20% CPU
utilization_limit => 50);
DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE(
plan => ‘FINANCE_PLAN’,
group_or_subplan => ‘OTHER_GROUPS’,
comment => ‘其他’,
mgmt_p1 => 5, — 保持5% CPU
utilization_limit => 30);
END;
/
3. 实施时间控制
SQL> BEGIN
DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE(
plan => ‘FINANCE_PLAN’,
group_or_subplan => ‘BATCH_GROUP’,
comment => ‘批量处理(非高峰期)’,
mgmt_p1 => 40, — 非高峰期提高到40% CPU
utilization_limit => 80,
start_time => ’22:00′,
end_time => ’06:00′,
days_of_week => ‘1,2,3,4,5,6,7’);
END;
/
4. 验证优化效果
SQL> SELECT
consumer_group_name,
cpu_used_time,
current_utilization
FROM v$rsrc_consumer_group
WHERE consumer_group_name IN (‘CORE_GROUP’, ‘BATCH_GROUP’, ‘ANALYZE_GROUP’);
CONSUMER_GROUP_NAME CPU_USED_TIME CURRENT_UTILIZATION
———————— ————- ——————-
CORE_GROUP 85000 49
BATCH_GROUP 45000 26
ANALYZE_GROUP 35000 19
# 优化效果
– 核心交易响应时间改善30%
– 批量处理在非高峰期正常运行
– 分析查询资源使用得到控制
– 系统整体性能提升20%
4.3 消费者组问题处理
在某企业的生产环境中,消费者组配置出现问题,导致系统性能下降。
– 系统响应缓慢
– 核心业务无法正常运行
– 消费者组资源分配不合理
# 分析步骤
1. 检查当前资源计划
SQL> SHOW PARAMETER resource_manager_plan;
NAME TYPE VALUE
———————————— ———– ——————————
resource_manager_plan string ENTERPRISE_PLAN
2. 检查消费者组资源使用情况
SQL> SELECT
consumer_group_name,
cpu_wait_time,
cpu_used_time,
current_utilization,
max_utilization
FROM v$rsrc_consumer_group
ORDER BY cpu_wait_time DESC;
CONSUMER_GROUP_NAME CPU_WAIT_TIME CPU_USED_TIME CURRENT_UTILIZATION MAX_UTILIZATION
———————— ————- ————- ——————- —————
OLTP_GROUP 150000 80000 30 45
BATCH_GROUP 50000 120000 60 85
REPORT_GROUP 30000 40000 20 35
3. 检查资源计划指令
SQL> SELECT plan, group_or_subplan, mgmt_p1, utilization_limit
FROM dba_rsrc_plan_directives
WHERE plan = ‘ENTERPRISE_PLAN’;
PLAN GROUP_OR_SUBPLAN MGMT_P1 UTILIZATION_LIMIT
————- ——————– ———- —————-
ENTERPRISE_PLAN OLTP_GROUP 30 60
ENTERPRISE_PLAN BATCH_GROUP 50 90
ENTERPRISE_PLAN REPORT_GROUP 15 50
ENTERPRISE_PLAN OTHER_GROUPS 5 30
# 问题原因
– 批处理消费者组分配了50%的CPU资源,且最大使用限制为90%
– 核心交易消费者组只分配了30%的CPU资源
– 批处理作业占用了过多资源,导致核心交易等待
# 解决方案
1. 调整资源计划指令
SQL> BEGIN
DBMS_RESOURCE_MANAGER.DELETE_PLAN_DIRECTIVE(‘ENTERPRISE_PLAN’, ‘OLTP_GROUP’);
DBMS_RESOURCE_MANAGER.DELETE_PLAN_DIRECTIVE(‘ENTERPRISE_PLAN’, ‘BATCH_GROUP’);
DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE(
plan => ‘ENTERPRISE_PLAN’,
group_or_subplan => ‘OLTP_GROUP’,
comment => ‘核心交易’,
mgmt_p1 => 50, — 提高到50% CPU
utilization_limit => 80);
DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE(
plan => ‘ENTERPRISE_PLAN’,
group_or_subplan => ‘BATCH_GROUP’,
comment => ‘批处理’,
mgmt_p1 => 30, — 降低到30% CPU
utilization_limit => 60);
END;
/
2. 验证解决方案
SQL> SELECT
consumer_group_name,
cpu_wait_time,
cpu_used_time,
current_utilization
FROM v$rsrc_consumer_group
WHERE consumer_group_name IN (‘OLTP_GROUP’, ‘BATCH_GROUP’);
CONSUMER_GROUP_NAME CPU_WAIT_TIME CPU_USED_TIME CURRENT_UTILIZATION
———————— ————- ————- ——————-
OLTP_GROUP 20000 100000 50 75
BATCH_GROUP 30000 60000 30 55
# 解决效果
– 核心交易响应时间恢复正常
– 批处理作业在合理范围内运行
– 系统整体性能得到改善
Part05-风哥经验总结与分享
5.1 消费者组管理经验
Oracle数据库消费者组管理经验:
- 合理规划:基于业务需求和优先级规划消费者组
- 资源分配:为核心业务分配足够的资源
- 资源限制:为非核心业务设置合理的资源限制
- 监控优化:定期监控和优化消费者组配置
- 动态调整:根据业务负载动态调整资源分配
- 测试验证:在实施前进行充分测试
- 文档化:记录消费者组的设计和配置
5.2 消费者组检查清单
– [ ] 消费者组规划是否基于业务需求
– [ ] 核心业务是否分配了足够的资源
– [ ] 非核心业务是否设置了合理的资源限制
– [ ] 消费者组数量是否合理(建议不超过10个)
– [ ] 资源计划是否启用并正常运行
– [ ] 消费者组分配是否正确
– [ ] 定期监控消费者组资源使用情况
– [ ] 根据业务变化调整消费者组配置
– [ ] 记录消费者组的设计和配置
– [ ] 定期测试消费者组配置效果
# 消费者组问题处理流程
1. 发现消费者组问题
2. 收集消费者组资源使用数据
3. 分析问题原因
4. 制定调整方案
5. 实施调整方案
6. 验证调整效果
7. 总结经验,优化配置
5.3 消费者组管理工具
Oracle数据库消费者组管理常用工具:
- DBMS_RESOURCE_MANAGER:创建和管理消费者组
- DBMS_RESOURCE_MANAGER_PRIVS:管理消费者组权限
- DBMS_SESSION:切换消费者组
- v$rsrc_consumer_group:监控消费者组资源使用
- v$session:查看会话所属消费者组
- dba_rsrc_consumer_groups:查看消费者组信息
- dba_rsrc_plan_directives:查看资源计划指令
- Oracle Enterprise Manager:图形化消费者组管理
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
