本文档风哥主要介绍Oracle挂起分析相关知识,包括挂起的概念、挂起类型、挂起分析使用、挂起分析配置、挂起分析监控、挂起分析故障处理等内容,由风哥教程参考Oracle官方文档Troubleshooting内容编写,适合DBA人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。
Part01-基础概念与理论知识
1.1 挂起的概念
Oracle数据库挂起(Hang)是指数据库或会话停止响应的状态,通常由于资源争用、锁等待、死锁等原因导致。挂起分析是诊断数据库性能问题和故障的重要手段,通过分析挂起原因可以找到问题的根本原因并采取相应的解决措施。更多视频教程www.fgedu.net.cn
- 停止响应:数据库或会话停止响应
- 资源争用:通常由于资源争用导致
- 锁等待:锁等待是常见原因
- 死锁:死锁会导致挂起
- 性能影响:严重影响数据库性能
1.2 挂起类型
Oracle挂起类型:
- 数据库挂起:整个数据库停止响应
- 实例挂起:单个实例停止响应
- 会话挂起:单个会话停止响应
- 进程挂起:单个进程停止响应
- 操作挂起:特定操作停止响应
1. 数据库挂起
– 整个数据库停止响应
– 所有会话无法操作
– 通常由于严重问题导致
– 需要紧急处理
2. 实例挂起
– 单个实例停止响应
– RAC环境中常见
– 其他实例可能正常
– 需要重启实例
3. 会话挂起
– 单个会话停止响应
– 其他会话可能正常
– 通常由于锁等待导致
– 需要分析锁情况
4. 进程挂起
– 单个进程停止响应
– 后台进程挂起影响大
– 用户进程挂起影响小
– 需要分析进程状态
5. 操作挂起
– 特定操作停止响应
– 如DDL操作挂起
– 如大事务挂起
– 需要分析操作状态
1.3 挂起分析使用
Oracle挂起分析使用:
- 问题诊断:诊断数据库挂起问题
- 性能分析:分析性能问题
- 锁分析:分析锁等待问题
- 死锁分析:分析死锁问题
- 资源分析:分析资源争用问题
Part02-生产环境规划与建议
2.1 挂起分析规划
Oracle挂起分析规划要点:
– 分析时机:确定何时进行挂起分析
– 分析工具:选择合适的分析工具
– 分析流程:确定分析流程
– 结果处理:确定如何处理分析结果
# 分析时机规划
– 挂起发生时:立即进行挂起分析
– 性能问题时:分析可能的挂起
– 定期检查:定期检查挂起情况
– 升级前后:升级前后检查挂起
# 分析工具规划
– HANGANALYZE:Oracle挂起分析工具
– SYSTEMSTATE:系统状态转储
– ASH:活动会话历史
– AWR:自动工作负载仓库
– 自定义脚本:自定义分析脚本
# 分析流程规划
– 识别挂起:识别挂起的会话或进程
– 收集信息:收集挂起相关信息
– 分析原因:分析挂起原因
– 制定方案:制定解决方案
– 执行修复:执行修复操作
# 结果处理规划
– 问题分类:按原因分类问题
– 问题修复:及时修复问题
– 问题跟踪:跟踪问题修复进度
– 预防措施:制定预防措施
2.2 挂起分析场景
Oracle挂起分析场景:
- 数据库挂起:整个数据库停止响应
- 会话挂起:会话停止响应
- 锁等待:锁等待导致挂起
- 死锁:死锁导致挂起
- 资源争用:资源争用导致挂起
1. 数据库挂起
– 整个数据库停止响应
– 所有会话无法操作
– 需要紧急分析
– 可能需要重启数据库
2. 会话挂起
– 单个会话停止响应
– 其他会话可能正常
– 分析锁等待情况
– 可能需要终止会话
3. 锁等待
– 锁等待导致挂起
– 分析锁持有者
– 分析锁等待者
– 可能需要释放锁
4. 死锁
– 死锁导致挂起
– Oracle自动检测死锁
– 自动终止一个会话
– 分析死锁原因
5. 资源争用
– 资源争用导致挂起
– 分析资源使用情况
– 优化资源使用
– 增加资源供给
2.3 挂起分析最佳实践
Oracle挂起分析最佳实践:
- 及时分析:挂起发生时及时分析
- 收集信息:收集完整的诊断信息
- 系统方法:使用系统方法分析
- 记录结果:记录分析结果
- 预防措施:制定预防措施
Part03-生产环境项目实施方案
3.1 挂起分析配置
3.1.1 使用HANGANALYZE
SQL> alter session set events ‘immediate trace name hanganalyze level 3’;
Session altered.
# 2. 查看转储文件位置
SQL> select value from v$diag_info where name = ‘Default Trace File’;
VALUE
————————————————–
/oracle/app/oracle/diag/rdbms/fgedudb/FGEDUDB/trace/FGEDUDB_ora_12345.trc
# 3. 查看HANGANALYZE输出
$ cat /oracle/app/oracle/diag/rdbms/fgedudb/FGEDUDB/trace/FGEDUDB_ora_12345.trc
*** 2026-03-31 10:00:00.123
*** SESSION ID:(150.1234) 2026-03-31 10:00:00.123
*** CLIENT ID:() 2026-03-31 10:00:00.123
*** SERVICE NAME:(SYS$USERS) 2026-03-31 10:00:00.123
*** MODULE NAME:(SQL*Plus) 2026-03-31 10:00:00.123
*** ACTION NAME:() 2026-03-31 10:00:00.123
HANG ANALYSIS:
Open chains found:
==================
Chain 1:
——-
Oracle session: 150.1234
waiting for ‘enq: TX – row lock contention’
blocking session: 160.5678
Chain 2:
——-
Oracle session: 160.5678
waiting for ‘enq: TX – row lock contention’
blocking session: 150.1234
===================================================
HANG ANALYSIS END
===================================================
# 4. 生成不同级别的HANGANALYZE
SQL> alter session set events ‘immediate trace name hanganalyze level 1’;
SQL> alter session set events ‘immediate trace name hanganalyze level 2’;
SQL> alter session set events ‘immediate trace name hanganalyze level 3’;
SQL> alter session set events ‘immediate trace name hanganalyze level 4’;
SQL> alter session set events ‘immediate trace name hanganalyze level 5’;
# 5. 使用oradebug生成HANGANALYZE
SQL> oradebug setmypid
Statement processed.
SQL> oradebug hanganalyze 3
Hang Analysis in /oracle/app/oracle/diag/rdbms/fgedudb/FGEDUDB/trace/FGEDUDB_ora_12345.trc
# 6. 在RAC环境中生成HANGANALYZE
SQL> alter session set events ‘immediate trace name hanganalyze level 3’;
# 7. 使用HANGANALYZE级别说明
# Level 1: 基本挂起分析
# Level 2: 详细挂起分析
# Level 3: 完整挂起分析(推荐)
# Level 4: 包含进程状态
# Level 5: 包含所有进程详细信息
# 8. 创建HANGANALYZE脚本
$ vi /home/oracle/scripts/run_hanganalyze.sh
#!/bin/bash
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
# HANGANALYZE脚本
export ORACLE_HOME=/oracle/app/oracle/product/19c/dbhome_1
export ORACLE_SID=FGEDUDB
export PATH=$ORACLE_HOME/bin:$PATH
LOG_DIR=”/home/oracle/hang_analysis”
mkdir -p $LOG_DIR
DATE=$(date +%Y%m%d_%H%M%S)
LOG_FILE=”$LOG_DIR/hanganalyze_$DATE.log”
echo “$(date): Running HANGANALYZE…” > $LOG_FILE
sqlplus -s / as sysdba <
alter session set events ‘immediate trace name hanganalyze level 3’;
select value from v\$diag_info where name = ‘Default Trace File’;
EOF
echo “$(date): HANGANALYZE completed.” >> $LOG_FILE
cat $LOG_FILE
# 9. 执行脚本
$ chmod +x /home/oracle/scripts/run_hanganalyze.sh
$ /home/oracle/scripts/run_hanganalyze.sh
3.1.2 使用SYSTEMSTATE转储
SQL> alter session set events ‘immediate trace name systemstate level 10’;
Session altered.
# 2. 查看转储文件位置
SQL> select value from v$diag_info where name = ‘Default Trace File’;
VALUE
————————————————–
/oracle/app/oracle/diag/rdbms/fgedudb/FGEDUDB/trace/FGEDUDB_ora_12345.trc
# 3. 查看SYSTEMSTATE输出
$ head -100 /oracle/app/oracle/diag/rdbms/fgedudb/FGEDUDB/trace/FGEDUDB_ora_12345.trc
*** 2026-03-31 10:00:00.123
*** SESSION ID:(150.1234) 2026-03-31 10:00:00.123
SYSTEM STATE
Process Name: Oracle
Process Id: 12345
Process Group: DEFAULT
Session: 150.1234
Status: ACTIVE
Waiting for: enq: TX – row lock contention
Wait Event: enq: TX – row lock contention
P1: name|mode = 1415053318
P2: usn<<16 | slot = 655361
P3: sequence = 12345
# 4. 生成不同级别的SYSTEMSTATE
SQL> alter session set events ‘immediate trace name systemstate level 258’;
SQL> alter session set events ‘immediate trace name systemstate level 266’;
SQL> alter session set events ‘immediate trace name systemstate level 267’;
# 5. 使用oradebug生成SYSTEMSTATE
SQL> oradebug setmypid
Statement processed.
SQL> oradebug dump systemstate 10
Statement processed.
# 6. 在RAC环境中生成SYSTEMSTATE
SQL> alter session set events ‘immediate trace name systemstate level 10’;
# 7. 使用SYSTEMSTATE级别说明
# Level 10: 基本系统状态
# Level 258: 包含进程状态
# Level 266: 包含进程和会话状态
# Level 267: 包含所有详细信息
# 8. 创建SYSTEMSTATE脚本
$ vi /home/oracle/scripts/run_systemstate.sh
#!/bin/bash
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
# SYSTEMSTATE脚本
export ORACLE_HOME=/oracle/app/oracle/product/19c/dbhome_1
export ORACLE_SID=FGEDUDB
export PATH=$ORACLE_HOME/bin:$PATH
LOG_DIR=”/home/oracle/systemstate”
mkdir -p $LOG_DIR
DATE=$(date +%Y%m%d_%H%M%S)
LOG_FILE=”$LOG_DIR/systemstate_$DATE.log”
echo “$(date): Running SYSTEMSTATE dump…” > $LOG_FILE
sqlplus -s / as sysdba <
alter session set events ‘immediate trace name systemstate level 10’;
select value from v\$diag_info where name = ‘Default Trace File’;
EOF
echo “$(date): SYSTEMSTATE dump completed.” >> $LOG_FILE
cat $LOG_FILE
# 9. 执行脚本
$ chmod +x /home/oracle/scripts/run_systemstate.sh
$ /home/oracle/scripts/run_systemstate.sh
3.2 挂起分析监控
3.2.1 配置挂起分析监控脚本
$ vi /home/oracle/scripts/monitor_hang.sh
#!/bin/bash
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
# 挂起分析监控脚本
export ORACLE_HOME=/oracle/app/oracle/product/19c/dbhome_1
export ORACLE_SID=FGEDUDB
export PATH=$ORACLE_HOME/bin:$PATH
LOG_DIR=”/home/oracle/hang_monitor”
mkdir -p $LOG_DIR
DATE=$(date +%Y%m%d)
LOG_FILE=”$LOG_DIR/hang_monitor_$DATE.log”
echo “$(date): Starting hang monitor…” > $LOG_FILE
# 检查挂起会话
sqlplus -s / as sysdba <
set linesize 200
set pagesize 100
— 检查长时间等待的会话
select sid, serial#, username, status, last_call_et, program
from v\$session
where status = ‘ACTIVE’ and last_call_et > 300
order by last_call_et desc;
— 检查锁等待
select s.sid, s.serial#, s.username, l.type, l.lmode, l.request, l.ctime
from v\$session s, v\$lock l
where s.sid = l.sid and l.request > 0
order by l.ctime desc;
— 检查阻塞会话
select s1.sid as blocking_sid, s2.sid as blocked_sid, s2.username, s2.program
from v\$lock l1, v\$session s1, v\$lock l2, v\$session s2
where l1.sid = s1.sid and l2.sid = s2.sid
and l1.id1 = l2.id1 and l1.id2 = l2.id2
and l1.lmode > 0 and l2.request > 0;
exit
EOF
echo “$(date): Hang monitor completed.” >> $LOG_FILE
# 发送报告
mail -s “Hang Monitor Report – $DATE” admin@fgedu.net.cn < $LOG_FILE
# 2. 设置脚本权限
$ chmod +x /home/oracle/scripts/monitor_hang.sh
# 3. 测试脚本
$ /home/oracle/scripts/monitor_hang.sh
# 4. 设置定期监控
$ crontab -e
# 每10分钟监控挂起
*/10 * * * * /home/oracle/scripts/monitor_hang.sh >> /home/oracle/hang_monitor/cron.log 2>&1
3.2.2 配置自动挂起分析
$ vi /home/oracle/scripts/auto_hang_analyze.sh
#!/bin/bash
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
# 自动挂起分析脚本
export ORACLE_HOME=/oracle/app/oracle/product/19c/dbhome_1
export ORACLE_SID=FGEDUDB
export PATH=$ORACLE_HOME/bin:$PATH
LOG_DIR=”/home/oracle/hang_analysis”
mkdir -p $LOG_DIR
DATE=$(date +%Y%m%d_%H%M%S)
LOG_FILE=”$LOG_DIR/hang_analysis_$DATE.log”
echo “========================================” > $LOG_FILE
echo “Hang Analysis Report” >> $LOG_FILE
echo “Date: $(date)” >> $LOG_FILE
echo “========================================” >> $LOG_FILE
# 检查是否有挂起会话
HANG_COUNT=$(sqlplus -s / as sysdba <
exit
EOF
)
if [ $HANG_COUNT -gt 5 ]; then
echo “Found $HANG_COUNT potentially hung sessions” >> $LOG_FILE
echo “Running HANGANALYZE…” >> $LOG_FILE
sqlplus -s / as sysdba <
alter session set events ‘immediate trace name hanganalyze level 3’;
select value from v\$diag_info where name = ‘Default Trace File’;
exit
EOF
# 发送告警
mail -s “Hang Analysis Alert: $HANG_COUNT hung sessions” admin@fgedu.net.cn < $LOG_FILE
else
echo "No significant hang detected ($HANG_COUNT active sessions)" >> $LOG_FILE
fi
echo “” >> $LOG_FILE
echo “Analysis completed at $(date)” >> $LOG_FILE
# 2. 设置脚本权限
$ chmod +x /home/oracle/scripts/auto_hang_analyze.sh
# 3. 测试脚本
$ /home/oracle/scripts/auto_hang_analyze.sh
# 4. 设置定期分析
$ crontab -e
# 每5分钟检查挂起
*/5 * * * * /home/oracle/scripts/auto_hang_analyze.sh >> /home/oracle/hang_analysis/cron.log 2>&1
3.3 挂起分析故障处理
3.3.1 锁等待挂起处理
SQL> select * from scott.emp where empno = 7369 for update;
— 会话挂起,无法返回结果
# 分析步骤
# 1. 查看挂起会话
SQL> select sid, serial#, username, status, last_call_et, program
from v$session
where status = ‘ACTIVE’ and last_call_et > 60;
SID SERIAL# USERNAME STATUS LAST_CALL_ET PROGRAM
———- ———- —————————— ——– ———— ————
150 1234 SCOTT ACTIVE 120 sqlplus
# 2. 查看等待事件
SQL> select sid, event, wait_class, seconds_in_wait
from v$session_wait
where sid = 150;
SID EVENT WAIT_CLASS SECONDS_IN_WAIT
———- ——————————– ————— —————
150 enq: TX – row lock contention Application 120
# 3. 查看阻塞会话
SQL> select s1.sid as blocking_sid, s2.sid as blocked_sid,
s1.username as blocking_user, s2.username as blocked_user
from v$lock l1, v$session s1, v$lock l2, v$session s2
where l1.sid = s1.sid and l2.sid = s2.sid
and l1.id1 = l2.id1 and l1.id2 = l2.id2
and l1.lmode > 0 and l2.request > 0;
BLOCKING_SID BLOCKED_SID BLOCKING_USER BLOCKED_USER
———— ———– —————– —————–
160 150 SCOTT SCOTT
# 4. 查看阻塞会话信息
SQL> select sid, serial#, username, program, sql_id
from v$session
where sid = 160;
SID SERIAL# USERNAME PROGRAM SQL_ID
———- ———- —————————— —————- ————-
160 5678 SCOTT sqlplus a1b2c3d4e5f6g
# 5. 查看阻塞会话执行的SQL
SQL> select sql_text from v$sql where sql_id = ‘a1b2c3d4e5f6g’;
SQL_TEXT
————————————————–
update scott.emp set sal = sal + 100 where empno = 7369
# 6. 解决方案
# 方案1:等待阻塞会话提交或回滚
# 方案2:终止阻塞会话
SQL> alter system kill session ‘160,5678’;
System altered.
# 方案3:联系阻塞会话用户提交或回滚
# 7. 验证解决
SQL> select sid, serial#, username, status, last_call_et
from v$session
where status = ‘ACTIVE’ and last_call_et > 60;
no rows selected
3.3.2 死锁挂起处理
SQL> update scott.emp set sal = sal + 100 where empno = 7369;
— 会话挂起
# 分析步骤
# 1. 查看告警日志
$ grep “ORA-00060” /oracle/app/oracle/diag/rdbms/fgedudb/FGEDUDB/trace/alert_FGEDUDB.log
ORA-00060: Deadlock detected. More info in file /oracle/app/oracle/diag/rdbms/fgedudb/FGEDUDB/trace/FGEDUDB_ora_12345.trc.
# 2. 查看死锁跟踪文件
$ cat /oracle/app/oracle/diag/rdbms/fgedudb/FGEDUDB/trace/FGEDUDB_ora_12345.trc
Deadlock graph:
———Blocker(s)——– ———Waiter(s)———
Resource Name process session holds waits process session holds waits
TX-00010001-00001234 30 150 X 31 160 X
TX-00020002-00002345 31 160 X 30 150 X
session 150: DID 0001-001E-00000001 session 160: DID 0001-001F-00000002
session 160: DID 0001-001F-00000002 session 150: DID 0001-001E-00000001
Rows waited on:
Session 160: obj – rowid = 00001234 – AAAE0jAAEAAAAInAAA
Session 150: obj – rowid = 00001235 – AAAE0jAAEAAAAIoAAA
# 3. 分析死锁原因
# 会话150持有资源TX-00010001-00001234,等待资源TX-00020002-00002345
# 会话160持有资源TX-00020002-00002345,等待资源TX-00010001-00001234
# 形成死锁
# 4. 解决方案
# Oracle自动检测死锁并终止其中一个会话
# 被终止的会话会收到ORA-00060错误
# 5. 预防措施
# – 按相同顺序访问表
# – 减少事务持有锁的时间
# – 使用合适的隔离级别
# – 避免长时间事务
Part04-生产案例与实战讲解
4.1 挂起分析案例
在生产环境中使用挂起分析的完整案例:
4.1.1 场景描述
某企业生产数据库出现大量会话挂起,需要使用挂起分析进行诊断。
4.1.2 分析步骤
$ vi /home/oracle/scripts/analyze_hang.sh
#!/bin/bash
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
# 挂起分析自动化脚本
export ORACLE_HOME=/oracle/app/oracle/product/19c/dbhome_1
export ORACLE_SID=FGEDUDB
export PATH=$ORACLE_HOME/bin:$PATH
LOG_DIR=”/home/oracle/hang_analysis”
mkdir -p $LOG_DIR
DATE=$(date +%Y%m%d_%H%M%S)
LOG_FILE=”$LOG_DIR/hang_analysis_$DATE.log”
echo “========================================” > $LOG_FILE
echo “Hang Analysis Report” >> $LOG_FILE
echo “Date: $(date)” >> $LOG_FILE
echo “========================================” >> $LOG_FILE
# 检查挂起会话
echo “” >> $LOG_FILE
echo “Checking for hung sessions…” >> $LOG_FILE
sqlplus -s / as sysdba <
set linesize 200
set pagesize 100
select sid, serial#, username, status, last_call_et, program
from v\$session
where status = ‘ACTIVE’ and last_call_et > 300
order by last_call_et desc;
EOF
# 生成HANGANALYZE
echo “” >> $LOG_FILE
echo “Generating HANGANALYZE…” >> $LOG_FILE
sqlplus -s / as sysdba <
alter session set events ‘immediate trace name hanganalyze level 3’;
select value from v\$diag_info where name = ‘Default Trace File’;
exit
EOF
# 生成SYSTEMSTATE
echo “” >> $LOG_FILE
echo “Generating SYSTEMSTATE…” >> $LOG_FILE
sqlplus -s / as sysdba <
alter session set events ‘immediate trace name systemstate level 10’;
select value from v\$diag_info where name = ‘Default Trace File’;
exit
EOF
echo “” >> $LOG_FILE
echo “Analysis completed at $(date)” >> $LOG_FILE
# 发送报告
mail -s “Hang Analysis Report – $DATE” admin@fgedu.net.cn < $LOG_FILE
# 2. 设置脚本权限
$ chmod +x /home/oracle/scripts/analyze_hang.sh
# 3. 测试脚本
$ /home/oracle/scripts/analyze_hang.sh
4.2 挂起分析故障处理
在挂起分析故障处理过程中的方法和技巧:
4.2.1 故障处理流程
# 1. 识别挂起
# – 检查会话状态
# – 检查等待事件
# – 检查锁情况
# 2. 收集信息
# – 生成HANGANALYZE
# – 生成SYSTEMSTATE
# – 收集ASH报告
# 3. 分析原因
# – 分析等待链
# – 分析锁持有者
# – 分析资源争用
# 4. 制定方案
# – 终止阻塞会话
# – 释放锁
# – 优化SQL
# 5. 执行修复
# – 执行修复操作
# – 验证修复结果
# – 记录修复过程
# 示例:处理锁等待挂起
# 1. 识别挂起
SQL> select sid, serial#, username, status, last_call_et
from v$session
where status = ‘ACTIVE’ and last_call_et > 60;
# 2. 收集信息
SQL> alter session set events ‘immediate trace name hanganalyze level 3’;
# 3. 分析原因
$ cat /oracle/app/oracle/diag/rdbms/fgedudb/FGEDUDB/trace/FGEDUDB_ora_*.trc
# 4. 制定方案
# – 识别阻塞会话
# – 决定是否终止
# 5. 执行修复
SQL> alter system kill session ‘160,5678’;
4.3 挂起分析优化
优化挂起分析配置的最佳实践:
4.3.1 优化挂起分析管理
SQL> create or replace procedure manage_hang_analysis(
p_analysis_date in date,
p_total_hung_sessions in number,
p_total_blocking_sessions in number
) as
begin
dbms_output.put_line(‘— Hang Analysis Management —‘);
dbms_output.put_line(‘Analysis Date: ‘ || to_char(p_analysis_date, ‘YYYY-MM-DD HH24:MI:SS’));
dbms_output.put_line(‘Total Hung Sessions: ‘ || p_total_hung_sessions);
dbms_output.put_line(‘Total Blocking Sessions: ‘ || p_total_blocking_sessions);
— 可以扩展为记录到表中
end manage_hang_analysis;
/
Procedure created.
# 2. 执行管理存储过程
SQL> set serveroutput on
SQL> exec manage_hang_analysis(sysdate, 5, 2);
— Hang Analysis Management —
Analysis Date: 2026-03-31 10:00:00
Total Hung Sessions: 5
Total Blocking Sessions: 2
PL/SQL procedure successfully completed.
# 3. 创建挂起分析历史表
SQL> create table hang_analysis_history (
id number primary key,
analysis_date date,
total_hung_sessions number,
total_blocking_sessions number,
trace_file varchar2(4000),
notes varchar2(4000)
);
Table created.
SQL> create sequence hang_analysis_history_seq;
Sequence created.
# 4. 记录分析历史
SQL> insert into hang_analysis_history values (
hang_analysis_history_seq.nextval,
sysdate,
5,
2,
‘/oracle/app/oracle/diag/rdbms/fgedudb/FGEDUDB/trace/FGEDUDB_ora_12345.trc’,
‘Lock wait hang’
);
1 row created.
SQL> commit;
Commit complete.
# 5. 查看分析历史趋势
SQL> column analysis_date format a20
SQL> select analysis_date, total_hung_sessions, total_blocking_sessions
from hang_analysis_history
order by analysis_date desc
fetch first 12 rows only;
ANALYSIS_DATE TOTAL_HUNG_SESSIONS TOTAL_BLOCKING_SESSIONS
——————– ——————- ———————–
2026-03-31 10:00:00 5 2
2026-03-30 10:00:00 8 3
2026-03-29 10:00:00 10 4
Part05-风哥经验总结与分享
5.1 挂起分析总结
Oracle挂起分析是诊断数据库性能问题和故障的重要手段,具有以下特点:
- 问题诊断:诊断数据库挂起问题
- 锁分析:分析锁等待问题
- 死锁分析:分析死锁问题
- 资源分析:分析资源争用问题
- 性能优化:优化数据库性能
5.2 挂起分析检查清单
Oracle挂起分析检查清单:
- 及时分析:挂起发生时及时分析
- 收集信息:收集完整的诊断信息
- 系统方法:使用系统方法分析
- 记录结果:记录分析结果
- 预防措施:制定预防措施
- 定期检查:定期检查挂起情况
5.3 挂起分析工具推荐
Oracle挂起分析工具推荐:
- HANGANALYZE:Oracle挂起分析工具
- SYSTEMSTATE:系统状态转储
- ASH:活动会话历史
- AWR:自动工作负载仓库
- Shell脚本:自动化分析过程
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
