本文档风哥主要介绍Oracle跟踪文件分析相关知识,包括跟踪文件的概念、跟踪文件类型、跟踪文件使用、跟踪文件分析配置、跟踪文件分析监控、跟踪文件分析故障处理等内容,由风哥教程参考Oracle官方文档Troubleshooting内容编写,适合DBA人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。
Part01-基础概念与理论知识
1.1 跟踪文件的概念
Oracle跟踪文件(Trace File)是Oracle数据库生成的诊断文件,记录了数据库进程的详细执行信息。跟踪文件包含进程状态、错误堆栈、等待事件、SQL执行信息等详细诊断信息。跟踪文件是DBA进行故障诊断和性能分析的重要工具。更多视频教程www.fgedu.net.cn
- 详细记录:记录进程执行的详细信息
- 错误诊断:包含错误堆栈和诊断信息
- 性能分析:包含等待事件和执行统计
- 自动生成:错误发生时自动生成
- 手动生成:可以手动启用跟踪
1.2 跟踪文件类型
Oracle跟踪文件类型:
- 后台进程跟踪文件:后台进程生成的跟踪文件
- 服务器进程跟踪文件:服务器进程生成的跟踪文件
- 用户跟踪文件:用户会话生成的跟踪文件
- SQL跟踪文件:SQL执行跟踪文件
- 事件跟踪文件:特定事件跟踪文件
1. 后台进程跟踪文件
– PMON跟踪文件:进程监控进程跟踪
– SMON跟踪文件:系统监控进程跟踪
– DBWn跟踪文件:数据库写进程跟踪
– LGWR跟踪文件:日志写进程跟踪
– CKPT跟踪文件:检查点进程跟踪
– ARCH跟踪文件:归档进程跟踪
2. 服务器进程跟踪文件
– 专用服务器进程跟踪
– 共享服务器进程跟踪
– 并行查询进程跟踪
3. 用户跟踪文件
– 用户会话跟踪
– 应用程序跟踪
– 批处理作业跟踪
4. SQL跟踪文件
– SQL执行计划跟踪
– SQL执行统计跟踪
– SQL等待事件跟踪
5. 事件跟踪文件
– 10046事件跟踪:SQL跟踪
– 10053事件跟踪:优化器跟踪
– 10079事件跟踪:SQL*Net跟踪
– 其他诊断事件跟踪
1.3 跟踪文件使用
Oracle跟踪文件使用:
- 故障诊断:诊断数据库错误和故障
- 性能分析:分析SQL执行性能
- 等待事件分析:分析等待事件
- 优化器分析:分析优化器决策
- 应用调试:调试应用程序问题
Part02-生产环境规划与建议
2.1 跟踪文件分析规划
Oracle跟踪文件分析规划要点:
– 分析时机:确定何时需要分析跟踪文件
– 分析范围:确定分析哪些跟踪文件
– 分析工具:选择合适的分析工具
– 分析记录:记录分析结果
# 分析时机规划
– 错误发生时:分析错误相关的跟踪文件
– 性能问题时:分析性能相关的跟踪文件
– 定期检查:定期检查跟踪文件
– 应用调试:应用程序调试时
# 分析范围规划
– 后台进程跟踪:分析后台进程跟踪文件
– 用户会话跟踪:分析用户会话跟踪文件
– SQL跟踪:分析SQL执行跟踪文件
– 事件跟踪:分析特定事件跟踪文件
# 分析工具规划
– TKPROF:格式化SQL跟踪文件
– TRCSESS:合并多个跟踪文件
– ADRCI:Oracle诊断工具
– 自定义脚本:自定义分析脚本
# 分析记录规划
– 记录方式:选择记录方式
– 记录格式:定义记录格式
– 记录保留:设置记录保留时间
– 记录备份:备份分析记录
2.2 跟踪文件分析场景
Oracle跟踪文件分析场景:
- ORA错误诊断:诊断ORA错误
- 性能问题分析:分析性能问题
- SQL调优:SQL语句调优
- 等待事件分析:分析等待事件
- 应用调试:调试应用程序
1. ORA错误诊断
– ORA-00600内部错误
– ORA-07445异常错误
– ORA-01555快照太旧
– 其他ORA错误
2. 性能问题分析
– 慢SQL分析
– 等待事件分析
– 资源争用分析
– 并发问题分析
3. SQL调优
– 执行计划分析
– 绑定变量分析
– 等待事件分析
– I/O统计
4. 等待事件分析
– 等待事件类型
– 等待时间统计
– 等待对象分析
– 等待原因分析
5. 应用调试
– 应用执行流程
– SQL执行顺序
– 事务处理流程
– 错误处理流程
2.3 跟踪文件分析最佳实践
Oracle跟踪文件分析最佳实践:
- 及时分析:及时分析错误相关的跟踪文件
- 定期清理:定期清理旧的跟踪文件
- 使用工具:使用TKPROF等工具分析
- 记录结果:记录分析结果和解决方案
- 预防措施:制定预防措施避免问题
Part03-生产环境项目实施方案
3.1 跟踪文件分析配置
3.1.1 配置跟踪文件生成
SQL> select value from v$parameter where name = ‘user_dump_dest’;
VALUE
————————————————–
/oracle/app/oracle/diag/rdbms/fgedudb/FGEDUDB/trace
# 2. 查看当前会话跟踪文件
SQL> select tracefile from v$process where addr = (
select paddr from v$session where sid = sys_context(‘userenv’, ‘sid’)
);
TRACEFILE
————————————————–
/oracle/app/oracle/diag/rdbms/fgedudb/FGEDUDB/trace/FGEDUDB_ora_12345.trc
# 3. 启用会话跟踪
SQL> alter session set sql_trace = true;
Session altered.
# 4. 启用10046事件跟踪
SQL> alter session set events ‘10046 trace name context forever, level 12’;
Session altered.
# 5. 使用DBMS_SESSION启用跟踪
SQL> exec dbms_session.set_sql_trace(true);
PL/SQL procedure successfully completed.
# 6. 使用DBMS_MONITOR启用跟踪
SQL> exec dbms_monitor.session_trace_enable(session_id => 150, serial_num => 1234, waits => true, binds => true);
PL/SQL procedure successfully completed.
# 7. 禁用跟踪
SQL> alter session set sql_trace = false;
Session altered.
SQL> alter session set events ‘10046 trace name context off’;
Session altered.
# 8. 使用DBMS_MONITOR禁用跟踪
SQL> exec dbms_monitor.session_trace_disable(session_id => 150, serial_num => 1234);
PL/SQL procedure successfully completed.
# 9. 查看跟踪文件内容
$ cat /oracle/app/oracle/diag/rdbms/fgedudb/FGEDUDB/trace/FGEDUDB_ora_12345.trc
Trace file /oracle/app/oracle/diag/rdbms/fgedudb/FGEDUDB/trace/FGEDUDB_ora_12345.trc
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 – Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
ORACLE_HOME = /oracle/app/oracle/product/19c/dbhome_1
System name: Linux
Node name: db01
Release: 5.4.17-2102.200.13.el8uek.x86_64
Version: #2 SMP Fri Jun 24 13:15:15 PDT 2026
Machine: x86_64
Instance name: FGEDUDB
Redo thread mounted by this instance: 1
Oracle process number: 30
Unix process pid: 12345, image: oracle@db01 (TNS V1-V3)
*** 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
*** CLIENT DRIVER:(SQL*PLUS) 2026-03-31 10:00:00.123
*** CONTAINER ID:(1) 2026-03-31 10:00:00.123
WAIT #140123456789012: nam=’SQL*Net message to client’ ela= 2 driver id=1650815232 #bytes=1 p3=0 obj#=-1 tim=1234567890123
WAIT #140123456789012: nam=’SQL*Net message from client’ ela= 123456 driver id=1650815232 #bytes=1 p3=0 obj#=-1 tim=1234568013579
3.1.2 配置跟踪文件分析
$ tkprof /oracle/app/oracle/diag/rdbms/fgedudb/FGEDUDB/trace/FGEDUDB_ora_12345.trc output=/home/oracle/trace_output.txt
TKPROF: Release 19.0.0.0.0 – Production on Tue Mar 31 10:00:00 2026
Copyright (c) 1982, 2019, Oracle and/or its affiliates. All rights reserved.
# 2. 查看TKPROF输出
$ cat /home/oracle/trace_output.txt
TKPROF: Release 19.0.0.0.0 – Production on Tue Mar 31 10:00:00 2026
Copyright (c) 1982, 2019, Oracle and/or its affiliates. All rights reserved.
Trace file: /oracle/app/oracle/diag/rdbms/fgedudb/FGEDUDB/trace/FGEDUDB_ora_12345.trc
Sort options: default
**************************************************************************
count = number of times OCI procedure was executed
cpu = cpu time in seconds executing
elapsed = elapsed time in seconds executing
disk = number of physical reads of buffers from disk
query = number of buffers gotten for consistent read
current = number of buffers gotten in current mode (usually for update)
rows = number of rows processed by the fetch or execute call
**************************************************************************
SQL ID: a1b2c3d4e5f6g
Plan Hash: 1234567890
select *
from
scott.emp where empno = 7369
call count cpu elapsed disk query current rows
——- —— ——– ———- ———- ———- ———- ———-
Parse 1 0.00 0.00 0 0 0 0
Execute 1 0.00 0.00 0 0 0 0
Fetch 2 0.00 0.00 0 2 0 1
——- —— ——– ———- ———- ———- ———- ———-
total 4 0.00 0.00 0 2 0 1
Misses in library cache during parse: 1
Optimizer mode: ALL_ROWS
Parsing user id: 84
Rows Row Source Operation
——- —————————————————
1 TABLE ACCESS BY INDEX ROWID EMP (cr=2 pr=0 pw=0 time=123 us cost=1 size=38 card=1)
1 INDEX UNIQUE SCAN PK_EMP (cr=1 pr=0 pw=0 time=67 us cost=0 size=0 card=1)(object id 12345)
**************************************************************************
# 3. 使用TKPROF排序选项
$ tkprof /oracle/app/oracle/diag/rdbms/fgedudb/FGEDUDB/trace/FGEDUDB_ora_12345.trc output=/home/oracle/trace_sorted.txt sort=prsela,exeela,fchela
# 4. 使用TKPROF生成执行计划
$ tkprof /oracle/app/oracle/diag/rdbms/fgedudb/FGEDUDB/trace/FGEDUDB_ora_12345.trc output=/home/oracle/trace_explain.txt explain=scott/tiger table=scott.temp
# 5. 使用TRCSESS合并跟踪文件
$ trcsess output=/home/oracle/merged_trace.trc session=150.1234 /oracle/app/oracle/diag/rdbms/fgedudb/FGEDUDB/trace/*.trc
# 6. 使用ADRCI查看跟踪文件
$ adrci
ADRCI: Release 19.0.0.0.0 – Production on Tue Mar 31 10:00:00 2026
adrci> show tracefile
ADR Home = /oracle/app/oracle/diag/rdbms/fgedudb/FGEDUDB:
*************************************************************************
diag/rdbms/fgedudb/FGEDUDB/trace/FGEDUDB_ora_12345.trc
diag/rdbms/fgedudb/FGEDUDB/trace/FGEDUDB_ora_12346.trc
diag/rdbms/fgedudb/FGEDUDB/trace/FGEDUDB_lgwr_1234.trc
adrci> show tracefile FGEDUDB_ora_12345.trc
# 7. 使用ADRCI搜索跟踪文件
adrci> show tracefile -t
ADR Home = /oracle/app/oracle/diag/rdbms/fgedudb/FGEDUDB:
*************************************************************************
03-31 10:00 diag/rdbms/fgedudb/FGEDUDB/trace/FGEDUDB_ora_12345.trc
03-31 09:00 diag/rdbms/fgedudb/FGEDUDB/trace/FGEDUDB_ora_12346.trc
03-31 08:00 diag/rdbms/fgedudb/FGEDUDB/trace/FGEDUDB_lgwr_1234.trc
# 8. 创建跟踪文件分析脚本
$ vi /home/oracle/scripts/analyze_trace.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 PATH=$ORACLE_HOME/bin:$PATH
TRACE_FILE=$1
OUTPUT_DIR=”/home/oracle/trace_analysis”
mkdir -p $OUTPUT_DIR
if [ -z “$TRACE_FILE” ]; then
echo “Usage: $0
exit 1
fi
BASENAME=$(basename $TRACE_FILE .trc)
OUTPUT_FILE=”$OUTPUT_DIR/${BASENAME}_analysis.txt”
echo “Analyzing trace file: $TRACE_FILE” > $OUTPUT_FILE
echo “Generated: $(date)” >> $OUTPUT_FILE
echo “========================================” >> $OUTPUT_FILE
# 使用TKPROF分析
echo “” >> $OUTPUT_FILE
echo “TKPROF Analysis:” >> $OUTPUT_FILE
echo “—————-” >> $OUTPUT_FILE
tkprof $TRACE_FILE output=$OUTPUT_DIR/${BASENAME}_tkprof.txt sort=prsela,exeela,fchela >> $OUTPUT_FILE 2>&1
# 统计信息
echo “” >> $OUTPUT_FILE
echo “Statistics:” >> $OUTPUT_FILE
echo “———–” >> $OUTPUT_FILE
echo “Total lines: $(wc -l < $TRACE_FILE)" >> $OUTPUT_FILE
echo “Total size: $(du -h $TRACE_FILE | cut -f1)” >> $OUTPUT_FILE
echo “Analysis completed. Output: $OUTPUT_FILE”
# 9. 执行分析脚本
$ chmod +x /home/oracle/scripts/analyze_trace.sh
$ /home/oracle/scripts/analyze_trace.sh /oracle/app/oracle/diag/rdbms/fgedudb/FGEDUDB/trace/FGEDUDB_ora_12345.trc
3.2 跟踪文件分析监控
3.2.1 配置跟踪文件监控脚本
$ vi /home/oracle/scripts/monitor_trace_files.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 PATH=$ORACLE_HOME/bin:$PATH
TRACE_DIR=”/oracle/app/oracle/diag/rdbms/fgedudb/FGEDUDB/trace”
LOG_DIR=”/home/oracle/scripts/trace_monitor”
mkdir -p $LOG_DIR
echo “$(date): Starting trace file monitoring…” > $LOG_DIR/monitor.log
# 统计跟踪文件数量
TRACE_COUNT=$(find $TRACE_DIR -name “*.trc” -type f | wc -l)
echo “$(date): Total trace files: $TRACE_COUNT” >> $LOG_DIR/monitor.log
# 统计跟踪文件大小
TRACE_SIZE=$(du -sh $TRACE_DIR | cut -f1)
echo “$(date): Total trace size: $TRACE_SIZE” >> $LOG_DIR/monitor.log
# 检查大跟踪文件
echo “$(date): Large trace files (>100M):” >> $LOG_DIR/monitor.log
find $TRACE_DIR -name “*.trc” -type f -size +100M -exec ls -lh {} \; >> $LOG_DIR/monitor.log 2>&1
# 检查最近的跟踪文件
echo “$(date): Recent trace files (last hour):” >> $LOG_DIR/monitor.log
find $TRACE_DIR -name “*.trc” -type f -mmin -60 -exec ls -lh {} \; >> $LOG_DIR/monitor.log 2>&1
# 检查ORA错误跟踪文件
echo “$(date): Trace files with ORA errors:” >> $LOG_DIR/monitor.log
for trace_file in $(find $TRACE_DIR -name “*.trc” -type f -mmin -60); do
if grep -q “ORA-” $trace_file; then
echo “$(date): $trace_file contains ORA errors” >> $LOG_DIR/monitor.log
grep “ORA-” $trace_file | head -5 >> $LOG_DIR/monitor.log
fi
done
echo “$(date): Trace file monitoring completed.” >> $LOG_DIR/monitor.log
# 发送报告
mail -s “Trace File Monitor Report” admin@fgedu.net.cn < $LOG_DIR/monitor.log
# 2. 设置脚本权限
$ chmod +x /home/oracle/scripts/monitor_trace_files.sh
# 3. 测试脚本
$ /home/oracle/scripts/monitor_trace_files.sh
# 4. 设置定期监控
$ crontab -e
# 每小时监控跟踪文件
0 * * * * /home/oracle/scripts/monitor_trace_files.sh >> /home/oracle/scripts/trace_monitor/monitor.log 2>&1
3.2.2 配置跟踪文件清理
$ vi /home/oracle/scripts/cleanup_trace_files.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 PATH=$ORACLE_HOME/bin:$PATH
TRACE_DIR=”/oracle/app/oracle/diag/rdbms/fgedudb/FGEDUDB/trace”
LOG_DIR=”/home/oracle/scripts/trace_cleanup”
mkdir -p $LOG_DIR
RETENTION_DAYS=7
echo “$(date): Starting trace file cleanup…” > $LOG_DIR/cleanup.log
# 清理旧的跟踪文件
echo “$(date): Removing trace files older than $RETENTION_DAYS days…” >> $LOG_DIR/cleanup.log
find $TRACE_DIR -name “*.trc” -type f -mtime +$RETENTION_DAYS -exec rm -f {} \; -exec echo “Removed: {}” \; >> $LOG_DIR/cleanup.log 2>&1
# 清理旧的跟踪映射文件
find $TRACE_DIR -name “*.trm” -type f -mtime +$RETENTION_DAYS -exec rm -f {} \; -exec echo “Removed: {}” \; >> $LOG_DIR/cleanup.log 2>&1
# 统计清理后的空间
TRACE_SIZE=$(du -sh $TRACE_DIR | cut -f1)
echo “$(date): Current trace size: $TRACE_SIZE” >> $LOG_DIR/cleanup.log
echo “$(date): Trace file cleanup completed.” >> $LOG_DIR/cleanup.log
# 发送报告
mail -s “Trace File Cleanup Report” admin@fgedu.net.cn < $LOG_DIR/cleanup.log
# 2. 设置脚本权限
$ chmod +x /home/oracle/scripts/cleanup_trace_files.sh
# 3. 测试脚本
$ /home/oracle/scripts/cleanup_trace_files.sh
# 4. 设置定期清理
$ crontab -e
# 每周日凌晨4点清理跟踪文件
0 4 * * 0 /home/oracle/scripts/cleanup_trace_files.sh >> /home/oracle/scripts/trace_cleanup/cleanup.log 2>&1
3.3 跟踪文件分析故障处理
3.3.1 ORA-00600错误分析
$ grep “ORA-00600” /oracle/app/oracle/diag/rdbms/fgedudb/FGEDUDB/trace/FGEDUDB_ora_12345.trc
ORA-00600: internal error code, arguments: [1234], [1], [2], [3], [4], [5], [6], [7]
# 分析步骤
# 1. 查看跟踪文件头部
$ head -50 /oracle/app/oracle/diag/rdbms/fgedudb/FGEDUDB/trace/FGEDUDB_ora_12345.trc
Trace file /oracle/app/oracle/diag/rdbms/fgedudb/FGEDUDB/trace/FGEDUDB_ora_12345.trc
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 – Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
ORACLE_HOME = /oracle/app/oracle/product/19c/dbhome_1
System name: Linux
Node name: db01
Release: 5.4.17-2102.200.13.el8uek.x86_64
Version: #2 SMP Fri Jun 24 13:15:15 PDT 2026
Machine: x86_64
Instance name: FGEDUDB
Redo thread mounted by this instance: 1
Oracle process number: 30
Unix process pid: 12345, image: oracle@db01 (TNS V1-V3)
# 2. 查看错误堆栈
$ grep -A 20 “ORA-00600” /oracle/app/oracle/diag/rdbms/fgedudb/FGEDUDB/trace/FGEDUDB_ora_12345.trc
ORA-00600: internal error code, arguments: [1234], [1], [2], [3], [4], [5], [6], [7]
—– Call Stack Trace —–
ksedmp()+421<-ksddmp()+1161<-ksdmp_stack()+89<-ksdmp_stack_int()+49<-dbgexPhaseII()+1279<-dbgexProcessError()+321<-dbgeExecuteErrorToEvent()+729<-dbgePostErrorKGE()+1645<-dbkePostKGE_kgsf()+71<-kgeadse()+455<-kgerinv_internal()+175<-kgerinv()+75<-kgeasnmi()+69<-ksasnd()+409<-ksucln()+345<-ksucin()+113<-ksusig()+713<-skgesig()+114<-skgesig_WaitInterrupt()+169<-ksliwat()+2369<-kslwaitns()+73<-kslwait()+89<-ksbabs()+2449<-ksbrdp()+1145<-opirip()+673<-opidrv()+903<-sou2o()+103<-opimai_real()+233<-opimai()+173<-main()+153<-__libc_start_main()+243
# 3. 查看相关SQL
$ grep -B 10 "ORA-00600" /oracle/app/oracle/diag/rdbms/fgedudb/FGEDUDB/trace/FGEDUDB_ora_12345.trc | grep "select\|update\|insert\|delete"
select * from scott.emp where empno = 7369
# 4. 使用ADRCI查看事件
$ adrci
adrci> show incident
ADR Home = /oracle/app/oracle/diag/rdbms/fgedudb/FGEDUDB:
*************************************************************************
INCIDENT_ID PROBLEM_KEY CREATE_TIME
——————– ———————————————————– ————————————–
12345 ORA 600 [1234] 2026-03-31 10:00:00.123456 +08:00
adrci> show incident -mode detail -p “incident_id=12345”
# 5. 解决方案
# – 查看Oracle Support文档
# – 应用相关补丁
# – 联系Oracle Support
# – 临时规避措施
3.3.2 性能问题分析
SQL> alter session set events ‘10046 trace name context forever, level 12’;
Session altered.
# 2. 执行问题SQL
SQL> select * from scott.emp where deptno = 10;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
———- ———- ——— ———- ——— ———- ———- ———-
7782 CLARK MANAGER 7839 09-JUN-81 2450 10
7839 KING PRESIDENT 17-NOV-81 5000 10
7934 MILLER CLERK 7782 23-JAN-82 1300 10
# 3. 禁用跟踪
SQL> alter session set events ‘10046 trace name context off’;
Session altered.
# 4. 使用TKPROF分析
$ tkprof /oracle/app/oracle/diag/rdbms/fgedudb/FGEDUDB/trace/FGEDUDB_ora_12345.trc output=/home/oracle/slow_sql.txt sort=prsela,exeela,fchela
# 5. 查看分析结果
$ cat /home/oracle/slow_sql.txt
SQL ID: a1b2c3d4e5f6g
Plan Hash: 1234567890
select * from scott.emp where deptno = 10
call count cpu elapsed disk query current rows
——- —— ——– ———- ———- ———- ———- ———-
Parse 1 0.00 0.00 0 0 0 0
Execute 1 0.00 0.00 0 0 0 0
Fetch 2 0.00 0.01 5 7 0 3
——- —— ——– ———- ———- ———- ———- ———-
total 4 0.00 0.01 5 7 0 3
Misses in library cache during parse: 1
Optimizer mode: ALL_ROWS
Parsing user id: 84
Rows Row Source Operation
——- —————————————————
3 TABLE ACCESS FULL EMP (cr=7 pr=5 pw=0 time=12345 us cost=3 size=114 card=3)
Elapsed times include waiting on following events:
Event waited on Times Max. Wait Total Waited
—————————————- Waited ———- ————
SQL*Net message to client 2 0.00 0.00
db file sequential read 5 0.01 0.01
SQL*Net message from client 2 0.01 0.01
# 6. 分析结果
# – 执行了全表扫描
# – 有5次物理读
# – 建议在deptno列上创建索引
# 7. 创建索引
SQL> create index idx_emp_deptno on scott.emp(deptno);
Index created.
# 8. 验证性能改善
SQL> select * from scott.emp where deptno = 10;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
———- ———- ——— ———- ——— ———- ———- ———-
7782 CLARK MANAGER 7839 09-JUN-81 2450 10
7839 KING PRESIDENT 17-NOV-81 5000 10
7934 MILLER CLERK 7782 23-JAN-82 1300 10
Execution Plan
———————————————————-
Plan hash value: 2345678901
——————————————————————————————-
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)|
——————————————————————————————-
| 0 | SELECT STATEMENT | | 3 | 114 | 2 (0)|
| 1 | TABLE ACCESS BY INDEX ROWID BATCHED| EMP | 3 | 114 | 2 (0)|
|* 2 | INDEX RANGE SCAN | IDX_EMP_DEPTNO | 3 | | 1 (0)|
——————————————————————————————-
Predicate Information (identified by operation id):
—————————————————
2 – access(“DEPTNO”=10)
Part04-生产案例与实战讲解
4.1 跟踪文件分析分析案例
在生产环境中使用跟踪文件分析的完整案例:
4.1.1 场景描述
某企业生产数据库出现性能问题,需要使用跟踪文件分析进行诊断。
4.1.2 分析步骤
$ vi /home/oracle/scripts/analyze_slow_sql.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
# 慢SQL跟踪分析脚本
export ORACLE_HOME=/oracle/app/oracle/product/19c/dbhome_1
export ORACLE_SID=FGEDUDB
export PATH=$ORACLE_HOME/bin:$PATH
LOG_DIR=”/home/oracle/scripts/slow_sql_analysis”
mkdir -p $LOG_DIR
DATE=$(date +%Y%m%d)
REPORT_FILE=”$LOG_DIR/slow_sql_$DATE.txt”
echo “Slow SQL Analysis Report” > $REPORT_FILE
echo “Generated: $(date)” >> $REPORT_FILE
echo “========================================” >> $REPORT_FILE
# 启用跟踪
sqlplus -s / as sysdba <
set serveroutput on
— 查找慢SQL
select sql_id, sql_text, elapsed_time/1000000 as elapsed_sec, executions
from v\$sql
where elapsed_time/1000000 > 5
order by elapsed_time desc
fetch first 10 rows only;
exit
EOF
# 分析慢SQL
echo “” >> $REPORT_FILE
echo “Top 10 Slow SQL Statements:” >> $REPORT_FILE
echo “—————————-” >> $REPORT_FILE
# 发送报告
mail -s “Slow SQL Analysis Report” admin@fgedu.net.cn < $REPORT_FILE
# 2. 设置脚本权限
$ chmod +x /home/oracle/scripts/analyze_slow_sql.sh
# 3. 测试脚本
$ /home/oracle/scripts/analyze_slow_sql.sh
# 4. 设置定期分析
$ crontab -e
# 每天早上6点分析慢SQL
0 6 * * * /home/oracle/scripts/analyze_slow_sql.sh >> /home/oracle/scripts/slow_sql_analysis/analysis.log 2>&1
4.2 跟踪文件分析故障处理
在跟踪文件分析故障处理过程中的方法和技巧:
4.2.1 故障处理流程
# 1. 故障识别
# – 识别错误类型
# – 定位跟踪文件
# – 确认错误时间
# 2. 故障分析
# – 查看跟踪文件内容
# – 分析错误堆栈
# – 确定错误原因
# 3. 故障处理
# – 制定解决方案
# – 执行修复操作
# – 验证修复结果
# 4. 故障预防
# – 制定预防措施
# – 监控相关指标
# – 定期检查
# 示例:跟踪文件分析故障处理
# 1. 故障识别
$ grep “ORA-” /oracle/app/oracle/diag/rdbms/fgedudb/FGEDUDB/trace/FGEDUDB_ora_12345.trc | tail -5
ORA-01555: snapshot too old: rollback segment number 1 with name “_SYSSMU1$” too small
# 2. 故障分析
$ grep -B 20 “ORA-01555” /oracle/app/oracle/diag/rdbms/fgedudb/FGEDUDB/trace/FGEDUDB_ora_12345.trc
# 3. 故障处理
SQL> alter system set undo_retention = 3600 scope=both;
System altered.
# 4. 验证修复结果
$ grep “ORA-01555” /oracle/app/oracle/diag/rdbms/fgedudb/FGEDUDB/trace/FGEDUDB_ora_*.trc | tail -5
# 没有新的ORA-01555错误
4.3 跟踪文件分析优化
优化跟踪文件分析配置的最佳实践:
4.3.1 优化跟踪文件分析管理
SQL> create or replace procedure analyze_trace_file(
p_trace_file in varchar2
) as
v_command varchar2(4000);
v_output_file varchar2(4000);
begin
dbms_output.put_line(‘— Trace File Analysis —‘);
dbms_output.put_line(‘Trace File: ‘ || p_trace_file);
— 生成输出文件名
v_output_file := replace(p_trace_file, ‘.trc’, ‘_analysis.txt’);
— 使用TKPROF分析
v_command := ‘tkprof ‘ || p_trace_file || ‘ output=’ || v_output_file || ‘ sort=prsela,exeela,fchela’;
dbms_output.put_line(‘Output File: ‘ || v_output_file);
dbms_output.put_line(‘Command: ‘ || v_command);
— 可以使用外部表或UTL_FILE读取结果
end analyze_trace_file;
/
Procedure created.
# 2. 执行自动化存储过程
SQL> set serveroutput on
SQL> exec analyze_trace_file(‘/oracle/app/oracle/diag/rdbms/fgedudb/FGEDUDB/trace/FGEDUDB_ora_12345.trc’);
— Trace File Analysis —
Trace File: /oracle/app/oracle/diag/rdbms/fgedudb/FGEDUDB/trace/FGEDUDB_ora_12345.trc
Output File: /oracle/app/oracle/diag/rdbms/fgedudb/FGEDUDB/trace/FGEDUDB_ora_12345_analysis.txt
Command: tkprof /oracle/app/oracle/diag/rdbms/fgedudb/FGEDUDB/trace/FGEDUDB_ora_12345.trc output=/oracle/app/oracle/diag/rdbms/fgedudb/FGEDUDB/trace/FGEDUDB_ora_12345_analysis.txt sort=prsela,exeela,fchela
PL/SQL procedure successfully completed.
# 3. 创建跟踪文件分析历史表
SQL> create table trace_analysis_history (
id number primary key,
analysis_time date,
trace_file varchar2(4000),
sql_id varchar2(13),
elapsed_time number,
cpu_time number,
buffer_gets number,
disk_reads number,
rows_processed number
);
Table created.
SQL> create sequence trace_analysis_seq;
Sequence created.
# 4. 查看跟踪文件分析历史
SQL> column analysis_time format a20
SQL> column trace_file format a50
SQL> select id, analysis_time, sql_id, elapsed_time
from trace_analysis_history
order by analysis_time desc
fetch first 10 rows only;
ID ANALYSIS_TIME SQL_ID ELAPSED_TIME
———- ——————– ————- ————
1 2026-03-31 10:00:00 a1b2c3d4e5f6g 1234567
2 2026-03-31 09:00:00 b2c3d4e5f6g7h 987654
Part05-风哥经验总结与分享
5.1 跟踪文件分析总结
Oracle跟踪文件是DBA进行故障诊断和性能分析的重要工具,具有以下特点:
- 详细记录:记录进程执行的详细信息
- 错误诊断:包含错误堆栈和诊断信息
- 性能分析:包含等待事件和执行统计
- 自动生成:错误发生时自动生成
- 手动生成:可以手动启用跟踪
5.2 跟踪文件分析检查清单
Oracle跟踪文件分析检查清单:
- 分析时机:确定何时需要分析跟踪文件
- 分析工具:选择合适的分析工具
- 分析范围:确定分析哪些跟踪文件
- 及时处理:及时处理发现的问题
- 定期清理:定期清理旧的跟踪文件
- 文档记录:记录分析过程
5.3 跟踪文件分析工具推荐
Oracle跟踪文件分析工具推荐:
- TKPROF:格式化SQL跟踪文件
- TRCSESS:合并多个跟踪文件
- ADRCI:Oracle诊断工具
- DBMS_MONITOR:启用会话跟踪
- 10046事件:SQL跟踪事件
- Shell脚本:自动化分析过程
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
