`

sql_trace的使用

 
阅读更多

 

sql_trace 是Oracle 提供用于进行sql语句追踪的工具。

 

 启用方法

1 在全局中使用

          在参数文件(pfile/spfile)中指定:

           sql_trace = true

          在全局启用sql_trace会令到所有进程都会被追踪,包括后台进程以及所有用户进程。会导致比较明显的性能下降。所以在production环境一般不使用。

2  在当前session启用

           大多数时候我们使用sql_trace 追踪当前进程。前提是当前账号具有alter session的系统权限。

           启用命令为alter session set sql_trace=true;           

3  跟踪其他用户的进程

          很多时候我们需要跟踪的是其他用户的进程,而不是当前用户(进程),这可以通过Oracle的SYS用户下的包DBMS_SYSTEM中的存储过程SET_SQL_TRACE_IN_SESSION来完成

         SET_SQL_TRACE_IN_SESSION 要求用户提供3个参数:SID, SERIAL#, SQL_TRACE(开关);(如果没有dbms_system包权限看文末解决方法)

 

下面讲解如何跟踪其他用户的进程

名词解释

Sid:  Session identifier    # session 的标识符

SERIAL#

Session serial number. Used to identify uniquely a session's objects. Guarantees that session-level commands are applied to the correct session objects if the session ends and another session begins with the same session ID.

#Session 的序列号。作为唯一标示符用于标识session的对象。(当1个session结束而另1个新的session使用了旧session相同的sid时)保证在session层面上的命令能应用在正确的session对象身上。

 

我们可以通过查看v$session来获得sid,serial#等信息

 

select sid,serial#,username from v$session where username is not null;

 可以找到想跟踪的用户的sid、serial#,如果同一个用户多点登录,可以在该session下使用命令查询当前session的sid

 

 

select userenv('sid') from dual;

 

 

最后执行

exec dbms_system.set_sql_trace_in_session(sid,serial#,true)

然后就是查看trace记录的问题了

 

查看追踪的记录数据

         一般来讲,被追踪的数据会存放在这个目录下 $ORACLE_BASE/diag/rdbms/orcl/orcl/trace/。文件命名是有规则的,实列名_ora_对应进程名(pid).trc

         具体位置可以由下面sql语句查询出来:

 

select d.value || '/' || 
        lower(rtrim(i.instance, chr(0))) || '_ora_' || p.spid || '.trc' trace_file_name
from
    -- spid
   ( select p.spid
     from sys.v$mystat m,
             sys.v$session s,
             sys.v$process p
     where m.statistic# = 1 
         and s.sid = m.sid      ——由于连接了sys.v$mystat这里只能搜索当前session的sid
         and p.addr = s.paddr) p,
    -- instance name     
   ( select t.instance 
      from sys.v$thread  t,
              sys.v$parameter  v
     where v.name = 'thread' 
     and (v.value = 0 or 
             t.thread# = to_number(v.value))) i,
    --path
   ( select value 
    from sys.v$parameter 
    where name = 'user_dump_dest') d
 / 
上面这个语句只能用于查看当前用户当前进程的记录文件,
如果要用于其他session, 就必须指定sid, 如下:
select d.value || '/' 
     || lower(rtrim(i.instance, chr(0))) || '_ora_' || p.spid || '.trc' trace_file_name
from
   ( select p.spid
     from 
             sys.v$session s,
             sys.v$process p
     where
         s.sid = 15        --这里指定sid 在sys.v$session就可以找出其他session的sid 
                              参考2.3  跟踪其他用户的进程
         and p.addr = s.paddr) p,
   ( select t.instance 
      from sys.v$thread  t,
              sys.v$parameter  v
     where v.name = 'thread' 
     --下面只不过保证字符转换数字不会出错
     and translate(v.value,'a1234567890.-','a') is null  --必须由数字和"."和"-"组成
   and translate(v.value,'1.-','1') is not null        --去掉"."和"-"后至少1个字符,也就是至少有1个数字啦
   and length(v.value) - length(replace(v.value,'.','')) < 2 --"."的个数必须少于2
   and (instr(v.value,'-',0)= 0 or (                         --没有"-"
                                     --或者只有1个"-"字符,而且用"-"开头
                                    (length(v.value) - length(replace(v.value,'-','')) = 1)
                                     and  substr(v.value,1,1) ='-'))
     and (v.value = '0' or 
             t.thread# = to_number(v.value))) i,
    --path
   ( select value 
    from sys.v$parameter 
    where name = 'user_dump_dest') d
 / 

 

获取dbms_system包权限

1、首先确定dbms_system的包是否在,以sys或具有sysdba权限的用户连入
sqlplus 'sys/pass as sysdba'
SQL>desc dbms_system 
看是否报错。
2、如果报错报不存在,按 lcmlsj 做法把包建上

在sqlplus下执行
{ORACLE_HOME}/rdbms/admin/prvtutil.plb
3、如果你用的是很它用户来执行dbms_system,则可以这样:
sqlplus 'sys/pass as sysdba'
SQL>grant execute on dbms_system to <your_username>;
SQL>connect your_username/pass
SQL>CREATE SYNONYM DBMS_SYSTEM FOR SYS.DBMS_SYSTEM;

分享到:
评论

相关推荐

    10046事件和sql_trace.docx

    为了方便找到生成的TRACE文件,可以使用`ALTER SESSION SET TRACE_IDENTIFIER='标识名称';`来设置一个唯一的标识符。在Oracle 10g及之前的版本,TRACE文件默认存储在`$ORACLE_BASE/admin/SID/ump`目录下;而在11g及...

    SQL执行计划之sql_trace

    - 若要对特定会话启用 SQL Trace,可以使用 `dbms_system.set_sql_trace_in_session` 函数,这需要知道目标会话的 SID 和 SERIAL#。 ```sql EXECUTE dbms_system.set_sql_trace_in_session(sid, serial#, true); ...

    如何使用oracle提供的SQL_TRACE来跟踪sql的执行情况

    如何使用oracle提供的SQL_TRACE来跟踪sql的执行情况?Sql性能非常差的时候,oracle提供了SQL_TRACE来跟踪sql的执行情况。注:分析sql的方式比较多,还有根据优化器、sql执行计划来分析。SQL_TRACE能够将sql执行的过程...

    ct.zip_trace

    1. **生成SQL Trace文件**:在Oracle环境中,可以使用`ALTER SESSION SET SQL_TRACE = TRUE`开启SQL Trace,或者通过`DBMS_SESSION.SIMPLE_TRACE`包来启动特定会话的跟踪。执行完需要分析的SQL后,关闭SQL Trace。 ...

    sql_trace_parser:sql 跟踪文件解析器 (Haskell)

    在使用sql_trace_parser时,开发者需要了解Haskell的基本语法和库函数,同时熟悉SQL跟踪文件的格式和内容。虽然Haskell的学习曲线相对陡峭,但一旦掌握,就能充分利用其优势,编写出高效、优雅的解析代码。 总结来...

    sql2008查询事件跟踪器

    或者,你可以使用T-SQL的sp_trace_create存储过程来创建跟踪。 2. **事件类别**:包括但不限于登陆、退出、批处理开始和结束、SQL语句完成、锁定事件等。每种事件类别提供了对特定数据库操作的洞察。 3. **跟踪...

    web系统orcale语句执行追踪

    orcale sqltrace sql语句追踪 session 基于dbms_system.set_sql_trace_in_session 通过sid追踪sql语句,用于web等后台sql语句执行追踪,调试 已经做成工具,操作简单,支持根据uid筛选sql语句

    SQL Trace and TKPROF

    EXECUTE dbms_system.set_sql_trace_in_session(session_id, serial_id, TRUE); ``` 3. **运行应用**:启用 SQL Trace 后,运行需要监控的应用程序。 4. **禁用 SQL Trace 并格式化 trace 文件**:在收集完所需...

    sqlmonitor

    execute dbms_system.set_sql_trace_in_session(sid,serial#,ture); 3. 运行程序 4. 停止sqltrace execute dbms_system.set_sql_trace_in_session(sid,serial#,false); 5. 使用cmd 到udump 例: D:\Oracle...

    SQL TRACE原理、方法、事件查看总结

    1. 使用DBMS_SESSION包:通过调用DBMS_SESSION包中的TRACE_ON和TRACE_OFF过程,可以为指定的会话开启或关闭SQL TRACE。 2. 使用ALTER SESSION命令:在SQL提示符下,可以通过ALTER SESSION SET SQL_TRACE = TRUE开启...

    SQL Server 2000 审计功能

    该功能可以通过使用内置的存储过程来实现,例如 sp_trace_create、sp_trace_setevent、sp_trace_setfilter、sp_trace_setstatus 等。这些存储过程可以用来创建、设置和控制审计trace。 下面是使用 SQL Server 2000 ...

    SQLTracker(sql跟踪器).zip

    以下将详细介绍SQLTracker的主要功能、应用场景及使用方法。 1. **主要功能**: - **SQL监控**:实时追踪并记录数据库中的所有SQL查询,包括执行时间、频率、影响的行数等关键指标。 - **性能分析**:通过对SQL...

    10046事件跟踪详细指南

    3. **跟踪其他用户进程**: 通过DBMS_SYSTEM包的`SET_SQL_TRACE_IN_SESSION`过程,提供SID和序列号来启动其他用户进程的跟踪,例如`EXEC dbms_system.set_sql_trace_in_session(9,437,true)`。同样,用`false`参数可...

    Oracletrace

    EXECUTE DBMS_DEBUG.SET_TRACE_TO_FILE(TRUE); ``` #### 五、总结 通过上述介绍,我们可以了解到Oracle中的追踪机制是非常强大且灵活的。无论是基础的SQL_TRACE,还是更高级的10046事件或ORADEBUG,都能帮助DBA...

    牛顿法潮流计算C++语言编写

    // Debug trace macros // #define XSTRUCTOR_TRACE(str) // OutputDebugString (str) #define XSQL_TRACE(str) // { OutputDebugString ("\n"); OutputDebugString(str); } #define XMEMFUNC_TRACE(str) // ...

    优化SQl语句的十个重要步骤:

    7. **使用tkprof工具**:tkprof是Oracle提供的一个实用工具,用于格式化和分析SQL_TRACE产生的跟踪文件,它可以提供SQL语句的执行时间、I/O统计等信息。 8. **研究跟踪输出文件**:通过tkprof生成的输出,可以发现...

    oracle sql 跟踪

    在PL/SQL中,可以使用`DBMS_SESSION.SPECIAL_REGISTERS`过程,设置`SQL_TRACE`参数为TRUE来启动跟踪。对于特定会话,可以使用如下命令: ```sql BEGIN DBMS_SESSION.SPECIAL_REGISTERS( USERENV('SESSIONID') =&gt; ...

    如何用T-SQL语句建立跟踪

    例如,事件类别12代表SQL批处理的开始或结束,我们可以使用`sp_trace_setevent`存储过程来开启这些事件的跟踪: ```sql DECLARE @on BIT SET @on = 1 EXEC sp_trace_setevent @TraceID, 12, 1, @on EXEC sp_trace_...

Global site tag (gtag.js) - Google Analytics