`
zybing
  • 浏览: 449524 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

捕获进程在执行的SQL语句

阅读更多

 

 

方法1: 根据服务器processID获取执行的SQL语句

 

 

prompt 根据服务器processID获取执行的SQL语句


ACCEPT pid NUMBER prompt '输入服务器的进程编号: ' ;

set serveroutput on
set verify off

declare
  sqltext varchar2(4000) ;
  Cursor c_GetSQLText is 
     select sql_text 
     from  V$SQLTEXT_WITH_NEWLINES sqlwn, 
           ( select s.sid, s.serial#, s.sql_address, s.sql_hash_value
             from  v$process p, v$session s
             where p.addr = s.paddr
             and spid=&pid
           ) b
     where
       sqlwn.address = b.sql_address
       and sqlwn.hash_value = b.sql_hash_value
     order by piece asc;
     


begin 
  dbms_output.enable(1000000);
  dbms_output.put_line(' ------------------------------------ ');
	
  for r_indx in c_GetSQLText loop
  	dbms_output.put( r_indx.sql_text);
  end loop;

	dbms_output.put_line('  ');
  dbms_output.put_line(' ------------------------------------ ');

end;

/

 
 

 

方法2: 跟踪用户当前的session,通过tkproc解析trace文件

 

首先查到在服务器上的processid,然后执行脚本,对该进程进行trace

通过 dbms_system.set_sql_trace_in_sessin(sid, serial#, true/false) 来进行

 

 

-- 首先查到用户的sid, serial#, 通过执行dbms_system.set_sql_trace_in_session(sid, serial#, true/false)来进行对用户session的跟踪。

-- 跟踪的结果写在usertrace目录中,通过tkprof可以将trace文件进行转换成用户可以阅读的格式;

-- 如果跟踪的是Oracle后台进程,跟踪的结果是写在background_dump_dest中,而不是user_dump_dest

ACCEPT spid NUMBER  prompt '输入服务器的进程编号: ' ;

set serveroutput on
set verify off


declare
  c_name          INTEGER;
  ignore          INTEGER;
  Cursor c_getSession is 
     Select s.sid, s.serial#, s.username
     from  v$session s , v$process p
     where p.spid = &spid
       and p.addr = s.paddr;
   trace_dir  varchar2(2000);
   instance_name varchar2(2000);
begin
   
	 DBMS_OUTPUT.ENABLE(1000000);

   Select value 
   Into  trace_dir
   From v$parameter
   Where  name='user_dump_dest';

   Select value 
   Into  instance_name
   From v$parameter
   Where  name='instance_name';
   
   c_name := DBMS_SQL.OPEN_CURSOR;

   for r_indx in c_getSession loop
     DBMS_OUTPUT.PUT_LINE( 'User Name : ' || r_indx.username );
     DBMS_OUTPUT.PUT_LINE( 'sid : ' || r_indx.sid );
     DBMS_OUTPUT.PUT_LINE( 'serial# : ' || r_indx.serial# );
     
   	 DBMS_SQL.parse( c_name,
   			    		'begin  sys.dbms_system.set_sql_trace_in_session(  ' 
   			    		|| r_indx.sid || ' , ' || r_indx.serial# || '  , true  ); end;' ,
   		 					DBMS_SQL.NATIVE
   	 );
   	
     ignore := DBMS_SQL.execute(c_name);       
   	
     DBMS_OUTPUT.PUT_LINE( ' Trace File Name : ' 
             || trace_dir || '/' 
             || instance_name || '_ora_' || &spid ||'.trc' );
     
   end loop;

   DBMS_SQL.close_cursor(c_name);
     
end;
/

 

 

3. 通过Oracle事件方式进行

  可以通过Oracle事件10046方式对用户session进行跟踪;

 

自己的 

如果是自己了session,可以执行:

   Alter Session set events '10046 trace name context forever, level 12'

 

 

  关闭可以:

 

Alter Session set events '10046 trace name context off';
 

 

 

对其他用户session进行设置

  通过dbms_system.set_ev来进行;

exec dbms_system.set_ev( sid, serial#, 10046, 级别1/4/8/12, '名字' );

关闭的话,只要把级别设置成0就可以了

 

 

-------------------------------------------------------------------------------------------------------------------

说明:

1. 在跟踪的时候,消耗的时间因素很重要,因此最好把timed_statistics设置成true

    如果是自己的session ,可以 alter session set timed_statistics=true;

    如果是别人的session ,可以 sys.dbms_system.set_bool_param_in_session( sid, serial#, 'timed_statistics', true);

 

2. 可以设置一下trace文件的大小

  dbms_system.set_int_param_in_session( sid, serial#, 'max_dump_file_size', 大小为字节单位 )

 

3. 出来的结果,需要用tkprof进行分析,tkprof的使用可以见这里

 

 

 

 

 

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    如何使用C# 捕获进程输出

    很多时候我们可能会需要执行一段命令获取一个输出,遇到的比较典型的就是之前我们需要用 FFMpeg 实现视频的编码压缩水印等一系列操作,当时使用的是 FFMpegCore 这个类库,这个类库的实现原理是启动另外一个进程,...

    源码C#登录注册小程序源码.pdf

    在这里,我们使用了`SqlConnection`和`SqlCommand`对象来连接数据库和执行SQL语句。 知识点 1. C# WinForm应用程序的基本结构和组件。 2. 如何使用LinkLabel控件来导航不同界面。 3. 如何使用Form的Closing事件来...

    Toad 使用快速入门

    可以查看SQL语句的执行情况:通过下方的AutoTrace窗口 ,看到SQL语句的实际执行结果和执行效率。 支持历史SQL(F8) :可以方便的查询以前执行过的SQL,不用反复重新输入。  可以执行匿名块,存储过程,从...

    Oracle选择题复习(带答案).doc

    * 在 PL/SQL 语句块中,跳出循环体所用的语句是 EXIT。 数据库启动和关闭 * 数据库启动过程中,会在实例启动时读取参数文件。 * 数据库关闭时,首先需要卸载数据库。 * 数据库启动时,会读取控制文件。 数据库...

    Visual c++案例开发集锦

    用DAO在数据库中执行SQL语句 在程序中创建ODBC数据源 第五章 VC实现Flash动画播放 VC实现WAV文件播放器 创建CD播放器 利用VC实现OPENGL编程 用playsound播放声音文件 用VC制作简单AVI文件播放器 第六章 获取网卡地址...

    Visual C++案例开发集锦

    用DAO在数据库中执行SQL语句 在程序中创建ODBC数据源 第五章 VC实现Flash动画播放 VC实现WAV文件播放器 创建CD播放器 利用VC实现OPENGL编程 用playsound播放声音文件 用VC制作简单AVI文件播放器 第六章 获取网卡地址...

    Oracle选择题答案.pdf

    在PL/SQL语句块中,exit语句用于跳出循环体。 22. 数据库的默认启动选项是______。 答案:D、OPEN 数据库的默认启动选项是OPEN。 23. 关于控制文件,下列说法正确的是______。 答案:A、建议至少有两个位于不同...

    AWR技术在ORACLE自动管理中的应用.pdf

    * 捕获前N条SQL语句(topnsql),可以设置的值包括default、100、200等。 AWR报表的内容分析 AWR报表提供了大量的数据库性能信息,包括数据库的基本统计信息、活动会话记录、顾问建议、快照信息等。通过对AWR报表的...

    java面试800题

    Q0027 哪些SQL语句在执行时是自动提交的? 数据定义语言DDL是自动提交的。 Q0028 索引对数据库的影响? 提高查询速度 Q0029 主外键有什么关系? 外键是从某个表的一个字段指向另外一个表的主健字段,两个字段的类型...

    Java 面试题Java 面试题Java 面试题Java 面试题Java 面试题

    我们可以通过 DriverManager 类和 Connection 接口来连接数据库,并执行 SQL 语句来操作数据库。 8. Java 中的 MVC 模式 Java 中的 MVC 模式是指一种软件架构模式,用于分离应用程序的逻辑层次。MVC 模式主要由三...

    Oracle Stream-安装配置

    从技术实现思路上与streams几无相同之处,倒是逻辑standby与streams的实现方式非常想像,都是通过分析 redo生成重做的sql语句在目标端执行,如果要说差异的话,逻辑standby只提供了整库级的复制,从功能上来看...

    OCPOCA认证考试指南全册:Oracle Database 11g(1Z0-051,1Z0-052,1Z0-053)--详细书签版(第2/2部分)

    8.2.2 执行SQL语句 274 8.2.3 事务控制:COMMIT、ROLLBACK、SAVEPOINT和SELECT FOR UPDATE 277 8.3 识别和管理PL/SQL对象 281 8.3.1 存储的与匿名的PL/SQL程序块 282 8.3.2 PL/SQL对象 282 8.4 监视和解决锁定...

    OCPOCA认证考试指南全册:Oracle Database 11g(1Z0-051,1Z0-052,1Z0-053)--详细书签版(第1/2部分)

    8.2.2 执行SQL语句 274 8.2.3 事务控制:COMMIT、ROLLBACK、SAVEPOINT和SELECT FOR UPDATE 277 8.3 识别和管理PL/SQL对象 281 8.3.1 存储的与匿名的PL/SQL程序块 282 8.3.2 PL/SQL对象 282 8.4 监视和解决锁定...

    net学习笔记及其他代码应用

    28.SQLSERVER服务器中,给定表 table1 中有两个字段 ID、LastUpdateDate,ID表示更新的事务号, LastUpdateDate表示更新时的服务器时间,请使用一句SQL语句获得最后更新的事务号 答:Select ID FROM table1 Where ...

    ORACLE之常用FAQ V1.0(整理)

    [Q]怎么样在PL/SQL中执行DDL语句 6 [Q]怎么样获取IP地址 7 [Q]怎么样加密存储过程 7 [Q] 7 [Q] 7 [Q]如果存在就更新,不存在就插入可以用一个语句实现吗 8 [Q]怎么实现左联,右联与外联 9 [Q]怎么实现一条记录根据...

    java初学者必看

    16.1.1 SQL语句分类 16.1.2 SELECT 16.1.3 INSERT 16.1.4 UPDATE 16.1.5 DELETE 16.1.6 CREATE 16.1.7 ALTER 16.1.8 DROP 16.2 MySQL概述 16.2.1 MySQL简介 16.2.2 下载并安装MySQL 16.2.3 MySQL使用 ...

    java面试题

    答:声明式的事务管理主要是将在进行对数据库中数据的添加或者修改时需要执行事务管理,主要是为了避免在执行添加或修改的时候添加或修改不完全正确,导致数据丢失。spring使用AOP面向切面的思想进行事务管理的。 ...

    深入解析Oracle.DBA入门进阶与诊断案例

    10.5.3 捕获排序SQL语句 515 10.5.4 确定典型问题SQL 515 10.5.5 选择解决办法 517 10.5.6 进一步的调整优化 518 10.5.7 小结 520 10.6 一次横跨两岸的问题诊断 520 10.6.1 第一封求助邮件 520 10.6.2...

Global site tag (gtag.js) - Google Analytics