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


    一、什么是跟踪文件?

    跟踪文件中包含了大量而详细的诊断和调试信息。通过对跟踪文件的解读和分析,我们可以定位问题、分析问题和解决问题。从跟踪文件的产生的来源来看,跟踪文件又可以分为两类:一类是数据库的操作人员有意生成的;另一类则是由于出现了异常错误,由数据库自动生成的。对于后一类,只对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语句在执行的时候,不用每次都生成执行计划。只需要复用第一次生成的执行计划即可。从而提高性能。

  • 相关阅读:
    Windows 环境下配置 git bash 的 HOME 默认路径
    SQL Server 2008 r2 输入SQL语句不能自动提示的解决办法
    搭建调用 WebService 的 ASP.NET 网站 (VS2010, C#)
    【问题解决】线程间操作无效:从不是创建控件“textBox1”的线程访问它
    使用 hexdump dump 文件内容
    调用 WebService 浏览器提示 500 (Internal Server Error) 的原因及解决办法
    PHP的文件格式应该以UTF-8无BOM编码
    继电器电路
    ROS零门槛教程系列(二)——Linux常用指令:mkdir、tar、 unzip、cp、scp、mv、rm、find、apt、ssh
    ROS零门槛教程系列(一)——ubuntu安装
  • 原文地址:https://www.cnblogs.com/collen7788/p/14943853.html
Copyright © 2020-2023  润新知