好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

使用Oracle跟踪文件的问题详解

一、什么是跟踪文件?

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

那么在哪里可以找到跟踪文件呢?通过查询数据字典v$diag_info可以确定跟踪文件的存储路径,如下所示。

?

1

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的角色

?

1

2

3

4

5

6

7

[oracle@oracle12c ~]$ sqlplus / as sysdba

 

sql> grant dba to scott;

 

grant succeeded.

 

sql>

2、确定oracle sid,如下所示。这里的sid就是:orcl

?

1

2

3

4

5

6

7

sql> select instance_name from v$instance;

 

instance_name

----------------

orcl

 

sql>

3、切换到scott用户,并确定会话id

?

1

2

3

4

5

6

7

8

9

sql> conn scott/tiger

connected.

sql> select sid from v$mystat where rownum=1;

 

        sid

----------

     70

 

sql>

4、根据会话id,确定会话的地址信息

?

1

2

3

4

5

6

7

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

 

paddr

----------------

000000006dab6588

 

sql>

5、根据会话的地址信息,确定操作系统的进程号

?

1

2

3

4

5

6

7

sql> select spid from v$process where addr= '000000006dab6588' ;

 

spid

------------------------

54685

 

sql>

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

6、开启会话的跟踪

?

1

2

3

4

5

sql> alter session set sql_trace= true ;

 

session altered.

 

sql>

7、执行一条简单的sql语句,并检查/u01/app/oracle/diag/rdbms/orcl/orcl/trace目录,这时候就可以看到生成的跟踪文件。

?

1

2

3

4

5

[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语句

?

1

2

3

4

5

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、由于前面开启了会话的跟踪,如果不再需要进行跟踪了,需要手动关闭一下。

?

1

2

3

4

5

sql> alter session set sql_trace= false ;

 

session altered.

 

sql>

3、使用tkprof工具格式化跟踪文件

?

1

2

3

4

5

6

[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文件,如下所示:

?

1

2

3

4

5

6

7

8

9

10

11

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语句在执行的时候,不用每次都生成执行计划。只需要复用第一次生成的执行计划即可。从而提高性能。

以上就是使用oracle的跟踪文件的详细内容,更多关于oracle跟踪文件的资料请关注服务器之家其它相关文章!

原文链接:https://www.cnblogs.com/collen7788/archive/2021/06/28/14943853.html

查看更多关于使用Oracle跟踪文件的问题详解的详细内容...

  阅读:34次