内容大纲
内容简介:本文主要介绍Oracle数据库的活动会话历史(ASH)管理,包括ASH的配置、使用、分析和管理。风哥教程参考Oracle官方文档ASH相关内容,为生产环境提供完整的ASH管理解决方案。
Part01-基础概念与理论知识
1.1 ASH概念
Oracle活动会话历史(ASH)是Oracle数据库自动收集和存储活动会话信息的工具,它会定期收集活动会话的详细信息,包括SQL执行情况、等待事件、资源使用情况等,并将这些数据存储在内存和磁盘中,供实时性能分析和诊断使用。ASH是Oracle数据库性能调优的重要工具,能够提供实时的会话级性能数据,帮助DBA快速定位性能问题。
1.2 ASH功能
- 实时会话信息收集:定期收集活动会话的详细信息
- 会话级性能分析:提供会话级的性能数据
- 等待事件分析:分析会话的等待事件
- SQL执行分析:分析SQL语句的执行情况
- 性能问题诊断:帮助诊断性能问题
1.3 ASH使用方法
- DBMS_WORKLOAD_REPOSITORY包:通过PL/SQL包管理ASH
- Enterprise Manager:通过EM控制台管理ASH
- SQL*Plus:通过SQL*Plus生成ASH报告
- V$ACTIVE_SESSION_HISTORY视图:直接查询ASH数据
Part02-生产环境规划与建议
2.1 ASH管理规划
制定合理的ASH管理规划:
- 配置ASH采样间隔和保留时间
- 制定ASH报告生成计划
- 建立ASH数据管理的流程和规范
- 定期分析ASH报告
- 跟踪ASH管理的效果
2.2 ASH建议
ASH建议:
- 根据数据库负载情况调整ASH采样间隔
- 根据存储空间情况调整ASH保留时间
- 定期生成ASH报告,分析数据库性能
- 结合其他性能工具,全面分析数据库性能
- 建立ASH报告分析的标准流程
2.3 ASH管理结果管理
ASH管理结果管理建议:
- 保存ASH报告,用于后续分析和参考
- 建立ASH报告分析的审核机制
- 跟踪性能问题的解决情况
- 分析性能趋势,预测潜在问题
- 与开发团队分享ASH分析结果,提高应用程序性能
Part03-生产环境项目实施方案
3.1 ASH配置与管理
SQL> SELECT * FROM dba_hist_wr_control;
# 2. 修改ASH采样间隔(秒)
SQL> EXEC DBMS_WORKLOAD_REPOSITORY.MODIFY_SNAPSHOT_SETTINGS(
ash_sampling_interval => 1 — 1秒
);
# 3. 手动收集ASH数据
SQL> EXEC DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT();
# 4. 生成ASH报告
SQL> @$ORACLE_HOME/rdbms/admin/ashrpt.sql
# 输入分析分钟数:60
# 输入报告类型:html
# 输入报告名称:/oracle/reports/ash_20260403.html
# 5. 生成ASH比较报告
SQL> @$ORACLE_HOME/rdbms/admin/ashrpti.sql
# 输入实例号:1
# 输入分析分钟数:60
# 输入报告类型:html
# 输入报告名称:/oracle/reports/ash_instance_20260403.html
3.2 ASH报告分析
# – 报告概览:报告时间范围、数据库信息
# – 等待事件分析:主要等待事件及占比
# – Top SQL:消耗资源最多的SQL语句
# – 会话分析:活动会话的分布情况
# – 阻塞分析:会话阻塞情况
# – 时间模型:数据库时间分布
# 2. 分析ASH报告的关键指标
# – 主要等待事件:识别瓶颈
# – Top SQL:识别消耗资源最多的SQL
# – 会话分布:识别活动会话的分布情况
# – 阻塞情况:识别会话阻塞问题
# 3. 查询ASH视图
SQL> SELECT event, count(*) “Count”,
round(count(*) * 100 / sum(count(*)) over (), 2) “%”
FROM v$active_session_history
WHERE sample_time BETWEEN SYSDATE – 1/24 AND SYSDATE
GROUP BY event
ORDER BY count(*) DESC;
SQL> SELECT sql_id, count(*) “Count”,
round(count(*) * 100 / sum(count(*)) over (), 2) “%”
FROM v$active_session_history
WHERE sample_time BETWEEN SYSDATE – 1/24 AND SYSDATE
GROUP BY sql_id
ORDER BY count(*) DESC;
3.3 ASH数据管理
SQL> SELECT sample_id, sample_time, session_id, session_serial#, event, sql_id
FROM v$active_session_history
WHERE sample_time BETWEEN SYSDATE – 1/24 AND SYSDATE
ORDER BY sample_time DESC;
# 2. 查看ASH历史数据
SQL> SELECT sample_id, sample_time, session_id, session_serial#, event, sql_id
FROM dba_hist_active_sess_history
WHERE sample_time BETWEEN SYSDATE – 7 AND SYSDATE
ORDER BY sample_time DESC;
# 3. 清理ASH数据
# ASH数据会自动清理,根据AWR的保留时间设置
# 4. 导出ASH数据
SQL> EXEC DBMS_WORKLOAD_REPOSITORY.EXPORT_AWR(
dpump_dir => ‘DATA_PUMP_DIR’,
file_name => ‘ash_export.dmp’,
bid => 110,
eid => 114
);
# 5. 导入ASH数据
SQL> EXEC DBMS_WORKLOAD_REPOSITORY.IMPORT_AWR(
dpump_dir => ‘DATA_PUMP_DIR’,
file_name => ‘ash_export.dmp’
);
3.4 ASH管理结果管理
# 将ASH报告保存到指定目录,用于后续分析和参考
# 2. 建立ASH报告分析的审核机制
# 定期审核ASH报告,确保性能问题得到及时解决
# 3. 跟踪性能问题的解决情况
# 记录性能问题的解决过程和结果
# 4. 分析性能趋势
# 定期比较ASH报告,分析性能趋势
# 5. 与开发团队分享ASH分析结果
# 提供ASH分析结果给开发团队,帮助优化应用程序
Part04-生产案例与实战讲解
4.1 ASH配置与管理实战
$ sqlplus / as sysdba
SQL*Plus: Release 19.0.0.0.0 – Production on Thu Apr 3 22:00:00 2026
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 – Production
Version 19.3.0.0.0
# 2. 查看当前ASH配置
SQL> SELECT * FROM dba_hist_wr_control;
DBID SNAP_INTERVAL RETENTION TOPNSQL
———- ———————————– ———————————– ———-
1234567890 +00000 00:30:00.000000000 +00014 00:00:00.000000000 200
# 3. 修改ASH采样间隔
SQL> EXEC DBMS_WORKLOAD_REPOSITORY.MODIFY_SNAPSHOT_SETTINGS(
ash_sampling_interval => 1 — 1秒
);
PL/SQL procedure successfully completed.
# 4. 手动收集ASH数据
SQL> EXEC DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT();
PL/SQL procedure successfully completed.
# 5. 查看ASH数据
SQL> SELECT sample_id, sample_time, session_id, session_serial#, event, sql_id
FROM v$active_session_history
WHERE sample_time BETWEEN SYSDATE – 1/24 AND SYSDATE
ORDER BY sample_time DESC
FETCH FIRST 5 ROWS ONLY;
SAMPLE_ID SAMPLE_TIME SESSION_ID SESSION_SERIAL# EVENT SQL_ID
———- ——————– ———- ————— —————————— ————-
116 2026-04-03 22:05:00 123 456 db file sequential read 1234567890abc
115 2026-04-03 22:04:59 234 567 log file sync 2345678901def
114 2026-04-03 22:04:58 345 678 db file scattered read 3456789012ghi
113 2026-04-03 22:04:57 456 789 CPU time 4567890123jkl
112 2026-04-03 22:04:56 567 890 db file sequential read 5678901234mno
4.2 ASH报告生成与分析实战
SQL> @$ORACLE_HOME/rdbms/admin/ashrpt.sql
Current Instance
~~~~~~~~~~~~~~~~
DBID DB_NAME INST_HOST INST_NAME
———- ——— ——————– ——————–
1234567890 FGEDUDB fgedu-server fgedudb1
Specify the Report Type
~~~~~~~~~~~~~~~~~~~~~~~
Would you like an HTML report, or a text report?
Enter ‘html’ for an HTML report, or ‘text’ for text:
html
Type Specified: html
Instances in this Workload Repository schema
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
DBID INSTANCE HOST
———- ———— ——————–
* 1234567890 fgedudb1 fgedu-server
Using 1234567890 for database Id
Using fgedudb1 for instance Id
Specify the number of minutes of snapshots to choose from
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Entering the number of minutes (n) will result in the most recent
(n) minutes of snapshots being listed. Pressing
specifying a number lists all completed snapshots.
Enter value for num_minutes: 60
Listing the last 60 minutes of Completed Snapshots
Snap
Instance DB Name Snap Id Snap Started Level
———— ———— ——— —————— —– ————
fgedudb1 FGEDUDB 111 03 Apr 2026 21:05 1
112 03 Apr 2026 21:35 1
113 03 Apr 2026 22:05 1
Specify the Begin and End Snapshot Ids
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Enter value for begin_snap: 111
Begin Snapshot Id specified: 111
Enter value for end_snap: 113
End Snapshot Id specified: 113
Specify the Report Name
~~~~~~~~~~~~~~~~~~~~~~~
The default report file name is ashrpt_1_111_113.html.
To use this name, press
Enter value for report_name: /oracle/reports/ash_20260403.html
Using the report name /oracle/reports/ash_20260403.html
# 2. 分析ASH报告
# 查看ASH报告的主要部分:
– 报告概览:
DB Name DB Id Instance Inst num Startup Time Release RAC
———— ———– ———— ——– ————— ———– —
FGEDUDB 1234567890 fgedudb1 1 03-Apr-26 18:00 19.3.0.0.0 NO
– 等待事件分析:
Event Wait Count % Event Wait Time (s) % Event Wait Avg Wait(ms)
—————- ———- ———- ————- ———- ————
db file sequential read 1234 45.0 678 45.0 550
db file scattered read 987 36.0 543 36.0 550
log file sync 432 16.0 321 16.0 740
CPU time 90 3.0 123 3.0 1367
– Top SQL:
SQL Id Plan Hash Event % Activity Wait Time (s) CPU Time (s)
————- ———- ——————– ———– ————- ———–
1234567890abc 1234567890 db file sequential read 25.0 345 123
2345678901def 2345678901 log file sync 15.0 210 89
3456789012ghi 3456789012 db file scattered read 12.0 180 76
– 会话分析:
Session Id Serial# User Program % Activity Wait Time (s) CPU Time (s)
————- ——– ———- ——————– ———– ————- ———–
123 456 FGEDU sqlplus.exe 30.0 456 189
234 567 SYS oracle@fgedu-server 25.0 389 156
345 678 FGEDU application.exe 20.0 312 123
– 阻塞分析:
Blocking Session Wait Time (s) % Activity Blocked Sessions
—————– ————- ———– —————-
234, 567 123 8.0 5
123, 456 98 6.5 3
4.3 ASH数据查询与分析实战
SQL> SELECT event, count(*) “Count”,
round(count(*) * 100 / sum(count(*)) over (), 2) “%”
FROM v$active_session_history
WHERE sample_time BETWEEN SYSDATE – 1/24 AND SYSDATE
GROUP BY event
ORDER BY count(*) DESC;
EVENT Count %
—————————— ———- ———-
db file sequential read 1234 45.00
db file scattered read 987 36.00
log file sync 432 16.00
CPU time 90 3.00
# 2. 查询Top SQL
SQL> SELECT sql_id, count(*) “Count”,
round(count(*) * 100 / sum(count(*)) over (), 2) “%”
FROM v$active_session_history
WHERE sample_time BETWEEN SYSDATE – 1/24 AND SYSDATE
GROUP BY sql_id
ORDER BY count(*) DESC;
SQL_ID Count %
————- ———- ———-
1234567890abc 678 25.00
2345678901def 405 15.00
3456789012ghi 324 12.00
4567890123jkl 243 9.00
5678901234mno 189 7.00
# 3. 查询会话活动
SQL> SELECT session_id, session_serial#, username, program,
count(*) “Count”,
round(count(*) * 100 / sum(count(*)) over (), 2) “%”
FROM v$active_session_history
WHERE sample_time BETWEEN SYSDATE – 1/24 AND SYSDATE
GROUP BY session_id, session_serial#, username, program
ORDER BY count(*) DESC;
SESSION_ID SESSION_SERIAL# USERNAME PROGRAM Count %
———- ————— ———- ——————– ———- ———-
123 456 FGEDU sqlplus.exe 810 30.00
234 567 SYS oracle@fgedu-server 675 25.00
345 678 FGEDU application.exe 540 20.00
456 789 FGEDU application.exe 270 10.00
567 890 SYS sqlplus.exe 135 5.00
# 4. 查询阻塞情况
SQL> SELECT blocking_session, count(*) “Count”,
round(count(*) * 100 / sum(count(*)) over (), 2) “%”
FROM v$active_session_history
WHERE sample_time BETWEEN SYSDATE – 1/24 AND SYSDATE
AND blocking_session IS NOT NULL
GROUP BY blocking_session
ORDER BY count(*) DESC;
BLOCKING_SESSION Count %
—————- ———- ———-
234 216 60.00
123 144 40.00
Part05-风哥经验总结与分享
5.1 ASH管理最佳实践
- 合理配置:根据数据库负载情况调整ASH采样间隔
- 定期分析:定期生成和分析ASH报告,及时发现性能问题
- 实时监控:使用ASH进行实时性能监控
- 保存报告:保存ASH报告,用于后续分析和参考
- 持续监控:持续监控数据库性能,及时发现新问题
5.2 ASH管理注意事项
- 确保ASH有足够的存储空间
- 根据数据库负载情况调整ASH采样间隔
- 定期清理过期的ASH数据,释放存储空间
- 结合其他性能工具,全面分析数据库性能
- 与开发团队分享ASH分析结果,提高应用程序性能
5.3 ASH管理建议
- 建立ASH管理流程,定期执行ASH配置和分析
- 培训DBA,提高ASH报告分析能力
- 建立ASH报告分析的标准流程
- 跟踪性能问题的解决情况
- 与Oracle支持团队保持沟通,获取ASH管理的最佳实践
更多视频教程www.fgedu.net.cn
更多学习教程公众号风哥教程itpux_com
from oracle:www.itpux.com
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
