首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >使用logon trigger完成动态的session跟踪(r4笔记第29天)

使用logon trigger完成动态的session跟踪(r4笔记第29天)

作者头像
jeanron100
发布于 2018-03-15 07:28:59
发布于 2018-03-15 07:28:59
70100
代码可运行
举报
运行总次数:0
代码可运行

在之前讨论过 关于oracle中session跟踪的总结,可以参见链接 http://blog.itpub.net/23718752/viewspace-1150568/ 基本的session跟踪方法都做了讨论,但是在实际应用中场景可能要复杂一些,比如我们可以对指定的session开诊断事件,如果session中运行的某个环节出现问题,可以根据诊断事件得到比较明细的递归sql来逐步查看排除,知道问题的根源。 但是如果不确定session的情况,因为每次连接进来的session都是不固定的,这样就很难开诊断事件了。 这个还得从这些天的一个例子说起,开发找到我希望我能够帮他们查一个问题,开发需要启动一个job,job会在启动的过程中做一些数据校验检查,然后数据处理,最后退出,但是目前他们碰到的问题是job在启动的时候就会报错,而且没有很详细的日志,所以希望我能够不能帮他们看看,碰到这种问题,一般来说都是友情客串一下,帮他们看看,给点思路,对于更根本的原因还是需要他们自己在调优级别加入一些对应的日志。 得到的错误是一个ORA的错误,但是日志只有简单的几行。为了把问题简化,排除各种场景的干扰,在此我就简单的模拟了一下这个job, 假设这个job需要做下面的事情 sqlplus -s xxx/xxx@test01 <<EOF set feedback off select count(*) from cat; create table catt as select *from cat where rownum<2; drop table catt; select *from catt; EOF 简单的查看一下这个脚本,就会发现最后一步的时候,肯定会报错。因为在倒数第二步中已经把新建的表删除了。再次查看肯定会报ORA-00942: table or view does not exist的错误。 我们就以这个例子来分析一下,怎么使用session跟踪来分析问题。 最开始的想法是通过shell脚本来不断的扫描某个用户下的session,比如job是需要处理用户test下的数据,在job启动的过程就会有一些session链接到test用户,然后做一些操作。我就尝试通过一个循环的脚本来不断的扫描用户test下的session,然后对这些session使用dbms_system.set_sql_trace_in_session来启动session跟踪。 理论上是可行的,但是在实际的操作中还是感觉力不从心,主要有下面几个问题。 一个是我也不知道这个job什么时候启动,所以不断的扫描用户test下的session就会有些频繁,而且需要在脚本中不断的去比较哪些session是已经存在的session,需要排除,本身这个过程就会消耗不少的资源。 还有一个问题是尽管资源消耗可以接受,但是在扫描的过程中不一定能够完全捕捉到那个session,怎么来理解呢,比如某个job在在数据检查工作的时候使用一个session1,然后在数据处理的时候使用4个session,数据处理的速度可能很快,比如1秒钟完成,扫描的过程中就不一定能够完完全全的捕捉到对应的日志。 最后一个就是关闭session跟踪的问题,如果开启了大量的session跟踪,最后需要关闭的时候就需要保证都能够关闭跟踪,否则日志会越来越多,造成不必要的影响。 所以最开始和同事在调试的时候,都是我和他坐在一起,我给他说一声,然后启动后台扫描,然后他启动一下job,我们保持几秒中的时间间隔,尽管这样,遗憾的是还是没有找到相关的日志。 这种方式太不灵活了,而且调试起来确实费时费力。 最后考虑了一下这种灵活性,考虑采用logon trigger来做。 我们可以使用如下的代码来实现这种复杂的需求,如果有用户连进来,就开启10046事件,这样逻辑就灵活了很多,不用我在后台做很多无用功来不断的扫描了,也是按需调试的一种很好的例子。 CREATE OR REPLACE TRIGGER set_trace_on_logon AFTER LOGON ON DATABASE BEGIN if ( user not in ('SYS','SYSTEM' )) then EXECUTE IMMEDIATE 'alter session set statistics_level=ALL'; EXECUTE IMMEDIATE 'alter session set max_dump_file_size=UNLIMITED'; EXECUTE IMMEDIATE 'alter session set tracefile_identifier='''||user||'_10046'''; EXECUTE IMMEDIATE 'alter session set events ''10046 trace name context forever, level 12'''; end if; END set_10046_trace_on_logon; / 注意创建trigger的语句需要在sys下执行,如果在其它dba账户下执行还是有权限的限制,在生成递归sql的时候就有问题了,生成的日志中不会有明细的调试信息,只会包含这些错误和警告。 Skipped error 604 during the execution of N1.SET_TRACE_ON_LOGON *** 2015-01-28 06:27:02.751 dbkedDefDump(): Starting a non-incident diagnostic dump (flags=0x0, level=0, mask=0x0) ----- Error Stack Dump ----- ORA-00604: error occurred at recursive SQL level 1 ORA-01031: insufficient privileges ORA-06512: at line 6 创建了trigger之后,我们再次运行脚本,就会得到预期的ora错误,我们假设最后一步的逻辑很复杂,我们还不能直观的分析出到底是哪出了错。 COUNT(*) ---------- 59 select *from catt * ERROR at line 1: ORA-00942: table or view does not exist 查看生成的trace文件 -rw-r----- 1 ora11g dba 1145 Jan 28 07:05 TEST01_ora_8380_N1_10046.trm -rw-r----- 1 ora11g dba 126028 Jan 28 07:05 TEST01_ora_8380_N1_10046.trc 如果通过tkprof简单格式化trace文件的话,很可能把重要的错误信息也给过滤掉了。我们可以完全自己手工来查看trace文件。 在trace文件中,我们使用关键字”err=“或者"ERROR"来查找一般都能有所收获。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

