Oracle运维核心技能:统计信息与资源管理实践
Oracle运维实践:从统计信息到资源管理的核心技能
1. 统计信息收集与DBMS_STATS包
统计信息是Oracle优化器生成执行计划的基础,准确的统计信息对SQL性能至关重要。
1.1 DBMS_STATS基础用法
-- 收集单个表的统计信息
BEGIN
DBMS_STATS.GATHER_TABLE_STATS(
ownname => 'SCOTT',
tabname => 'EMP',
estimate_percent => 100,
method_opt => 'FOR ALL COLUMNS SIZE AUTO',
cascade => TRUE
);
END;
/
-- 收集整个schema的统计信息
BEGIN
DBMS_STATS.GATHER_SCHEMA_STATS(
ownname => 'SCOTT',
estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE,
options => 'GATHER AUTO'
);
END;
/
1.2 关键参数解析
参数 | 说明 | 推荐值 |
---|---|---|
estimate_percent | 采样比例 | AUTO_SAMPLE_SIZE |
method_opt | 直方图收集策略 | 'FOR ALL COLUMNS SIZE AUTO' |
cascade | 是否收集索引统计 | TRUE |
degree | 并行度 | 根据CPU核心数调整 |
实践建议:
- 生产环境建议使用AUTO_SAMPLE_SIZE让Oracle自动决定采样比例
- 对于大型表,考虑在业务低峰期收集统计信息
- 定期检查
DBA_TAB_STATISTICS
视图确认统计信息时效性
2. AWR/ASH报告深度分析
2.1 报告生成方法
-- 生成AWR报告
@?/rdbms/admin/awrrpt.sql
-- 生成ASH报告
@?/rdbms/admin/ashrpt.sql
2.2 关键指标解读
核心指标:
- DB Time:数据库花费的总时间=CPU时间+等待时间
- Top 5 Timed Events:识别系统瓶颈
- SQL ordered by Elapsed Time:高耗时SQL
- Instance Efficiency Percentages:内存效率指标
实践建议:
- 当DB Time远大于实际时间时,说明系统存在严重等待
- 关注AWR报告开头的"Load Profile"了解系统负载变化
- 对比多个时段的AWR报告识别趋势性问题
3. 资源管理器(Resource Manager)
3.1 资源计划配置示例
BEGIN
DBMS_RESOURCE_MANAGER.CREATE_PENDING_AREA();
DBMS_RESOURCE_MANAGER.CREATE_PLAN(
plan => 'DAYTIME_PLAN',
comment => '日间业务资源计划');
DBMS_RESOURCE_MANAGER.CREATE_CONSUMER_GROUP(
consumer_group => 'OLTP_GROUP',
comment => 'OLTP业务组');
DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE(
plan => 'DAYTIME_PLAN',
group_or_subplan => 'OLTP_GROUP',
comment => 'OLTP组资源限制',
mgmt_p1 => 80,
parallel_degree_limit_p1 => 4);
DBMS_RESOURCE_MANAGER.VALIDATE_PENDING_AREA();
DBMS_RESOURCE_MANAGER.SUBMIT_PENDING_AREA();
END;
/
3.2 会话资源限制
-- 将用户会话分配到消费组
BEGIN
DBMS_RESOURCE_MANAGER_PRIVS.GRANT_SWITCH_CONSUMER_GROUP(
grantee_name => 'SCOTT',
consumer_group => 'OLTP_GROUP',
grant_option => FALSE);
END;
/
-- 设置初始消费组
ALTER SYSTEM SET RESOURCE_MANAGER_PLAN = 'DAYTIME_PLAN';
实践建议:
- 为关键业务分配更高的CPU优先级
- 限制报表查询的并行度,避免资源抢占
- 使用
V$RSRC_CONSUMER_GROUP
视图监控资源使用情况
4. DBMS_SCHEDULER高级调度
4.1 创建定时作业
BEGIN
DBMS_SCHEDULER.CREATE_JOB(
job_name => 'GATHER_STATS_JOB',
job_type => 'STORED_PROCEDURE',
job_action => 'DBMS_STATS.GATHER_SCHEMA_STATS',
number_of_arguments => 2,
start_date => SYSTIMESTAMP,
repeat_interval => 'FREQ=DAILY; BYHOUR=2',
enabled => FALSE);
DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE(
job_name => 'GATHER_STATS_JOB',
argument_position => 1,
argument_value => 'SCOTT');
DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE(
job_name => 'GATHER_STATS_JOB',
argument_position => 2,
argument_value => 'ESTIMATE_PERCENT=>DBMS_STATS.AUTO_SAMPLE_SIZE');
DBMS_SCHEDULER.ENABLE('GATHER_STATS_JOB');
END;
/
4.2 创建依赖任务链
-- 创建任务链
BEGIN
DBMS_SCHEDULER.CREATE_CHAIN(
chain_name => 'ETL_CHAIN',
rule_set_name => NULL,
evaluation_interval => NULL);
-- 定义链步骤
DBMS_SCHEDULER.DEFINE_CHAIN_STEP(
chain_name => 'ETL_CHAIN',
step_name => 'EXTRACT_STEP',
program_name => 'EXTRACT_DATA_PRG');
DBMS_SCHEDULER.DEFINE_CHAIN_STEP(
chain_name => 'ETL_CHAIN',
step_name => 'TRANSFORM_STEP',
program_name => 'TRANSFORM_DATA_PRG');
-- 定义步骤依赖
DBMS_SCHEDULER.DEFINE_CHAIN_RULE(
chain_name => 'ETL_CHAIN',
condition => ':EXTRACT_STEP COMPLETED',
action => 'START TRANSFORM_STEP',
rule_name => 'EXTRACT_TO_TRANSFORM');
-- 启用任务链
DBMS_SCHEDULER.ENABLE('ETL_CHAIN');
END;
/
实践建议:
- 复杂作业建议使用任务链管理依赖关系
- 通过
DBA_SCHEDULER_JOB_RUN_DETAILS
监控作业执行情况 - 为关键作业设置失败通知机制
总结
Oracle运维的核心在于预防性维护和性能优化。通过定期收集统计信息、分析AWR报告、合理分配资源以及自动化作业调度,可以显著提升数据库的稳定性和性能。建议建立完整的运维监控体系,将上述技术整合到日常运维流程中。