`
zybing
  • 浏览: 457258 次
  • 性别: 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的使用可以见这里

 

 

 

 

 

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    Sqlserver分析死锁进程

    这一步骤对于理解死锁的原因至关重要,因为它可以揭示进程正在执行的具体SQL语句。 4. **存储死锁信息**:将从`DBCC INPUTBUFFER`获取的信息分别插入到`#tempbelocktracestatus`和`#templocktracestatus`中,然后再...

    SQLMonitor

    SQLMonitor通过捕获并分析本地进程通过SQL*Net协议发送的SQL语句,帮助用户识别和优化那些影响系统性能的慢速查询。SQL*Net是Oracle数据库的一种网络通信协议,它使得客户端应用程序能够与数据库服务器进行交互。 ...

    跟踪MSSQL进程对应的语句,图文

    在SQL Server环境中,有时我们需要跟踪特定进程以了解其执行的具体SQL语句,这对于排查性能问题、定位阻塞或死锁等情况至关重要。以下是如何在MSSQL Server中跟踪进程对应语句的详细步骤: 1. **查找进程PID**: ...

    查看linq中的sql

    将此属性设置为一个输出日志的方法,例如控制台输出,就可以在执行查询时看到生成的SQL语句。 例如: ```csharp using (var context = new YourDbContext()) { context.Database.Log = Console.WriteLine; var ...

    毕业设计:学生管理系统源码,界面为Qt,数据库为sqlite 代码里可以借鉴 sql 语句的操作

    开发者可以使用QSqlQuery或QSqlTableModel等类来执行SQL语句,操作数据库。例如,通过调用`QSqlQuery::exec()`执行SQL命令,`QSqlQueryModel::clear()`清除查询结果,以及`QSqlTableModel::setData()`更新数据库记录...

    SQLMonitor2.4.3.6.rar 绿色版

    它的工作原理类似于黑盒测试,无需修改应用程序代码,只需在SQLMonitor中选择要监控的程序,就能捕获到该程序发出的所有SQL语句。这对于那些使用PowerBuilder等工具开发的应用程序尤其有用,因为这些应用程序的内部...

    Oracle Sql 优化讲座资料

    - **SQLTrace**:一种追踪工具,用于捕获SQL语句的执行情况,包括执行时间、CPU时间等信息。 - **tkprof**:将SQLTrace文件转换成易于阅读的报告,有助于识别性能问题所在。 #### 五、Rule-Based Optimizer vs Cost...

    sqlserver并发分析及解决办法

    - **SQL Server Profiler**:用于捕获有关数据库活动的详细信息,包括查询计划、执行时间和阻塞情况等。 - **性能监视器(Perfmon)**:提供了一组计数器,用于监控SQL Server的性能,特别是在事务处理方面。 **2. ...

    Java做SqlServer2008备份恢复代码

    在SQL Server中,存储过程`killspid`被创建在`master`数据库中,用于杀死指定数据库的所有活动进程,这在执行数据库恢复之前可能是必要的,以确保没有其他事务正在运行。 4. **连接数据库**: - 代码中使用了`get...

    一个简单的sql记事本

    【标题】"一个简单的SQL记事本"是一个用于学习和实践SQL语句的简单工具,它可能是一个轻量级的应用程序或文本编辑器,专为编写和执行SQL查询而设计。这样的工具通常具有基础的代码高亮、自动完成和结果查看功能,...

    Oracle数据库性能分析

    - **SQL Trace**: 使用SQL Trace可以捕获SQL语句及其执行细节,这对于深入分析SQL性能非常有用。 - **SQL Performance Analyzer (SPA)**: SPA可以在升级前后或应用补丁前后的环境中比较SQL性能,从而发现性能变化。 ...

    SQL server 2008 阻塞查询与处理

    - 这个命令用于显示指定会话ID的最近执行的T-SQL语句。 - 示例命令: ```sql DBCC INPUTBUFFER(会话ID); ``` - 将“会话ID”替换为实际被阻塞的会话ID,可以帮助分析阻塞的具体原因。 3. **使用SQL Server ...

    DB2捕获操作

    7. 停止捕获:在不需要继续捕获时,应关闭捕获进程,以减少不必要的资源消耗。 8. 应用结果:根据分析结果,调整数据库配置、优化SQL语句或改进应用程序代码,以提高性能或增强安全性。 需要注意的是,DB2捕获操作...

    dba常用sql多年长期总结

    3. **会话SQL查询**:用于查看某个会话当前正在执行的SQL语句。 ```sql SELECT sid, status_id, sql_id FROM v$session WHERE sid = 68; ``` 结合`v$sql`视图,我们可以进一步获取SQL文本信息: ```sql ...

    Oracle基础(Oracle体系结构+PL/SQL命令)

    声明部分定义变量和游标,执行部分包含SQL语句和PL/SQL语句,异常处理部分处理运行时错误。 2. **变量(Variables)**:PL/SQL支持各种数据类型,如NUMBER、VARCHAR2、DATE等,可以声明局部变量用于存储中间结果。 ...

    MFC连接SQL Server数据库

    我们可以使用`try...catch`语句来捕获异常并弹出错误信息。 远程连接SQL Server数据库 在实际应用中,SQL Server数据库可能位于远程服务器上。这时,我们需要在连接字符串中指定服务器的IP地址和端口号,以便实现...

    SQL Server 2005直连驱动

    它基于ADO.NET,为开发人员提供了易于使用的类库,如SqlConnection、SqlCommand等,可以方便地编写和执行SQL语句。 3. **JDBC驱动程序**: 对于Java开发者,SQL Server 2005也提供了JDBC驱动,使得Java应用程序可以...

    sql.xcodeproj.zip_数据库实现

    7. **FMDB库**:FMDB是由SQLite封装的Objective-C框架,它提供了简单易用的接口来执行SQL语句,处理查询结果,以及管理数据库事务。使用FMDB,开发者可以更方便地进行数据库操作,无需直接与SQLite的C API交互。 8....

Global site tag (gtag.js) - Google Analytics