1. 首页 > Oracle教程 > 正文

Oracle教程FG446-挂起分析

本文档风哥主要介绍Oracle挂起分析相关知识,包括挂起的概念、挂起类型、挂起分析使用、挂起分析配置、挂起分析监控、挂起分析故障处理等内容,由风哥教程参考Oracle官方文档Troubleshooting内容编写,适合DBA人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。

Part01-基础概念与理论知识

1.1 挂起的概念

Oracle数据库挂起(Hang)是指数据库或会话停止响应的状态,通常由于资源争用、锁等待、死锁等原因导致。挂起分析是诊断数据库性能问题和故障的重要手段,通过分析挂起原因可以找到问题的根本原因并采取相应的解决措施。更多视频教程www.fgedu.net.cn

Oracle挂起的特点:

  • 停止响应:数据库或会话停止响应
  • 资源争用:通常由于资源争用导致
  • 锁等待:锁等待是常见原因
  • 死锁:死锁会导致挂起
  • 性能影响:严重影响数据库性能

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挂起分析最佳实践:

  • 及时分析:挂起发生时及时分析
  • 收集信息:收集完整的诊断信息
  • 系统方法:使用系统方法分析
  • 记录结果:记录分析结果
  • 预防措施:制定预防措施
生产环境建议:挂起分析需要建立完善的流程,建议及时分析、收集信息、系统方法。学习交流加群风哥微信: itpux-com

Part03-生产环境项目实施方案

3.1 挂起分析配置

3.1.1 使用HANGANALYZE

# 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 <> $LOG_FILE
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转储

# 1. 生成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 <> $LOG_FILE
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 配置挂起分析监控脚本

# 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 <> $LOG_FILE
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 配置自动挂起分析

# 1. 创建自动挂起分析脚本
$ 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 < 300;
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 <> $LOG_FILE
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. 预防措施
# – 按相同顺序访问表
# – 减少事务持有锁的时间
# – 使用合适的隔离级别
# – 避免长时间事务

风哥提示:挂起分析是诊断数据库性能问题和故障的重要手段,建议掌握挂起分析方法。学习交流加群风哥QQ113257174

Part04-生产案例与实战讲解

4.1 挂起分析案例

在生产环境中使用挂起分析的完整案例:

4.1.1 场景描述

某企业生产数据库出现大量会话挂起,需要使用挂起分析进行诊断。

4.1.2 分析步骤

# 1. 创建挂起分析自动化脚本
$ 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 <> $LOG_FILE
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 <> $LOG_FILE
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 <> $LOG_FILE
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 优化挂起分析管理

# 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

生产环境建议:挂起分析优化需要建立完善的管理流程,建议及时分析、记录结果、预防措施。更多学习教程公众号风哥教程itpux_com

Part05-风哥经验总结与分享

5.1 挂起分析总结

Oracle挂起分析是诊断数据库性能问题和故障的重要手段,具有以下特点:

  • 问题诊断:诊断数据库挂起问题
  • 锁分析:分析锁等待问题
  • 死锁分析:分析死锁问题
  • 资源分析:分析资源争用问题
  • 性能优化:优化数据库性能

5.2 挂起分析检查清单

Oracle挂起分析检查清单:

  • 及时分析:挂起发生时及时分析
  • 收集信息:收集完整的诊断信息
  • 系统方法:使用系统方法分析
  • 记录结果:记录分析结果
  • 预防措施:制定预防措施
  • 定期检查:定期检查挂起情况

5.3 挂起分析工具推荐

Oracle挂起分析工具推荐:

  • HANGANALYZE:Oracle挂起分析工具
  • SYSTEMSTATE:系统状态转储
  • ASH:活动会话历史
  • AWR:自动工作负载仓库
  • Shell脚本:自动化分析过程
风哥提示:挂起分析是诊断数据库性能问题和故障的重要手段,建议掌握挂起分析方法。from:www.itpux.com www.fgedu.net.cn

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息