EXEC #139804991168728:c=1000,e=815,p=0,cr=0,cu=0,mis=0,r=0,dep=1,og=4,plh=2853959010,tim=1422457558003768
FETCH #139804991168728:c=0,e=54,p=0,cr=2,cu=0,mis=0,r=0,dep=1,og=4,plh=2853959010,tim=1422457558003877
CLOSE #139804991168728:c=0,e=9,dep=1,type=3,tim=1422457558004037
=====================
PARSE ERROR #139804993076144:len=17 dep=0 uid=36 oct=3 lid=36 tim=1422457558004335 err=942
select *from catt 
WAIT #139804993076144: nam='SQL*Net break/reset to client' ela= 68 driver id=1650815232 break?=1 p3=0 obj#=-1 tim=1422457558004957
WAIT #139804993076144: nam='SQL*Net break/reset to client' ela= 559 driver id=1650815232 break?=0 p3=0 obj#=-1 tim=1422457558005796
WAIT #139804993076144: nam='SQL*Net message to client' ela= 3 driver id=1650815232 #bytes=1 p3=0 obj#=-1 tim=1422457558005865
WAIT #139804993076144: nam='SQL*Net message from client' ela= 2665 driver id=1650815232 #bytes=1 p3=0 obj#=-1 tim=1422457558008607
XCTEND rlbk=0, rd_only=1, tim=1422457558008854
CLOSE #139804993076144:c=0,e=15,dep=0,type=0,tim=1422457558009096
CLOSE #139804993033288:c=0,e=15,dep=0,type=0,tim=1422457558009186

通过这些日志,我们可以很明显的看到出现了解析错误,报错code为942 对应的sql语句是select *from catt 最后的重要步骤就是需要禁用10046事件,然后删除这个trigger.

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

CREATE OR REPLACE TRIGGER sys.set_trace_on_logon
AFTER LOGON ON DATABASE
BEGIN
  if (  user not in ('SYS','SYSTEM' )) then
    EXECUTE IMMEDIATE 'alter session set statistics_level=ALL';
    EXECUTE IMMEDIATE 'alter session set max_dump_file_size=UNLIMITED';
    EXECUTE IMMEDIATE 'alter session set tracefile_identifier='''||user||'_10046''';
    EXECUTE IMMEDIATE 'alter session set events ''10046 trace name context forever, level 12''';
  end if; 
