- 论坛徽章:
- 0
|
现有一个oracle数据库的生产系统,里面存储有一千多万的用户信息,而且是一个OLTP系统,对用户的响应速度要求都在毫秒级别,该系统自开通至今已经有2年多了,一直运行很平稳,但最近发现应用经常重起,应用是通过OCI系统调用去存取数据库的,每次重起前都发现数据库的响应速度特别慢,平时只需毫秒级的SQL在出现问题时执行时间可能要1分多钟,应用为了自我保护就终止了和数据库的连接,重起启动应用。
现在我想通过重起应用前,执行一个语句,能够捕捉到重起前,应用正在执行的SQL,但从网上查到一些类似的SQL语句,效率都很低,执行一次可能是1分钟以上,这对于生产系统,恢复时间可能太长,不知各位有没有好一点的办法来定位当时的语句,附上我用来捕捉一个oracle客户端执行的SQL的shell,效率不高,望大侠们指教。
#!/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 |
|