使用SQL_TRACE进行数据库诊断
SQL_TRACE是Oracle提供的用于进行SQL跟踪的手段,是强有力的辅助诊断工具.在日常的数据库问题诊断和解决中,SQL_TRACE是非常常用的方法。
本文就SQL_TRACE的使用作简单探讨,并通过具体案例对sql_trace的使用进行说明.
一、 基础介绍
(a) SQL_TRACE说明
SQL_TRACE可以作为初始化参数在全局启用,也可以通过命令行方式在具体session启用。
1. 在全局启用
在参数文件(pfile/spfile)中指定:
sql_trace =true
在全局启用SQL_TRACE会导致所有进程的活动被跟踪,包括后台进程及所有用户进程,这通常会导致比较严重的性能问题,所以在生产环境中要谨慎使用,这个参数在10g之后是动态参数,可以随时调整,在某些诊断中非常有效。
提示: 通过在全局启用sql_trace,我们可以跟踪到所有后台进程的活动,很多在文档中的抽象说明,通过跟踪文件的实时变化,我们可以清晰的看到各个进程之间的紧密协调.
2. 在当前session级设置
大多数时候我们使用sql_trace跟踪当前进程.通过跟踪当前进程可以发现当前操作的后台数据库递归活动(这在研究数据库新特性时尤其有效),
研究SQL执行,发现后台错误等.
在session级启用和停止sql_trace方式如下:
启用当前session的跟踪:
SQL> alter session set sql_trace=true; Session altered. 此时的SQL操作将被跟踪:
SQL> select count(*) from dba_users; COUNT(*)
----------
34
结束跟踪:
SQL> alter session set sql_trace=false; Session altered.
3. 跟踪其他用户进程
在很多时候我们需要跟踪其他用户的进程,而不是当前用户,这可以通过Oracle提供的系统包DBMS_SYSTEM. SET_SQL_TRACE_IN_SESSION
来完成
SET_SQL_TRACE_IN_SESSION过程序要提供三个参数:
SQL> desc dbms_system
...
PROCEDURE SET_SQL_TRACE_IN_SESSION
Argument Name Type In/Out Default?
------------------------------ ----------------------- ------ --------
SID NUMBER IN
SERIAL# NUMBER IN
SQL_TRACE BOOLEAN IN
...
通过v$session我们可以获得sid、serial#等信息:
获得进程信息,选择需要跟踪的进程: SQL> select sid,serial#,username from v$session
2 where username is not null; SID SERIAL# USERNAME
---------- ---------- ------------------------------
8 2041 SYS
9 437 EYGLE 设置跟踪:
SQL> exec dbms_system.set_sql_trace_in_session(9,437,true) PL/SQL procedure successfully completed. ....
可以等候片刻,跟踪session执行任务,捕获sql操作...
.... 停止跟踪:
SQL> exec dbms_system.set_sql_trace_in_session(9,437,false) PL/SQL procedure successfully completed.
(b) 10046事件说明
10046事件是Oracle提供的内部事件,是对SQL_TRACE的增强.
10046事件可以设置以下四个级别:
1 - 启用标准的SQL_TRACE功能,等价于sql_trace
4 - Level 1 加上绑定值(bind values)
8 - Level 1 + 等待事件跟踪
12 - Level 1 + Level 4 + Level 8
类似sql_trace,10046事件可以在全局设置,也可以在session级设置。
1. 在全局设置
在参数文件中增加:
event="10046 trace name context forever,level 12"
此设置对所有用户的所有进程生效、包括后台进程.
2. 对当前session设置
通过alter session的方式修改,需要alter session的系统权限:
SQL> alter session set events '10046 trace name context forever'; Session altered. SQL> alter session set events '10046 trace name context forever, level 8'; Session altered. SQL> alter session set events '10046 trace name context off'; Session altered.
3. 对其他用户session设置
通过DBMS_SYSTEM.SET_EV系统包来实现:
SQL> desc dbms_system
...
PROCEDURE SET_EV
Argument Name Type In/Out Default?
------------------------------ ----------------------- ------ --------
SI BINARY_INTEGER IN
SE BINARY_INTEGER IN
EV BINARY_INTEGER IN
LE BINARY_INTEGER IN
NM VARCHAR2 IN ... 其中的参数SI、SE来自v$session视图:
查询获得需要跟踪的session信息:
SQL> select sid,serial#,username from v$session where username is not null;
SID SERIAL# USERNAME
---------- ---------- ------------------------------
8 2041 SYS
9 437 EYGLE
执行跟踪:
SQL> exec dbms_system.set_ev(9,437,10046,8,'eygle');
PL/SQL procedure successfully completed.
结束跟踪:
SQL> exec dbms_system.set_ev(9,437,10046,0,'eygle');
PL/SQL procedure successfully completed.
(c) 获取跟踪文件
以上生成的跟踪文件位于user_dump_dest目录中,位置及文件名可以通过以下SQL查询获得:
SQL> select
2 d.value||'/'||lower(rtrim(i.instance, chr(0)))||'_ora_'||p.spid||'.trc' trace_file_name
3 from
4 ( select p.spid
5 from sys.v$mystat m,sys.v$session s,sys.v$process p
6 where m.statistic# = 1 and s.sid = m.sid and p.addr = s.paddr) p,
7 ( select t.instance from sys.v$thread t,sys.v$parameter v
8 where v.name = 'thread' and (v.value = 0 or t.thread# = to_number(v.value))) i,
9 ( select value from sys.v$parameter where name = 'user_dump_dest') d
10 /TRACE_FILE_NAME
--------------------------------------------------------------------------------
/opt/oracle/admin/hsjf/udump/hsjf_ora_1026.trc
(d) 读取当前session设置的参数
当我们通过alter session的方式设置了sql_trace,这个设置是不能通过show parameter的方式得到的,我们需要通过dbms_system.read_ev来获取:
SQL> set feedback off
SQL> set serveroutput onSQL> declare
2 event_level number;
3 begin
4 for event_number in 10000..10999 loop
5 sys.dbms_system.read_ev(event_number, event_level);
6 if (event_level > 0) then
7 sys.dbms_output.put_line(
8 'Event ' ||
9 to_char(event_number) ||
10 ' is set at level ' ||
11 to_char(event_level)
12 );
13 end if;
14 end loop;
15 end;
16 /
Event 10046 is set at level 1
使用SQL_TRACE进行数据库诊断的更多相关文章
- Oracle配置数据库诊断
环境:RHEL 6.4 + Oracle 11.2.0.4 1. 设置ADR 2. 使用Support Workbench 3. 恢复块介质 Reference 1. 设置ADR 1.1 查看v$di ...
- 转://11g之后,通过v$wait_chains视图诊断数据库hang和Contention
1g之前,通常我们数据库hang住了之后,我们会对数据库做hang analyze来进行分析,在11g之后,我们可以通过一个新的视图v$wait_chains来诊断数据库hang和contention ...
- 【巨杉数据库SequoiaDB】巨杉Tech | 四步走,快速诊断数据库集群状态
1.背景 SequoiaDB 巨杉数据库是一款金融级分布式数据库,包括了分布式 NewSQL.分布式文件系统与对象存储.与高性能 NoSQL 三种存储模式,分别对应分布式在线交易.非结构化数据和内容管 ...
- sql_trace基本用法
sql_trace是oracle提供的一个非常好的跟踪工具,主要用来检查数据库的异常情况,通过跟踪数据库的活动,找到有问题的语句. 一.概述: SQL_TRACE是Oracle的一个非常强大的工 ...
- CentOS以及Oracle数据库发展历史及各版本新功能介绍, 便于构造环境时有个对应关系
CentOS版本历史 版本 CentOS版本号有两个部分,一个主要版本和一个次要版本,主要和次要版本号分别对应于RHEL的主要版本与更新包,CentOS采取从RHEL的源代码包来构建.例如CentOS ...
- Oracle 自己主动诊断资料档案库 (ADR)、自己主动诊断工作流、ADRCI工具
1.自己主动诊断工作流: 通过一个始终处于打开状态的内存中跟踪工具,数据库组件能够在第一次出现严重错误故障时捕获诊断数据.系统将自己主动维护一个称为"自己主动诊断资料档案库"的特殊 ...
- Azure SQL 数据库新服务级别现已正式发布
T.K.Ranga Rengarajan 2014 年 9 月 10 日上午 11:00 我们很高兴地宣布,新的 SQL 数据库服务级被基本.标准和高级级别现已正式发布.这些服务级别中含有内置且可 ...
- Oracle数据库的版本变迁功能对比
Oracle数据库自发布至今,也经历了一个从不稳定到稳定,从功能简单至强大的过程.从第二版开始,Oracle的每一次版本变迁,都具有里程碑意义. 1979年的夏季,RSI(Oracle公司的前身,Re ...
- 第十五章:Oracle12c 数据库 警告日志
一:查看警告日志文件的位置 Oracle 12c环境下查询,alert日志并不在bdump目录下,看到网上和书上都写着可以通过初始化参数background_dump_dest来查看alter日志路径 ...
随机推荐
- mapper.xml中的<sql>标签
原文链接:http://blog.csdn.net/a281246240/article/details/53445547 sql片段标签<sql>:通过该标签可定义能复用的sql语句片段 ...
- 修改centos地址连接为自动连接
1.进入目录/etc/sysconfig/network-scripts/ 2.修改ifcfg-etn0 文件 (即你的网卡标识命名的配置文件) 3.将ONBOOT=no改成yes 4.保存后重启 ...
- 取消div,a等标签点击效果
当标签被设置onclick事件之后,在有些手机浏览器中,点击这些标签,会有点击变色效果.想要取消点击变色效果. 添加:div{-webkit-tap-highlight-color:rgba(0,0, ...
- 监测mysql错误日志,有错误自动邮件报警
监测mysql错误日志,有错误自动邮件报警 http://blog.csdn.net/yabingshi_tech/article/details/51443401 MySQL:监控慢日志.错误日志. ...
- memcached安装+绑定访问ip
安装: 1.由于memcached是基于libevent的,需要安装libevent,libevent-devel $yum -y install libevent libevent-devel 2. ...
- netcore 配置文件使用
一直在记录整理接口调用,但是最近发现关于项目在vs中本地启动也有许多方便的地方. 首先由于使用的是Java的Eureka和网关来做的服务基础, 然后服务就涉及到注册一说, 问题是,如果appsetti ...
- 求问asp.net mvc发布问题
正常发布 浏览后如下
- React Native - 4 ListView 简单使用
1. 首先要import ListView组件 2. 使用如下代码,注意ListView里的dataSource大小写,我当时把S给小写了,结果花了半个多小时找原因…… 3. 运行结果
- 战火魔兽CJQ圣印问题
本来一直是玩的T的. 一次偶然机会打了次团本,用CJQ(毒蛇),在副本中问CJQ用什么圣印 有人说命令,有人说腐蚀... 对此做先研究 无BUFF木桩测试:5分钟(开sp翅膀,不踩奉献,技能什么好了按 ...
- thinkphp之自动完成
1.自动完成 自动完成是ThinkPHP提供用来完成数据自动处理和过滤的方法,使用create方法创建数据对象的时候会自动完成数据处理. 因此,在ThinkPHP使用create方法来创建数据对象是 ...