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;
相关推荐
为了方便找到生成的TRACE文件,可以使用`ALTER SESSION SET TRACE_IDENTIFIER='标识名称';`来设置一个唯一的标识符。在Oracle 10g及之前的版本,TRACE文件默认存储在`$ORACLE_BASE/admin/SID/ump`目录下;而在11g及...
- 若要对特定会话启用 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的执行情况?Sql性能非常差的时候,oracle提供了SQL_TRACE来跟踪sql的执行情况。注:分析sql的方式比较多,还有根据优化器、sql执行计划来分析。SQL_TRACE能够将sql执行的过程...
1. **生成SQL Trace文件**:在Oracle环境中,可以使用`ALTER SESSION SET SQL_TRACE = TRUE`开启SQL Trace,或者通过`DBMS_SESSION.SIMPLE_TRACE`包来启动特定会话的跟踪。执行完需要分析的SQL后,关闭SQL Trace。 ...
在使用sql_trace_parser时,开发者需要了解Haskell的基本语法和库函数,同时熟悉SQL跟踪文件的格式和内容。虽然Haskell的学习曲线相对陡峭,但一旦掌握,就能充分利用其优势,编写出高效、优雅的解析代码。 总结来...
或者,你可以使用T-SQL的sp_trace_create存储过程来创建跟踪。 2. **事件类别**:包括但不限于登陆、退出、批处理开始和结束、SQL语句完成、锁定事件等。每种事件类别提供了对特定数据库操作的洞察。 3. **跟踪...
orcale sqltrace sql语句追踪 session 基于dbms_system.set_sql_trace_in_session 通过sid追踪sql语句,用于web等后台sql语句执行追踪,调试 已经做成工具,操作简单,支持根据uid筛选sql语句
EXECUTE dbms_system.set_sql_trace_in_session(session_id, serial_id, TRUE); ``` 3. **运行应用**:启用 SQL Trace 后,运行需要监控的应用程序。 4. **禁用 SQL Trace 并格式化 trace 文件**:在收集完所需...
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...
1. 使用DBMS_SESSION包:通过调用DBMS_SESSION包中的TRACE_ON和TRACE_OFF过程,可以为指定的会话开启或关闭SQL TRACE。 2. 使用ALTER SESSION命令:在SQL提示符下,可以通过ALTER SESSION SET SQL_TRACE = TRUE开启...
该功能可以通过使用内置的存储过程来实现,例如 sp_trace_create、sp_trace_setevent、sp_trace_setfilter、sp_trace_setstatus 等。这些存储过程可以用来创建、设置和控制审计trace。 下面是使用 SQL Server 2000 ...
以下将详细介绍SQLTracker的主要功能、应用场景及使用方法。 1. **主要功能**: - **SQL监控**:实时追踪并记录数据库中的所有SQL查询,包括执行时间、频率、影响的行数等关键指标。 - **性能分析**:通过对SQL...
3. **跟踪其他用户进程**: 通过DBMS_SYSTEM包的`SET_SQL_TRACE_IN_SESSION`过程,提供SID和序列号来启动其他用户进程的跟踪,例如`EXEC dbms_system.set_sql_trace_in_session(9,437,true)`。同样,用`false`参数可...
EXECUTE DBMS_DEBUG.SET_TRACE_TO_FILE(TRUE); ``` #### 五、总结 通过上述介绍,我们可以了解到Oracle中的追踪机制是非常强大且灵活的。无论是基础的SQL_TRACE,还是更高级的10046事件或ORADEBUG,都能帮助DBA...
// Debug trace macros // #define XSTRUCTOR_TRACE(str) // OutputDebugString (str) #define XSQL_TRACE(str) // { OutputDebugString ("\n"); OutputDebugString(str); } #define XMEMFUNC_TRACE(str) // ...
7. **使用tkprof工具**:tkprof是Oracle提供的一个实用工具,用于格式化和分析SQL_TRACE产生的跟踪文件,它可以提供SQL语句的执行时间、I/O统计等信息。 8. **研究跟踪输出文件**:通过tkprof生成的输出,可以发现...
在PL/SQL中,可以使用`DBMS_SESSION.SPECIAL_REGISTERS`过程,设置`SQL_TRACE`参数为TRUE来启动跟踪。对于特定会话,可以使用如下命令: ```sql BEGIN DBMS_SESSION.SPECIAL_REGISTERS( USERENV('SESSIONID') => ...
例如,事件类别12代表SQL批处理的开始或结束,我们可以使用`sp_trace_setevent`存储过程来开启这些事件的跟踪: ```sql DECLARE @on BIT SET @on = 1 EXEC sp_trace_setevent @TraceID, 12, 1, @on EXEC sp_trace_...