










数据库教程FGMT12‑Oracle性能诊断与综合分析
在Oracle数据库调优工作当中,AWR、ASH属于实例聚合统计工具,适合做整体数据库负载分析。但遇到单条SQL解析异常、优化器选错执行计划、绑定变量带来性能抖动、会话内部等待细节无法被聚合报告完整呈现的疑难故障时,就需要深度跟踪诊断工具。SQL_TRACE、10046事件、10053优化器跟踪、Oradebug、TKPROF、SQL Monitor、SQLTXPLAIN、SPA、Database Replay共同组成Oracle深度诊断工具集,用来捕获SQL完整解析流程、绑定变量、等待事件、CBO成本计算内部逻辑,完成疑难性能问题定位。风哥教程本文围绕跟踪文件获取、各类跟踪事件底层原理、工具实操、复杂故障完整诊断流程展开完整讲解。风哥 itpux‑com
本套风哥教程面向DBA、数据库运维工程师、后端开发人员,全部实验标准化环境配置:主机名称fgedu‑net‑cn,硬件规格64G物理内存、8颗CPU;数据库实例名fgedudb,数据库名fgedudb,测试业务用户名fgedu,文件根目录统一为/fgedudb,整套实验基于Oracle19c企业版完成。风哥教程本文分为前言大纲介绍、核心理论知识、实战操作演练、总结四大模块;实战章节包含大量可直接复制运行SQL脚本、操作系统操作步骤,读者可以在测试环境完整复现全部实验现象,掌握疑难SQL故障深度定位全套手段。网上搜索风哥教程可以学习全套数据库教程
本章节为本套风哥教程理论基础,只有理解各个跟踪诊断工具底层原理,才能够根据故障场景选择合适工具,规避跟踪带来额外性能开销。风哥教程 113257174
AWR、ASH属于聚合采样类工具,做实例、会话级别统计汇总;Trace类工具属于完整捕获工具,会记录每一次解析、执行、fetch获取行、等待事件、绑定变量详细信息。不同工具能力与适用场景有明确边界:
许可提示:SQL Monitor依赖Diagnostics Pack;SPA、Database Replay属于Real Application Testing授权组件,商用生产使用需要对应许可;sql_trace、10046、10053、tkprof、SQLTXPLAIN、SQLHC无额外许可约束。网上搜索风哥教程可以学习全套数据库教程
Oracle11g之后使用ADR自动诊断仓库统一管理trace文件。关键初始化参数:
DIAGNOSTIC_DEST:ADR根目录,本实验环境配置为/fgedudb/diag,trace文件存放路径 DIAGNOSTIC_DEST/diag/rdbms/fgedudb/fgedudb/trace。TIMED_STATISTICS:必须设置TRUE,跟踪才会采集CPU、等待时间;FALSE情况下trace时间统计全部无效。MAX_DUMP_FILE_SIZE:trace文件最大大小,繁忙会话跟踪会生成巨大trc文件,生产一般设置unlimited。TRACEFILE_IDENTIFIER:给trace文件增加自定义标识字符串,方便海量trace文件快速定位目标跟踪文件。风险:开启跟踪会带来额外CPU、IO开销,生产环境禁止对全实例长时间开启跟踪;尽量只针对故障会话、故障SQL开启,排查完成立刻关闭跟踪。严禁alter system全局设置10046事件,会造成实例所有会话开启跟踪,数据库性能严重下降,仅允许会话级别、指定进程级别开启。
10046事件是sql_trace增强,不同级别控制捕获内容:
10053不跟踪SQL执行过程,只跟踪CBO优化器解析SQL、计算各个候选计划成本的内部过程。当出现统计信息正常,但优化器依然生成错误执行计划,就需要10053跟踪,查看优化器读取了哪些统计、如何计算各个访问路径与连接方式成本,为什么丢弃了更优计划。10053仅在SQL硬解析阶段产生内容,软解析不会生成跟踪输出。风哥数据库教程 itpux‑com
当SQL执行时间超过5秒,会被SQL Monitor自动监控;也可以手工强制开启监控。v$sql_monitor、v$sql_plan_monitor视图实时记录SQL每一步行源的行数、CPU、逻辑读、物理读、内存临时段使用。不需要开启trace,几乎无额外开销,适合长时间运行大SQL实时观察执行进度。
SQL Tuning Health Check(SQLHC)为轻量级脚本,不需要安装schema,直接运行脚本输入sql_id即可输出报告,适合快速诊断。
SQLTXPLAIN是Oracle支持部门常用免费工具,安装独立schema;输入sql_id,自动收集:对象定义、统计信息、直方图、当前执行计划、历史AWR执行计划、绑定变量、10046跟踪、10053跟踪,打包输出html报告,一站式完成单SQL全方位信息采集,省去DBA多次执行各类查询。
完整四大阶段:捕获负载 → 预处理负载文件 → 在测试库重放负载 → 重放报告对比。捕获阶段记录所有客户端提交给数据库的调用;重放阶段在测试库原样复现业务流量,用于验证数据库重大变更整体风险。
本套风哥教程全部实战操作,操作主机fgedu‑net‑cn,数据库fgedudb,业务用户fgedu,目录/fgedudb,硬件规格64G内存8CPU。
环境说明:操作系统登录oracle用户,设置环境变量指向
fgedudb实例;跟踪、调试类操作大部分需要sysdba权限。trace文件输出路径为/fgedudb/diag/rdbms/fgedudb/fgedudb/trace。
#确认主机名称
hostname
#确认ORACLE_HOME路径全部指向/fgedudb
echo $ORACLE_HOME
#查看内存硬件,确认64G内存
free -h
#查看CPU,确认8CPU
lscpu
#确认trace目录存在
ls -ld /fgedudb/diag/rdbms/fgedudb/fgedudb/trace
校验输出:hostname输出fgedu‑net‑cn,总内存64G,逻辑CPU数量8,trace目录权限oracle用户可读写。
登录sqlplus / as sysdba查看关键参数
show parameter statistics_level;
show parameter timed_statistics;
show parameter max_dump_file_size;
show parameter diagnostic_dest;
show parameter memory_target;
show parameter sga_target;
show parameter pga_aggregate_target;
适配64G内存主机spfile标准配置
alter system set memory_max_target=48G scope=spfile;
alter system set memory_target=48G scope=spfile;
alter system set statistics_level=TYPICAL scope=spfile;
alter system set timed_statistics=TRUE scope=both;
alter system set max_dump_file_size=unlimited scope=both;
alter system set diagnostic_dest='/fgedudb/diag' scope=spfile;
timed_statistics=TRUE是所有跟踪采集时间指标的前提;max_dump_file_size设置unlimited避免大跟踪文件被截断。重启实例使spfile修改生效。
create user fgedu identified by fgedudb default tablespace users temporary tablespace temp;
grant connect,resource to fgedu;
grant select_catalog_role to fgedu;
grant advisor to fgedu;
grant execute on dbms_monitor to fgedu;
grant execute on dbms_sqldiag to fgedu;
grant execute on dbms_sqlpa to fgedu;
grant execute on dbms_workload_capture to fgedu;
grant execute on dbms_workload_replay to fgedu;
alter session set tracefile_identifier='fgedu_test_trace';
select value from v$diag_info where name='Default Trace File';
返回的完整路径即为trc原始跟踪文件路径,位于/fgedudb/diag/rdbms/fgedudb/fgedudb/trace目录下。网上搜索风哥教程可以学习全套数据库教程
conn fgedu/fgedudb@fgedudb
alter session set sql_trace=true;
--执行待诊断业务SQL
select count(*) from t_big;
alter session set sql_trace=false;
sql_trace等价10046 level1,只记录解析执行统计,不会捕获绑定变量、等待事件,故障排查优先使用10046 level12。
conn fgedu/fgedudb@fgedudb
alter session set tracefile_identifier='fgedu_10046_level12';
alter session set events '10046 trace name context forever, level 12';
--复现故障SQL
select * from t_big where code=100;
--关闭跟踪
alter session set events '10046 trace name context off';
首先查询目标业务会话sid与serial#
select sid,serial#,username,program from v$session where username='FGEDU';
传入查询得到的sid、serial_num
conn / as sysdba
exec dbms_monitor.session_trace_enable(session_id=>142,serial_num=>234,waits=>true,binds=>true);
--通知业务复现故障SQL
exec dbms_monitor.session_trace_disable(session_id=>142,serial_num=>234);
select s.sid,s.serial#,p.spid from v$session s join v$process p on s.paddr=p.addr where s.username='FGEDU';
拿到spid,登录sqlplus / as sysdba执行oradebug
oradebug setospid 27891
oradebug event 10046 trace name context forever,level 12;
--业务侧复现问题SQL
oradebug event 10046 trace name context off;
oradebug tracefile_name;
oradebug tracefile_name直接打印完整trc文件路径,省去操作系统查找文件步骤。
原始.trc文件可读性极差,需要使用操作系统tkprof工具格式化,主机fgedu‑net‑cnoracle用户下执行bash命令。
#进入trace目录
cd /fgedudb/diag/rdbms/fgedudb/fgedudb/trace
#tkprof格式化,sys=no过滤系统递归SQL,waits=yes输出等待事件
tkprof fgedudb_ora_27891_fgedu_10046_level12.trc fgedu_10046_report.txt \
sort=prsela,exeela,fchela sys=no waits=yes aggregate=yes explain=fgedu/fgedudb
参数说明:
注意:tkprof无法处理10053优化器跟踪文件,10053只能直接阅读原始trc文本。风哥数据库教程 itpux‑com
注意:10053只在硬解析时产生输出;如果SQL已经存在于共享池,需要刷新共享池或者增加SQL注释触发硬解析。
conn fgedu/fgedudb@fgedudb
alter session set tracefile_identifier='fgedu_10053_trace';
alter session set events '10053 trace name context forever, level 1';
--增加注释,强制硬解析
select /*+ test_10053 */ * from t_big where code=100;
alter session set events '10053 trace name context off';
--获取trace完整路径
select value from v$diag_info where name='Default Trace File';
拿到trc文件,操作系统直接vi查看,tkprof不能解析10053内容。报告重点看:优化器读取的表统计、各个访问路径cost计算值、为什么抛弃候选访问路径。
SQL Monitor适合长时间运行SQL,不需要开启trace,几乎无额外开销。
set linesize 200 pagesize 100
col sql_text format a80
select sql_id,sql_text,status,elapsed_time,cpu_time,buffer_gets,disk_reads
from v$sql_monitor
where status<>'DONE';
set long 1000000
set longchunksize 1000000
set pagesize 0
set linesize 200
select dbms_sqltune.report_sql_monitor(sql_id=>'&input_sql_id',type=>'HTML') from dual;
输出html内容复制保存为本地html文件,可以浏览器打开,直观看到每一步行源真实行数、IO、CPU消耗。
SQLHC是Oracle支持免费脚本,不需要安装schema,下载sqlhc.sql上传主机fgedu‑net‑cn的/fgedudb/tmp目录。
#上传脚本到/fgedudb/tmp
cd /fgedudb/tmp
sysdba登录执行脚本,参数T代表拥有Diagnostics Pack许可,传入待分析sql_id。
conn / as sysdba
@sqlhc.sql T &sql_id
脚本执行完毕,在当前目录生成zip压缩包,解压后包含html、txt全套诊断信息:表定义、统计、直方图、执行计划、AWR历史信息。网上搜索风哥教程可以学习全套数据库教程
SQLT功能比SQLHC更加完整,需要安装独立schema。将sqlt安装包上传至/fgedudb/tmp。
cd /fgedudb/tmp
unzip sqlt.zip
sysdba执行安装脚本,创建sqlt用户。
conn / as sysdba
@sqlt/install/sqltinstall.sql
安装完成之后,针对目标sql_id执行诊断:
conn sqlt/sqlt
@sqlt/run/sqlt.sql &sql_id
执行完毕生成zip报告,包含10046、10053跟踪输出、各类字典视图查询结果,适合提交Oracle支持做疑难SQL分析。
SPA需要Real Application Testing许可;适用场景:数据库升级、参数变更、索引变更前,评估业务SQL性能退化风险。
conn / as sysdba
declare
v_sts_name varchar2(60):='FGEDU_STS';
begin
dbms_sqltune.create_sqlset(sqlset_name=>v_sts_name,description=>'fgedu业务SQL集合');
dbms_sqltune.load_sqlset(
sqlset_name=>v_sts_name,
populate_cursor=>cursor(select * from table(dbms_sqltune.select_workload_repository(begin_snap=>100,end_snap=>120))));
end;
/
declare
v_task_name varchar2(60):='FGEDU_SPA_TASK';
begin
dbms_sqlpa.drop_analysis_task(task_name=>v_task_name);
:v_task_name:=dbms_sqlpa.create_analysis_task(sqlset_name=>'FGEDU_STS',task_name=>v_task_name);
end;
/
begin
dbms_sqlpa.execute_analysis_task(
task_name=>'FGEDU_SPA_TASK',
execution_type=>'TEST EXECUTE',
execution_name=>'BEFORE_CHANGE');
end;
/
begin
dbms_sqlpa.execute_analysis_task(
task_name=>'FGEDU_SPA_TASK',
execution_type=>'TEST EXECUTE',
execution_name=>'AFTER_CHANGE');
end;
/
begin
dbms_sqlpa.execute_analysis_task(
task_name=>'FGEDU_SPA_TASK',
execution_type=>'COMPARE PERFORMANCE',
execution_name=>'COMPARE_AFTER');
end;
/
set long 1000000
select dbms_sqlpa.report_analysis_task(task_name=>'FGEDU_SPA_TASK',type=>'HTML') from dual;
报告中可以直接看到哪些SQL性能退化,哪些得到优化。
Database Replay属于Real Application Testing组件,适合完整回放数据库业务负载,验证重大变更整体影响。
mkdir -p /fgedudb/replay_capture
chown oracle:oinstall /fgedudb/replay_capture
conn / as sysdba
create directory replay_cap_dir as '/fgedudb/replay_capture';
begin
dbms_workload_capture.start_capture(
name=>'FGEDU_CAPTURE_01',
dir=>'REPLAY_CAP_DIR',
duration=>3600); --捕获时长,单位秒
end;
/
业务在捕获时间段正常运行,模拟真实业务流量;时间到达自动结束捕获,也可以手动结束:
exec dbms_workload_capture.finish_capture();
begin
dbms_workload_replay.process_capture(capture_name=>'FGEDU_CAPTURE_01',dir=>'REPLAY_CAP_DIR');
end;
/
cd /fgedudb/replay_capture
wrc system/******@fgedudb mode=replay replaydir=/fgedudb/replay_capture
begin
dbms_workload_replay.initialize_replay(replay_name=>'FGEDU_REPLAY_01',replay_dir=>'REPLAY_CAP_DIR');
dbms_workload_replay.prepare_replay(synchronization=>TRUE);
dbms_workload_replay.start_replay();
end;
/
dbms_xplan.display_cursor真实执行计划,对比E‑ROWS预估行数与A‑ROWS实际行数,判断统计信息是否失真。本套风哥教程完整覆盖Oracle深度性能诊断全套工具,从Trace底层原理、10046/10053事件原理,tkprof格式化,oradebug进程附着跟踪,到SQL Monitor、SQLHC、SQLT、SPA、Database Replay整套实操命令,同时明确各个工具许可边界、生产风险约束。
alter system全局开启10046事件,会造成实例所有会话开启跟踪,引发严重性能故障;跟踪结束必须确认已经关闭跟踪事件,避免trace文件持续暴涨占满磁盘。dbms_monitor包;oradebug仅用于无法获取会话代码修改权限、后台进程跟踪场景。此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。