1. 程式人生 > >如何知道指令碼中正在執行的SQL語句

如何知道指令碼中正在執行的SQL語句

1、發變更讓值班同事執行如下指令碼
nohup sh ./spa.sh &


而spa.sh內容如下:
cat spa.sh
sqlplus ' / as sysdba' << eof
@POLICY_SPA.sql
exit;
eof


2、第二天上班來複核指令碼,是否還在執行。
ps -ef | grep sqlplus | grep -v grep
 opepcis 14431 13946   0 09:05:04 ?           1:59 sqlplus -s / as sysdba
 opepcis 44610 44382   0   Jan 13 ?           0:01 sqlplus dbmon/[email protected]
:1530/monitor
 opepcis 45336 19373   0 08:56:07 pts/3       0:00 sqlplus / as sysdba
 opepcis 14850     1   0 23:08:21 ?           0:00 sqlplus  / as sysdba


那假設,我們想看下pid為14850的執行sql語句,是否可行呢?


3、執行如下命令
09:21:57 [email protected]>SELECT t.sql_fulltext FROM v$process p,v$session s,v$sql t
09:22:06   2  WHERE p.SPID=&1 
09:22:12   3  AND   p.ADDR=s.PADDR
09:22:16   4  AND t.sql_id=s.sql_id;
Enter value for 1: 14850
old   2: WHERE p.SPID=&1
new   2: WHERE p.SPID=14850


no rows selected


4、會不會是,產生了子程序?
通過子程序來查?
ps -ef | grep 14850 | grep -v grep
 opepcis 14850     1   0 23:08:21 ?           0:00 sqlplus  / as sysdba
 opepcis 14851 14850   0 23:08:21 ?          88:57 oracleepcis (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))


嘗試查一下14851:


09:23:22
[email protected]
>SELECT t.sql_fulltext FROM v$process p,v$session s,v$sql t
WHERE p.SPID=14851 
AND   p.ADDR=s.PADDR  
AND t.sql_id=s.sql_id; 


SQL_FULLTEXT
--------------------------------------------------------------------------------
BEGIN
  DBMS_SQLTUNE.CAPTURE_CURSOR_CACHE_SQLSET(SQLSET_NAME
     => 'STS_AUQIT07


OK能夠查到,正在執行的語句了!