关于oracle:赵强老师使用Oracle的跟踪文件

55次阅读

共计 2536 个字符,预计需要花费 7 分钟才能阅读完成。

一、什么是跟踪文件?

跟踪文件中蕴含了大量而具体的诊断和调试信息。通过对跟踪文件的解读和剖析,咱们能够定位问题、剖析问题和解决问题。从跟踪文件的产生的起源来看,跟踪文件又能够分为两类:一类是数据库的操作人员无意生成的;另一类则是因为呈现了异样谬误,由数据库主动生成的。对于后一类,只对 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 语句在执行的时候,不必每次都生成执行打算。只须要复用第一次生成的执行打算即可。从而进步性能。

正文完
 0