使用sql trace检查问题
可以设置sql_trace为true,但是一般不推荐在全局指定为true,只建议在本session中指定,因为该参数设置为true会跟踪当前进程,对性能造成较大影响。
一。跟踪本session进程
sql>alter session set sql_trace=true;
sql>select ....
sql>alter session set sql_trace=false;
二。跟踪其他用户进程
1.检查并跟踪数据库进程
select sid,serial#,username from v$session where username is not null;
SID SERIAL# USERNAME
---------- ---------- ------------------------------
209 25265 PRT
211 4715 CHARGE5
237 27890 PRT
2.启用相关进程sql_trace
sql> exec dbms_system.set_sql_trace_in_session(209,25265,true);
PL/SQL procedure successfully completed.
sql> exec dbms_system.set_sql_trace_in_session(211,4715,true);
PL/SQL procedure successfully completed.
sql> exec dbms_system.set_sql_trace_in_session(237,27890,true);
PL/SQL procedure successfully completed.
3.过一段时间关闭sql_trace
sql> exec dbms_system.set_sql_trace_in_session(209,25265,false);
PL/SQL procedure successfully completed.
sql> exec dbms_system.set_sql_trace_in_session(211,4715,false);
PL/SQL procedure successfully completed.
sql> exec dbms_system.set_sql_trace_in_session(237,27890,false);
PL/SQL procedure successfully completed.
===================================================================
三。另外还可以使用DBMS_MONITOR包来跟踪某个session
sql>desc DBMS_MONITOR
sql>select sid,serial#,username from v$session where username is not null;
sql>exec dbms_monitor.session_trace_enable(&sid,&serial#)
sql>select .....
sql>exec dbms_monitor.session_trace_disable(&sid,&serial#)
====================================================================
四。10046事件:
10046事件是oracle提供的内部事件,是对sql_trace的增强
10046事件可以设置以下四个级别:
1 - 启用标准的SQL_TRACE功能,等价于sql_trace
4 - Level 1 加上绑定值(bind values)
8 - Level 1 + 等待事件跟踪
12 - Level 1 + Level 4 + Level 8
类似sql_trace,10046事件可以在全局设置,也可以在session级设置。
1. 在全局设置
在参数文件中增加:
event="10046 trace name context forever,level 12"
此设置对所有用户的所有进程生效、包括后台进程.
2.对当前session设置
通过alter session的方式修改,需要alter session的系统权限:
SQL> alter session set events '10046 trace name context forever';
Session altered.
SQL> alter session set events '10046 trace name context forever, level 8';
Session altered.
SQL> alter session set events '10046 trace name context off';
Session altered.
3. 对其他用户session设置
通过DBMS_SYSTEM.SET_EV系统包来实现:
select sid,serial#,username from v$session where username is not null;
SID SERIAL# USERNAME
---------- ---------- ------------------------------
209 25265 PRT
211 4715 CHARGE5
237 27890 PRT
执行跟踪:
SQL> exec dbms_system.set_ev(209,25265,10046,8,'');
PL/SQL procedure successfully completed.
结束跟踪:
SQL> exec dbms_system.set_ev(209,25265,10046,0,'');
PL/SQL procedure successfully completed.
然后就可以查看生成的trc文件了
===================================================================
通过以上四种方法生成trc,然后检查最新的trc文件
trace文件名是ora_xxxx_SID.trc,其中xxxx是与Oracle连接的shadow进程的PID,SID是Oracle实例的SID。文件生成在Init.ORA参数user_dump_dest指定的目录下。
可以通过如下sql查找到这个trc文件
sqlplus / as sysdba
sql>select d.value || '/' || lower(rtrim(i.instance, chr(0))) || '_ora_' ||
p.spid || '.trc' trace_file_name
from (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
and p.addr = s.paddr) p,
(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,
(select value from sys.v$parameter where name = 'user_dump_dest') d
使用tkprof工具解析trc文件
$tkprof /opt/oracle/admin/charge/udump/charge_ora_9964.trc /opt/oracle/aa.txt
===================================================================
autotrace是使用:
dba权限的用户可以直接使用该功能,
如:set autotrace traceonly
但是如果没有分配dba权限的用户则需要执行$ORACLE_HOME/sqlplus/admin/plustrce.sql脚本,自动创建plustrace角色。
再把plustrace权限赋给需要的用户了
grant plusstrace to prt;
然后就可以使用autotrace功能了。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/559237/viewspace-544976/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/559237/viewspace-544976/