END set_10046_trace_on_logon;
/
drop trigger sys.set_trace_on_logon;

通过这个例子,能够看出来logon trigger的强大作用,在使用中可以揉入更多的验证规则,在开启了诊断事件或者开启日志的情况下都可以完成session的跟踪,不管多么强大的工具能够完成需求才是根本。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2015-01-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 杨建荣的学习笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
SQL调优和诊断工具之SQL Trace (10046 Event)介绍
为了诊断SQL性能或者其他方面的问题,有时我们需要跟踪SQL语句和的执行过程,这时我们可以启用SQL Trace (10046 Event)来收集语句的执行过程和各种相关信息。
SQLplusDB
2022/08/19
8900
寻找SQL执行线索的武器库
碰到一些SQL问题,有时常规的方式,例如执行计划,不足以给出问题的线索。因此,可能还需要跟踪这条SQL,通过Oracle提供的trace,了解它内部执行的机制,从中寻找线索。
bisal
2023/03/07
7410
寻找SQL执行线索的武器库
19c 新特性 |ADG 备库支持 DML 重定向
在 Oracle 19c 中有众多的新特性,Oracle 官方上有一个专门收集新特性的网站,从 11g 到 21c 均有涉及,并且每一个新特性都对应了官方文档,仅 19c 新特性就有 118 个。
JiekeXu之路
2022/12/07
6260
19c 新特性 |ADG 备库支持 DML 重定向
查看Oracle执行计划的几种常用方法-系列3
续上篇:http://blog.csdn.net/bisal/article/details/39225373
bisal
2019/01/29
8030
外键要建立索引的原理和实验
项目中,我们要求凡是有主子关系的表都要使用外键约束,来保证主子表之间关系的正确,不推荐由应用自己控制这种关系。
bisal
2019/01/29
2.9K0
SQL调优和诊断工具之Optimizer Trace(10053 Event)介绍
通过Optimizer Trace(10053 Event)可以跟踪优化器(CBO)的动作内容,了解CBO是如何选择最优执行计划的,诊断SQL解析时的相关问题。
SQLplusDB
2022/08/19
5380
一个执行计划异常变更的案例 - 外传之查询执行计划的几种方法
《一个执行计划异常变更的案例 - 外传之rolling invalidation》
bisal
2019/01/30
6700
SQL Tuning 基础概述
实例级别还可以在pfile/spfile参数文件中加 sql_trace = true
Alfred Zhao
2019/05/24
4010
【千里之行始于足下】谈Oracle的system表空间
编辑手记:SYSTEM表空间是Oracle数据库最重要的表空间,在创建数据库时被最先创建,其中包含了数据库的元数据,对于数据库来说生死攸关。对于很多初学者,全面了解system表空间就格外重要。 系统表空间是永远不能OFFLINE的,如果SYSTEM表空间OFFLINE,则数据库就无法打开,如果SYSTEM表空间出现故障,则数据库就需要进行介质恢复。在数据库的启动过程中,Oracle也需要通过SYSTEM表空间进行引导。 SYSTEM表空间及root dba 在系统表空间文件头存在一个重要的数据结构root
数据和云
2018/03/07
1.8K0
【千里之行始于足下】谈Oracle的system表空间
实战课堂:为什么更换存储之后一切正常但RAC集群启动不了?
这是一次来自生产实践的真实案例,某客户核心生产库由于进行新老存储替换变更操作后,Oracle RAC 两个节点均无法打开,数据库遭遇严重故障。
数据和云
2018/07/27
5380
实战课堂:为什么更换存储之后一切正常但RAC集群启动不了?
Oracle数据库的初始化与跟踪学习方法
编辑说明:《Oracle性能优化与诊断案例精选》出版以来,收到很多读者的来信和评论,我们会通过连载的形式将书中内容公布出来,希望书中内容能够帮助到更多的读者朋友们。 10046 事件是 Oracle 提供的内部跟踪事件,是对 SQL_TRACE 的增强,通过10046可以通知Oracle内核执行SQL_TRACE类的跟踪操作。如果我们需要获得更多的跟踪信息,就需要用到10046事件,而在实际工作中最常用的就是10046事件。 自11g开始,10046获得了更多的增强,包括明确的在设置中指定SQL_trac
数据和云
2018/03/07
1.6K0
Oracle数据库的初始化与跟踪学习方法
Oracle优化10-SQL_TRACE
当我们想了解一条SQL或者是PL/SQL包的运行情况时,特别是当他们的性能非常差时,比如有的时候看起来就好好像卡在什么地方一样,该如何入手呢?
小小工匠
2021/08/16
9480
使用impdp不当导致的数据丢失问题(r5笔记第1天)
今天有个朋友问我们一个问题,说他在使用了impdp导入数据的时候,使用了TABLE_EXISTS_ACTION=REPLACE这个选项,结果现在数据都给覆盖了。现在没有备份,想问问能不能做相应的恢复操作。 对于这个选项,自己看着熟悉,不过很少用到,碰到了这个问题,首先想到的就是闪回。 不过也不能敷衍,自己在本地做了一个测试,想看看闪回的效果怎么样。首先简单模拟了一下这个问题。 conn n1/n1 SQL> create directory oradmp as '/home/ora11g/oradmp';
jeanron100
2018/03/15
1.2K0
关于oracle中session跟踪的总结(56天)
数据库中的session在操作中可能会有各种各样的问题,比如一条sql语句执行失败,某一个应用在一些特定的场景下就会有一些性能问题等等,有时候在代码层去做一些debug来说肯定是不实际的,而且也不一定能够迅速的排查问题,对于session的监控显得尤为重要。可以灵活的开启和关闭,在数据库层面,session层面,甚至特定的应用层面都能够进行监控,今天和大家分享一下对于的session监控常用的一些方法。 1.dbms_system.set_sql_trace_in_session 可以对其他的session
jeanron100
2018/03/13
1.2K0
Oracle db_file_mulitblock_read_count参数
     Oracle DB_FILE_MULTIBLOCK_READ_COUNT是Oracle比较重要的一个全局性参数,可以影响系统级别及sessioin级别。主要是用于设置最小化表扫描时Oracl
