一、什么是跟踪文件?
跟踪文件中蕴含了大量而具体的诊断和调试信息。通过对跟踪文件的解读和剖析,咱们能够定位问题、剖析问题和解决问题。从跟踪文件的产生的起源来看,跟踪文件又能够分为两类:一类是数据库的操作人员无意生成的;另一类则是因为呈现了异样谬误,由数据库主动生成的。对于后一类,只对 Oracle 外部的技术支持人员是有用的,但对于咱们,则多半看不懂。前一类,则是咱们常常用到的,帮忙咱们剖析、调整和优化利用性能,解决并解决问题。
那么在哪里能够找到跟踪文件呢?通过查问数据字典 v$diag_info 能够确定跟踪文件的存储门路,如下所示。
select * from v$diag_info;
进入目录 /u01/app/oracle/diag/rdbms/orcl/orcl/trace 能够看到以 trc 为后缀的跟踪文件,如下图所示。
二、跟踪文件的命名规定
一个跟踪文件的名字个别由以下几局部组成:
- ORACLE_SID
- 固定字符
- 服务器的过程 ID 号
- 文件后缀名 .trc
- 各局部之间以下划线连贯。
例如:orcl_mmon_12210.trc,其中:“orcl” 是本环境下数据库的 SID,”12210″ 为产生该跟踪文件会话所应用的服务器过程 ID 号。如何晓得我的 ORACLE_SID 和会话所应用的服务器过程 ID 呢?
三、如何确定跟踪文件?
为了演示的不便,咱们给一个普通用户 scott 授予 dba 的角色。
1、应用治理登录,并授予 scott 授予 dba 的角色
[oracle@oracle12c ~]$ sqlplus / as sysdba
SQL> grant dba to scott;
Grant succeeded.
SQL>
2、确定 Oracle SID,如下所示。这里的 SID 就是:orcl
SQL> select instance_name from V$instance;
INSTANCE_NAME
----------------
orcl
SQL>
3、切换到 scott 用户,并确定会话 ID
SQL> conn scott/tiger
Connected.
SQL> select sid from v$mystat where rownum=1;
SID
----------
70
SQL>
4、依据会话 ID,确定会话的地址信息
SQL> select paddr from v$session where sid=70;
PADDR
----------------
000000006DAB6588
SQL>
5、依据会话的地址信息,确定操作系统的过程号
SQL> select spid from v$process where addr='000000006DAB6588';
SPID
------------------------
54685
SQL>
进入目录 /u01/app/oracle/diag/rdbms/orcl/orcl/trace 会发现,此时并不存在蕴含 54685 的跟踪文件,起因是要应用跟踪文件须要手动开启会话的跟踪。
6、开启会话的跟踪
SQL> alter session set sql_trace=true;
Session altered.
SQL>
7、执行一条简略的 SQL 语句,并查看 /u01/app/oracle/diag/rdbms/orcl/orcl/trace 目录,这时候就能够看到生成的跟踪文件。
[oracle@oracle12c trace]$ pwd
/u01/app/oracle/diag/rdbms/orcl/orcl/trace
[oracle@oracle12c trace]$ ls *54685.trc
orcl_ora_54685.trc
[oracle@oracle12c trace]$
四、应用跟踪文件诊断 SQL
依据跟踪对于诊断 SQL 语句是十分有用的,上面通过一个简略的示例来阐明。
1、执行上面的的 SQL 语句
select * from scott.emp where deptno=10;
select * from scott.emp where deptno=20;
select * from scott.emp where deptno=30;
这三条 SQL 别离查问 10、20 和 30 号部门的员工。通过观察发现,这三条 SQL 除了 where 的条件的参数值不一样,其余局部都是一样的。这样的 SQL 语句叫做“反复的 SQL”。如果数据库中存在大量的反复 SQL,会使得每次在执行的时候都会进行 SQL 的解析,再生成执行打算。从而影响数据库的性能。
上面通过跟踪文件来验证下面的论断。
2、因为后面开启了会话的跟踪,如果不再须要进行跟踪了,须要手动敞开一下。
SQL> alter session set sql_trace=false;
Session altered.
SQL>
3、应用 tkprof 工具格式化跟踪文件
[oracle@oracle12c trace]$ tkprof orcl_ora_54685.trc /home/oracle/a.txt sys=no sort=fchela
TKPROF: Release 12.2.0.1.0 - Development on Mon Jun 28 10:37:48 2021
Copyright (c) 1982, 2017, Oracle and/or its affiliates. All rights reserved.
[oracle@oracle12c trace]$
4、查看生成的 a.txt 文件,如下所示:
SQL ID: 1mvxd868z75nf Plan Hash: 3956160932
select *
from scott.emp where deptno=30
SQL ID: 2nbac4n9hnzth Plan Hash: 3956160932
select *
from scott.emp where deptno=20
SQL ID: 062r5atccuyv4 Plan Hash: 3956160932
select *
from scott.emp where deptno=10
能够看成只管三条 SQL 对应的 SQL ID 不一样,然而生成的 Plan Hash 是一样的。这就阐明这三条 SQL 的执行打算是一样的。既然如此,咱们能够应用绑定变量的形式来改写这三条 SQL。让这三条 SQL 语句在执行的时候,不必每次都生成执行打算。只须要复用第一次生成的执行打算即可。从而进步性能。