【赵强老师】使用Oracle的跟踪文件

1、什么是跟踪文件?

跟踪文件中包含了大量而详细的诊断和调试信息。经过对跟踪文件的解读和分析,咱们能够定位问题、分析问题和解决问题。从跟踪文件的产生的来源来看,跟踪文件又能够分为两类:一类是数据库的操做人员有意生成的;另外一类则是因为出现了异常错误,由数据库自动生成的。对于后一类,只对Oracle内部的技术支持人员是有用的,但对于咱们,则多半看不懂。前一类,则是咱们常常用到的,帮助咱们分析、调整和优化应用性能,处理并解决问题。sql

那么在哪里能够找到跟踪文件呢?经过查询数据字典v$diag_info能够肯定跟踪文件的存储路径,以下所示。数据库

select * from v$diag_info;

进入目录/u01/app/oracle/diag/rdbms/orcl/orcl/trace能够看到以trc为后缀的跟踪文件,以下图所示。
服务器

2、跟踪文件的命名规则

一个跟踪文件的名字通常由如下几部分组成:session

  • ORACLE_SID
  • 固定字符
  • 服务器的进程ID号
  • 文件后缀名 .trc
  • 各部分之间如下划线链接。

例如:orcl_mmon_12210.trc,其中:“orcl" 是本环境下数据库的SID,"12210"为产生该跟踪文件会话所使用的服务器进程ID号。如何知道个人ORACLE_SID和会话所使用的服务器进程ID呢?oracle

3、如何肯定跟踪文件?

为了演示的方便,咱们给一个普通用户scott授予dba的角色。app

一、使用管理登陆,并授予scott授予dba的角色

[oracle@oracle12c ~]$ sqlplus / as sysdba

SQL> grant dba to scott;

Grant succeeded.

SQL>

二、肯定Oracle SID,以下所示。这里的SID就是:orcl

SQL> select instance_name from V$instance;

INSTANCE_NAME
----------------
orcl

SQL>

三、切换到scott用户,并肯定会话ID

SQL> conn scott/tiger
Connected.
SQL> select sid from v$mystat where rownum=1;

       SID
----------
	70

SQL>

四、根据会话ID,肯定会话的地址信息

SQL> select paddr from v$session where sid=70;

PADDR
----------------
000000006DAB6588

SQL>

五、根据会话的地址信息,肯定操做系统的进程号

SQL> select spid from v$process where addr='000000006DAB6588';

SPID
------------------------
54685

SQL>

进入目录/u01/app/oracle/diag/rdbms/orcl/orcl/trace会发现,此时并不存在包含54685的跟踪文件,缘由是要使用跟踪文件须要手动开启会话的跟踪。工具

六、开启会话的跟踪

SQL> alter session set sql_trace=true;

Session altered.

SQL>

七、执行一条简单的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]$

4、使用跟踪文件诊断SQL

根据跟踪对于诊断SQL语句是很是有用的,下面经过一个简单的示例来讲明。性能

一、执行下面的的SQL语句

select * from scott.emp where deptno=10;

select * from scott.emp where deptno=20;

select * from scott.emp where deptno=30;

这三条SQL分别查询十、20和30号部门的员工。经过观察发现,这三条SQL除了where的条件的参数值不同,其余部分都是同样的。这样的SQL语句叫作“重复的SQL”。若是数据库中存在大量的重复SQL,会使得每次在执行的时候都会进行SQL的解析,再生成执行计划。从而影响数据库的性能。优化

下面经过跟踪文件来验证上面的结论。操作系统

二、因为前面开启了会话的跟踪,若是再也不须要进行跟踪了,须要手动关闭一下。

SQL> alter session set sql_trace=false;

Session altered.

SQL>

三、使用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]$

四、查看生成的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语句在执行的时候,不用每次都生成执行计划。只须要复用第一次生成的执行计划便可。从而提升性能。

相关文章
相关标签/搜索