Leshami
2018/08/13
6670
经典故障:四个雷,3*2*2*3种随机方法的特殊恢复案例
墨墨导读:恢复专家前辈给我们精心准备了个故障,埋了四个雷,整个恢复过程感觉像是过山车,整理分享至此,希望对大家有帮助。
数据和云
2020/06/24
6470
经典故障:四个雷,3*2*2*3种随机方法的特殊恢复案例
网罗收集10046的各种Case,方便trace信息的收集 | Oracle官方博客转载
原文链接:https://blogs.oracle.com/database4cn/10046casetrace
SQLplusDB
2020/08/13
5670
启用用户进程跟踪
仅仅需要标识该会话并为该会话启用跟踪(专用模式为一对一模式,即一个用户进程对应一个服务器进程)
Leshami
2018/08/07
6120
EXP导出aud$报错EXP-00008,ORA-00904 解决
主题:EXP导出aud$报错EXP-00008,ORA-00904 解决 环境:Oracle 11.2.0.4 问题:在自己的测试环境,导出sys用户下的aud$表报错。
Alfred Zhao
2019/05/24
1.5K0
【DB笔试面试686】在Oracle中,SQL_TRACE是什么?诊断事件是什么?
SQL_TRACE是Oracle提供的用于进行SQL跟踪的手段,是强有力的辅助诊断工具。在日常的数据库问题诊断和解决中,SQL_TRACE是非常常用的方法。可以设置SQL_TRACE为TRUE,但是一般不推荐在全局指定为TRUE,只建议在会话级别指定。若在全局设定则对性能会造成较大影响。
AiDBA宝典
2019/11/14
7080
推荐阅读
相关推荐
SQL调优和诊断工具之SQL Trace (10046 Event)介绍
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验