oracle SQL监控脚本

   今天看到了一些oracle数据库监控的脚本,为以后监控数据库sql带来便利,因此将其摘录下来。

1.捕获耗费性能的SQL语句
#!/bin/ksh
sqlplus -s /nolog << EOF
connect sys/sys as sysdate;
col sid format 99999
col serial# format 999999
col username format 999999
col program format a10
set lines 1000
set pages 1000
set trimspool on

--获取会话
select sid, serial#, username, program, to_char(logon_time, 'yyyy-mm-dd hh24:mi:ss') as logon_time
  from v$session
 where paddr in(select addr from v$process where spid = $1);
 
--获取该会话运行的SQL语句
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

2.监控当前活动的语句
sqlplus -s /nolog << EOF
connect sys/sys as sysdba;

set serveroutput on size 1000000
set lines 200
set pages 1000
set feedback off
column username format a72 word_wrapped
column program format a72 word_wrapped
column sql_text format a72 word_wrapped

declare

    --自定义过程,一行内输出250个字符以上
    procedure p(p_str  in varchar2)
    is
       l_str  long := p_str;
    begin
   
        loop
       
            exit when l_str is null;
            dbms_output.put_line(substr(l_str, 1, 250));
            l_str := substr(l_str, 250);
        end loop;
   
    end;
begin

   for x in (select * from (select a.username || '(' || a.sid || ',' || a.serial# || ') spid = ' || b.spid ||
             ' hash_value =  ' || to_char(a.sql_hash_value) username, ||
             ' program = ' || a.program || ' et = ' || last_call_et program, sql_address
             from v$session a,
                  v$process b
            where a.status = 'ACTIVE'
              and a.paddr = b.paddr
              and rawtohex(sql_address) <> '00'
              and a.username is not null
              and sid <> (select sid from v$mystat where rownum = 1)
             order by last_call_et desc)
            where rownum < 10)
  loop
 
     --打印状态信息
     dbms_output.put_line('--------------------');
     dbms_output.put_line(x.username);
     dbms_output.put_line(x.program);
    
     --打印sql语句
     for y in (select sql_text
                 from v$sqltext_with_newlines
                where address = x.sql_address
                order by piece)
     loop
       p(y.sql_text);
     end loop;
 
  end loop;
   
end;
/

exit
EOF

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/20948385/viewspace-667122/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/20948385/viewspace-667122/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值