컴파일 저장 프로세스가ddl 자물쇠에 부딪히다

3557 단어
때때로 우리는 저장 프로세스의 새로운 버전에 대해 온라인을 필요로 한다. 성능 최적화나 기능의 추가나 개선을 했을 수도 있다. 만약에 저장 프로세스가 프로그램에 호출되고 있다면 실행하는 데 시간이 오래 걸릴 것이다. 이것은 우리의 온라인 창을 넘어설 수도 있다. 그러면 어떻게 해야 한다. 어떤 사람들은 클라이언트의 연결을 끊고 세션을 지원하는 서버 프로세스가 pmon에 의해 정리될 것이라고 생각할 수도 있지만 뜻대로 되지 않는다.저장 프로세스는 여전히 실행되고 있다. 가장 효과적인 방법은 서버에서 이 세션에 대응하는session에 대응하는 세션을 찾아서 죽이는 것이다. 물리적으로 서버 프로세스를 없애는 것만은 안 된다.먼저 서버 프로세스의sid 찾기;저장 프로세스를 실행할 때 대상의ddl 자질구레한 것을 가져와야 합니다. 실행 세션은 공유 모드로 가져오고, 저장 프로세스를 컴파일할 세션은 배열 모드로 가져옵니다. 어떻게ddl 소스를 가진 세션 id를 보십니까?oracle은 우리에게 매우 유용한 보기를 제공했다:dbaddl_locks.
다음은 스토리지 프로세스 PROC를 먼저 실행하는 시뮬레이션입니다.TEST,
먼저 스토리지 프로세스 PROCTEST,
session s1:
begin
  -- Call the procedure
  proc_test;
end;/

sessions2에서 컴파일하기
session s2:
1 create or replace procedure proc_test is
2 n_num number :=0;
3 n_cnt number;
4 start_time number;
5 end_time number;
6 begi
7 ..........  。

이 때 대기 (언제 끝날지 알 수 없음) 데이터베이스에 있는 세션의 상태가 표시됩니다.
select sid,command,blocking_Session,event from v$session where status='ACTIVE' and module='PL/SQL Developer'

 
   
SID
COMMAND
BLOCKING_SESSION
EVENT
1
45
3
 
db file scattered read
2
434
24
45
library cache pin
 
 
 
 
분명히sid가 45인 세션은sid가 434인 코드를 컴파일하려는 세션을 막았다
dba 확인ddl_locks 보기가 더 잘 보여요.
   
SESSION_ID
OWNER
NAME
TYPE
MODE_HELD
MODE_REQUESTED
1
45
MHISKFDATA
PROC_TEST
Table/Procedure/Type
Null
None
2
434
MHISKFDATA
PROC_TEST
Table/Procedure/Type
Exclusive
None
 
 
 
 
 
v$lock은 다음과 같이 표시됩니다.
 select * from v$lock where sid in ('45','434') order by  sid;
ADDR
KADDR
SID
TYPE
ID1
ID2
LMODE
REQUEST
CTIME
BLOCK
00002B0774D9C4D8
00002B0774D9C538
45
TM
96902
0
3
0
2754
0
00000000FA47BE08
00000000FA47BE60
45
AE
100
0
4
0
2757
0
00000000F6FC7258
00000000F6FC72D0
45
TX
720925
365753
6
0
2753
0
00000000FA47D320
00000000FA47D378
434
AE
100
0
4
0
2085
0
00000000FA479120
00000000FA479178
434
AE
0
1
4
0
226
0
 
 
 
 
 
 
 
 
 
 
이때 할 건 45 세션을 죽이면 돼요.
select 'alter system kill session '''||sid||','||serial#||''' immediate;' from v$session  where sid='45';
1
alter system kill session '45,39175' immediate;
재편역은 문제 없을 거예요.
만약 또 문제가 있다면 진행을 죽일 수밖에 없다
select p.spid from v$process p, v$session s where p.addr = s.paddr and s.sid='45';
linux에서
kill  -9 &spid.

좋은 웹페이지 즐겨찾기