一、什么是跟踪文件?
跟踪文件中蕴含了大量而具体的诊断和调试信息。通过对跟踪文件的解读和剖析,咱们能够定位问题、剖析问题和解决问题。从跟踪文件的产生的起源来看,跟踪文件又能够分为两类:一类是数据库的操作人员无意生成的;另一类则是因为呈现了异样谬误,由数据库主动生成的。对于后一类,只对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 sysdbaSQL> grant dba to scott;Grant succeeded.SQL>
2、确定Oracle SID,如下所示。这里的SID就是:orcl
SQL> select instance_name from V$instance;INSTANCE_NAME----------------orclSQL>
3、切换到scott用户,并确定会话ID
SQL> conn scott/tigerConnected.SQL> select sid from v$mystat where rownum=1; SID---------- 70SQL>
4、依据会话ID,确定会话的地址信息
SQL> select paddr from v$session where sid=70;PADDR----------------000000006DAB6588SQL>
5、依据会话的地址信息,确定操作系统的过程号
SQL> select spid from v$process where addr='000000006DAB6588';SPID------------------------54685SQL>
进入目录/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.trcorcl_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=fchelaTKPROF: Release 12.2.0.1.0 - Development on Mon Jun 28 10:37:48 2021Copyright (c) 1982, 2017, Oracle and/or its affiliates. All rights reserved.[oracle@oracle12c trace]$
4、查看生成的a.txt文件,如下所示:
SQL ID: 1mvxd868z75nf Plan Hash: 3956160932select *from scott.emp where deptno=30SQL ID: 2nbac4n9hnzth Plan Hash: 3956160932select *from scott.emp where deptno=20SQL ID: 062r5atccuyv4 Plan Hash: 3956160932select *from scott.emp where deptno=10
能够看成只管三条SQL对应的SQL ID不一样,然而生成的Plan Hash是一样的。这就阐明这三条SQL的执行打算是一样的。既然如此,咱们能够应用绑定变量的形式来改写这三条SQL。让这三条SQL语句在执行的时候,不必每次都生成执行打算。只须要复用第一次生成的执行打算即可。从而进步性能。