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


Posted in Oracle onJune 28, 2021

一、什么是跟踪文件?

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

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

select * from v$diag_info;

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

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

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

二、跟踪文件的命名规则

一个跟踪文件的名字一般由以下几部分组成:

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

以上就是使用Oracle的跟踪文件的详细内容,更多关于Oracle跟踪文件的资料请关注三水点靠木其它相关文章!

Oracle 相关文章推荐
Oracle笔记
Apr 05 Oracle
oracle DGMGRL ORA-16603报错的解决方法(DG Broker)
Apr 06 Oracle
ORACLE数据库对long类型字段进行模糊匹配的解决思路
Apr 07 Oracle
oracle通过存储过程上传list保存功能
May 12 Oracle
Oracle 区块链表创建过程详解
May 15 Oracle
oracle连接ODBC sqlserver数据源的详细步骤
Jul 25 Oracle
C#连接ORACLE出现乱码问题的解决方法
Oct 05 Oracle
详解Oracle块修改跟踪功能
Nov 07 Oracle
Oracle中update和select 关联操作
Jan 18 Oracle
详细聊聊Oracle表碎片对性能有多大的影响
Mar 19 Oracle
Oracle 多表查询基本语法实例
Apr 18 Oracle
排查并解决Oracle sysaux表空间异常增长
Apr 20 Oracle
SQL模糊查询报:ORA-00909:参数个数无效问题的解决
ORACLE查看当前账号的相关信息
DBCA命令行搭建Oracle ADG的流程
ORACLE数据库应用开发的三十个注意事项
Jun 07 #Oracle
Oracle创建只读账号的详细步骤
Oracle11g R2 安装教程完整版
Oracle11g r2 卸载干净重装的详细教程(亲测有效已重装过)
You might like
PHP 读取和编写 XML
2014/11/19 PHP
php实现查询功能(数据访问)
2017/05/23 PHP
js判断浏览器的比较全的代码
2007/02/13 Javascript
一段效率很高的for循环语句使用方法
2007/08/13 Javascript
File文件控件,选中文件(图片,flash,视频)即立即预览显示
2009/04/09 Javascript
jQuery getJSON 处理json数据的代码
2010/07/26 Javascript
Knockout visible绑定使用方法
2013/11/15 Javascript
javascript中setTimeout使用指南
2015/07/26 Javascript
jquery读写cookie操作实例分析
2015/12/24 Javascript
解决Vue2.x父组件与子组件之间的双向绑定问题
2018/03/06 Javascript
解决Nodejs全局安装模块后找不到命令的问题
2018/05/15 NodeJs
Bootstrap Table中的多选框删除功能
2018/07/15 Javascript
JS判断字符串是否为整数的方法--简单的正则判断
2018/07/23 Javascript
node.js环境搭建图文详解
2018/09/19 Javascript
vue自定义指令directive的使用方法
2019/04/07 Javascript
es6中let和const的使用方法详解
2020/02/24 Javascript
Python版实现微信公众号扫码登陆
2020/05/28 Javascript
Element Badge标记的使用方法
2020/07/27 Javascript
Python中处理字符串的相关的len()方法的使用简介
2015/05/19 Python
python生成每日报表数据(Excel)并邮件发送的实例
2019/02/03 Python
详解Django+uwsgi+Nginx上线最佳实战
2019/03/14 Python
tensorflow 固定部分参数训练,只训练部分参数的实例
2020/01/20 Python
利用Python实现自动扫雷小脚本
2020/12/17 Python
使用CSS3来制作消息提醒框
2015/07/12 HTML / CSS
面向对象编程OOP的优点
2013/01/22 面试题
说出你对remoting 和webservice的理解和应用
2014/06/08 面试题
初中同学聚会邀请函
2014/02/03 职场文书
高中毕业生登记表自我鉴定范文
2014/03/18 职场文书
2014年业务工作总结
2014/11/17 职场文书
2015年小学图书室工作总结
2015/05/18 职场文书
2016年六一文艺汇演开幕词
2016/03/04 职场文书
话题作文之成长
2019/12/09 职场文书
Django利用AJAX技术实现博文实时搜索
2021/05/06 Python
JavaScript展开运算符和剩余运算符的区别详解
2022/02/18 Javascript
Python语言内置数据类型
2022/02/24 Python
Golang使用Panic与Recover进行错误捕获
2022/03/22 Golang