Sunteți pe pagina 1din 4

. $HOME/.

profile

sqlplus -s << EOF


APPS/$FNDSSAP

set serveroutput on
--set serveroutput on size 1000000 format wrapped
spool /dba/scripts/logs/ORAPROD1/locking.txt

DECLARE
CURSOR C1
IS
SELECT B.INST_ID AS BINST,B.SID AS BSID , R.INST_ID AS RINST ,R.SID AS RSID,
B.CTIME AS BTIME, R.CTIME AS RTIME
FROM GV\$LOCK R, GV\$LOCK B
WHERE R.REQUEST > 0 AND B.BLOCK > 0 AND R.ID1 = B.ID1 AND R.ID2 = B.ID2 AND
R.CTIME > 600
ORDER BY R.CTIME desc ;

CURSOR C2
IS
SELECT * from gv\$session where seconds_in_wait > 600 and program not like
'%extproc32mgwextproc%'
and event NOT IN
('SQL*Net break/reset to client','SQL*Net message from client','PL/SQL lock
timer','Streams AQ: waiting for messages in the queue','jobq slave wait','HS
message to agent','SQL*Net message to client') AND TYPE NOT IN ('BACKGROUND') order
by seconds_in_wait desc;

V_INSTID NUMBER;
V_SPID NUMBER;
V_SPIDB NUMBER;
V_APPSUSER VARCHAR2(120);
V_DESC VARCHAR2(120);
V_USERNAME VARCHAR2(120);
V_SID NUMBER;
V_SERIAL NUMBER;
V_SERIALB NUMBER;
V_DETAILS VARCHAR2(120);
V_STATUS VARCHAR2(10);
V_BLOCKUSER VARCHAR2(120);
V_LOCKUSER VARCHAR2(120);
v_EVENT VARCHAR2(120);
V_WAITER VARCHAR2(120);
V_SECONDS NUMBER;
V_CNT NUMBER := 0;

BEGIN
-- LOOP FOR ALL BLOCKERS TO FIND WHO IS BEING BLOCKED
FOR C1REC IN C1
LOOP
IF V_CNT = 0 THEN
dbms_output.put_line('-');
DBMS_OUTPUT.PUT_LINE('BLOCKING USERS');
dbms_output.put_line('-');
V_CNT :=1;
END IF;

IF C1REC.BSID = V_SID THEN


V_LOCKUSER := V_LOCKUSER;
ELSE
SELECT S.INST_ID,
P.SPID,
NVL(L.USER_NAME,'UNKNOWN'),
NVL(L.DESCRIPTION,'UNKNOWN'),
S.USERNAME,
S.SID,
S.SERIAL#,
S.PROGRAM||' '||S.ACTION||' '||S.MODULE,
initcap(STATUS)
INTO V_INSTID, V_SPID, V_APPSUSER, V_DESC, V_USERNAME, V_SID, V_SERIAL,
V_DETAILS, V_STATUS
FROM GV\$SESSION S, GV\$PROCESS P,
(SELECT * FROM APPLSYS.FND_LOGINS FL,APPLSYS.FND_USER U
WHERE U.USER_ID = FL.USER_ID AND TRUNC(START_TIME) = TRUNC(SYSDATE) AND
END_TIME IS NULL AND LOGIN_TYPE = 'FORM') L
WHERE P.PID = L.PID(+) AND P.SERIAL# = L.SERIAL#(+) AND P.ADDR = S.PADDR
AND S.SID=C1REC.BSID AND S.INST_ID = C1REC.BINST AND S.INST_ID = P.INST_ID
and rownum=1 ORDER BY S.PROCESS,LOGON_TIME;

IF V_APPSUSER != 'UNKNOWN' THEN


V_LOCKUSER := V_APPSUSER;
ELSIF V_DESC != 'UNKNOWN' THEN
V_LOCKUSER := V_DESC;
ELSE
V_LOCKUSER := V_DETAILS;
END IF ;
END IF;

SELECT S.INST_ID,
P.SPID,
NVL(L.USER_NAME,'UNKNOWN'),
NVL(L.DESCRIPTION,'UNKNOWN'),
S.USERNAME,
S.SID,
S.SERIAL#,
S.PROGRAM||' '||S.ACTION||' '||S.MODULE
--STATUS
INTO V_INSTID, V_SPIDB, V_APPSUSER, V_DESC, V_USERNAME, V_SID, V_SERIALB,
V_DETAILS
FROM GV\$SESSION S, GV\$PROCESS P,
(SELECT * FROM APPLSYS.FND_LOGINS FL,APPLSYS.FND_USER U
WHERE U.USER_ID = FL.USER_ID AND TRUNC(START_TIME) = TRUNC(SYSDATE) AND
END_TIME IS NULL AND LOGIN_TYPE = 'FORM') L
WHERE P.PID = L.PID(+) AND P.SERIAL# = L.SERIAL#(+) AND P.ADDR = S.PADDR
AND S.SID=C1REC.RSID AND S.INST_ID = C1REC.RINST AND S.INST_ID = P.INST_ID and
rownum=1 ORDER BY S.PROCESS,LOGON_TIME;

IF V_APPSUSER != 'UNKNOWN' THEN


V_BLOCKUSER := V_APPSUSER;
ELSIF V_DESC != 'UNKNOWN' THEN
V_BLOCKUSER := V_DESC;
ELSE
V_BLOCKUSER := V_DETAILS;
END IF ;

DBMS_OUTPUT.PUT_LINE(V_LOCKUSER||' '||V_SPID||' ('||C1REC.BSID||','||V_SERIAL||')


'||V_STATUS||' Instance '||C1REC.BINST||' IS LOCKING '||V_BLOCKUSER||' ('||
V_SID||','||V_SERIALB||')') ;

DBMS_OUTPUT.PUT_LINE('_____________________________________________________________
___________________');
END LOOP;
v_CNT := 0;

for C2REC IN C2
loop
IF V_CNT = 0 THEN
dbms_output.put_line('-');
DBMS_OUTPUT.PUT_LINE('WAITING USERS');
dbms_output.put_line('-');
V_CNT :=1;
END IF;

SELECT s.inst_id,
s.event,
s.seconds_in_wait,
p.spid ,NVL(l.user_name,'UNKNOWN') ,
NVL(l.description,'UNKNOWN'),
S.USERNAME,
s.SID,
s.serial#,
s.program||' '||s.ACTION||' '||s.module,
status
into V_INSTID, v_EVENT, V_SECONDS, V_SPID, V_APPSUSER , V_DESC, V_USERNAME ,
V_SID, V_SERIAL, V_DETAILS, V_STATUS
FROM gv\$session s, gv\$process p,
(SELECT * FROM applsys.fnd_logins fl,applsys.fnd_user u WHERE u.user_id =
fl.user_id AND TRUNC(start_time) = TRUNC(SYSDATE)
AND end_time IS NULL AND login_type = 'FORM') l
WHERE s.sid = c2rec.sid and s.inst_id = c2rec.inst_id and p.pid = l.pid(+) AND
p.serial# = l.serial#(+) AND p.addr = s.paddr AND s.inst_id = p.inst_id
and rownum=1;
IF V_APPSUSER != 'UNKNOWN' THEN
V_WAITER := V_APPSUSER;
ELSIF V_DESC != 'UNKNOWN' THEN
V_WAITER := V_DESC;
ELSE
V_WAITER := V_DETAILS;
END IF ;

DBMS_OUTPUT.PUT_LINE(V_WAITER||' '||V_SPID||' ('||C2REC.SID||','||V_SERIAL||')


Instance '||V_INSTID||' IS WAITING ON '||V_EVENT||' for '||V_SECONDS||' Seconds');

DBMS_OUTPUT.PUT_LINE('_____________________________________________________________
___________________');

end loop;
END;
/
EOF

grep -E 'LOCKING|WAITING' /dba/scripts/logs/ORAPROD1/locking.txt


if [ $? = 0 ] ; then
support@xyz.com
# mv /dba/scripts/logs/ORAPROD1/locking.txt /dba/scripts/logs/ORAPROD1/locking.old
fi

S-ar putea să vă placă și