设为首页 收藏本站
查看: 1266|回复: 0

[经验分享] SQL_Trace/10046事件

[复制链接]

尚未签到

发表于 2018-10-23 11:12:24 | 显示全部楼层 |阅读模式
  SQL_TRACE是Oracle提供的用于进行SQL跟踪的手段。在日常的数据库问题诊断和解决中,SQL_TRACE是非常常用的方法。
  当某个应用比较慢时,可以使用SQL_TRACE或者10046事件对其应用跟踪。然后可以通过对此跟踪信息的分析,找出应用比较慢的原因。
  SQL_TRACE:
  SQL_TRACE可以作为初始化参数在整个数据库启用,也可以通过命令行方式在具体session启用。
  数据库级别:
  在整个数据库启用SQL_TRACE会导致所有进程的活动被跟踪,包括后台进程及所有用户进程。效率缓慢,慎用。
--第1种  
sql_trace =true
  

  
--第2种
  
alter system set sql_trace =true scope=spfile;
  Session级别:
  跟踪当前session。
--开始session级trace跟踪  
alter session set sql_trace=true;
  

  
SELECT to_number('asdf') FROM dual;
  

  
--结束trace跟踪
  
alter session set sql_trace=false;
  使用存储过程:
  可以跟踪其他用户的进程,而并非当前用户。
--DBMS_SYSTEM.SET_SQL_TRACE_IN_SESSION  
--用以查询sid,serial#
  
SELECT Sid, Serial#, Username
  
  FROM V$session
  
WHERE Username IS NOT NULL;
  

  
--开始
  
Sys.Dbms_System.Set_Sql_Trace_In_Session(Sid       => &Sid,
  
                                         Serial#   => &Serial#,
  
                                         Sql_Trace => TRUE);
  

  
--结束
  
Sys.Dbms_System.Set_Sql_Trace_In_Session(Sid       => &Sid,
  
                                         Serial#   => &Serial#,
  
                                         Sql_Trace => FALSE);
  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级设置。
  数据库级:
  此设置对所有用户的所有进程生效、包括后台进程。
  在参数文件中增加:
Event="10046 trace name context forever, level 12"  Session级:
  通过alter session的方式修改,需要alter session的系统权限。
--开始  
alter session set events '10046 trace name context forever, level 12';
  

  
--结束
  
alter session set events '10046 trace name context off';
  使用存储过程:
  可以跟踪其他用户的进程,而并非当前用户。
--Dbms_System.Set_Ev  

  
--用以查询sid,serial#
  
SELECT Sid, Serial#, Username
  
  FROM V$session
  
WHERE Username IS NOT NULL;
  

  
--开始
  
Sys.Dbms_System.Set_Ev(Si => &Sid,
  
                       Se => &Serial#,
  
                       Ev => &Event, --10046
  
                       Le => &Level, --1,4,8,12
  
                       Nm => &Name --随便取名
  
                       );
  

  
--结束
  
Sys.Dbms_System.Set_Ev(Si => &Sid,
  
                       Se => &Serial#,
  
                       Ev => &Event, --10046
  
                       Le => 0, --0为不跟踪
  
                       Nm => &Nm);
  获取trace文件名:
  获取默认文件名SQL如下:
--第1种  
SELECT u_Dump.Value || '/' || Lower(Db_Name.Value) || '_ora_' ||
  
       V$process.Spid ||
  
       Nvl2(V$process.Traceid, '_' || V$process.Traceid, NULL) || '.trc' "Trace File"
  
  FROM V$parameter u_Dump
  
CROSS JOIN V$parameter Db_Name
  
CROSS JOIN V$process
  
  JOIN V$session
  
    ON V$process.Addr = V$session.Paddr
  
WHERE u_Dump.Name = 'user_dump_dest'
  
   AND Db_Name.Name = 'db_name'
  
   AND V$session.Audsid = Sys_Context('userenv', 'sessionid');
  

  
--第2种
  
SELECT d.Value || '/' || Lower(Rtrim(i.Instance, Chr(0))) || '_ora_' ||
  
       p.Spid || '.trc' AS "trace_file_name"
  
  FROM (SELECT p.Spid
  
          FROM V$mystat m, V$session s, V$process p
  
         WHERE m.Statistic# = 1
  
           AND s.Sid = m.Sid
  
           AND p.Addr = s.Paddr) p,
  
       (SELECT t.Instance
  
          FROM V$thread t, V$parameter v
  
         WHERE v.Name = 'thread'
  
           AND (v.Value = 0 OR t.Thread# = To_Number(v.Value))) i,
  
       (SELECT VALUE
  
          FROM V$parameter
  
         WHERE NAME = 'user_dump_dest') d;
  eg:
  /data03/DEV4/db/9.2.0/admin/DEV4_mistest/udump/dev4_ora_9359834.trc
  读取当前session设置的参数:
  当通过alter session的方式设置了sql_trace,这个设置需要通过dbms_system.read_ev来获取:
DBMS_SYSTEM.READ_EV(  
iev IN BINARY INTEGER, --Event number; usually between 10000 and 10999
  
oev OUT BINARY INTEGER --Level at which the event is set; level=0 means the event is disabled
  
);



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-625385-1-1.html 上篇帖子: 获取跟踪文件名称的脚本gettrcname.sql-LinuxOracle 下篇帖子: SQL语句的使用
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表