sql17

[Q]如果跟踪自己的会话或者是别人的会话 
[A]跟踪自己的会话很简单 
Alter session set sql_trace true|false 
Or 
Exec dbms_session.set_sql_trace(TRUE); 
如果跟踪别人的会话,需要调用一个包 
exec dbms_system.set_sql_trace_in_session(sid,serial#,true|false) 
跟踪的信息在user_dump_dest 目录下可以找到或通过如下脚本获得文件名称(适用于Win环境,如果是unix需要做一定修改) 
SELECT p1.value||'\'||p2.value||'_ora_'||p.spid||'.ora'  filename 
     FROM 
         v$process p, 
         v$session s, 
         v$parameter p1, 
         v$parameter p2 
     WHERE p1.name = 'user_dump_dest' 
     AND p2.name = 'db_name' 
     AND p.addr = s.paddr 
     AND s.audsid = USERENV ('SESSIONID') 
最后,可以通过Tkprof来解析跟踪文件,如 
Tkprof 原文件 目标文件 sys=n 
  
[Q]怎么设置整个数据库系统跟踪 
[A]其实文档上的alter system set sql_trace=true是不成功的 
但是可以通过设置事件来完成这个工作,作用相等 
alter system set events 
   '10046 trace name context forever,level 1'; 
如果关闭跟踪,可以用如下语句 
alter system set events 
   '10046 trace name context off'; 
其中的level 1与上面的8都是跟踪级别 
level 1:跟踪SQL语句,等于sql_trace=true 
level 4:包括变量的详细信息 
level 8:包括等待事件 
level 12:包括绑定变量与等待事件 
  
[Q]怎么样根据OS进程快速获得DB进程信息与正在执行的语句 
[A]有些时候,我们在OS上操作,象TOP之后我们得到的OS进程,怎么快速根据OS信息获得DB信息呢? 
我们可以编写如下脚本: 
$more whoit.sh 
#!/bin/sh 
sqlplus /nolog <<EOF       
  connect / as sysdba  
  col machine format a30  
  col program format a40  
  set line 200  
  select sid,serial# ,username,osuser,machine,program,process,to_char(logon_time,'yyyy/mm/dd hh24:mi:ss')   
           from v\$session where paddr in  
           ( select addr from v\$process where spid in($1));  
              
   select sql_text from v\$sqltext_with_newlines  
                   where hash_value in  
                   (select SQL_HASH_VALUE from v\$session where  
                     paddr in (select addr from v\$process where spid=$1)  
                     )  
                     order by piece;  
    
exit;  
EOF 
然后,我们只要在OS环境下如下执行即可 
$./whoit.sh Spid 

你可能感兴趣的:(sql,工作,unix,OS,脚本)