programing

사용자의 활성 및 비활성 Oracle 세션을 모두 종료하는 방법

fastcode 2023. 4. 5. 22:18
반응형

사용자의 활성 및 비활성 Oracle 세션을 모두 종료하는 방법

아래 스크립트를 사용하여 사용자에 대한 활성 및 비활성 Oracle 세션을 한 번에 종료하려고 하는데 작동하지 않습니다.스크립트는 정상적으로 실행되지만 사용자의 세션은 종료되지 않습니다.

BEGIN
  FOR r IN (select sid,serial# from v$session where username = 'USER')
  LOOP
    EXECUTE IMMEDIATE 'alter system kill session ''' || r.sid 
      || ',' || r.serial# || '''';
  END LOOP;
END;

KILL SESSION명령어는 실제로 세션을 종료하지 않습니다.그냥 자살하라고 할 뿐이죠원격 데이터베이스로부터의 응답을 기다리거나 트랜잭션을 롤백하는 등 상황에 따라 세션이 즉시 종료되지 않고 현재 작업이 완료될 때까지 기다립니다.이 경우 세션의 상태는 "kill"로 표시됩니다.그리고 가능한 한 빨리 죽일 것이다.

상태를 확인하여 확인합니다.

SELECT sid, serial#, status, username FROM v$session;

ImmEDICT 절을 사용할 수도 있습니다.

ALTER SYSTEM KILL SESSION 'sid,serial#' IMMEDIATE;

IMMEDIATE명령어로 실행되는 작업에는 영향을 주지 않지만 명령어는 킬 확인을 기다리지 않고 즉시 현재 세션으로 제어를 되돌립니다.Killing Oracle Sessions를 살펴보십시오.

업데이트 모든 세션을 종료하려면 작은 스크립트를 준비하면 됩니다.

SELECT 'ALTER SYSTEM KILL SESSION '''||sid||','||serial#||''' IMMEDIATE;' FROM v$session;

상기의 스풀링.sql파일을 작성하여 실행하거나, 출력을 복사하여 붙여넣어서 실행합니다.

BEGIN
  FOR r IN (select sid,serial# from v$session where username='user')
  LOOP
      EXECUTE IMMEDIATE 'alter system kill session ''' || r.sid  || ',' 
        || r.serial# || ''' immediate';
  END LOOP;
END;

이거면 될 것 같아 - 방금 스크립트를 변경하여immediate키워드를 지정합니다.이전 답변에서 지적한 바와 같이kill session살인에 대한 세션만 표시합니다. 즉시가 아니라 나중에 편할 때 표시됩니다.

당신의 질문에서 결과를 바로 알 수 있을 것 같았습니다.그렇게immediate이를 강제하기 위해 키워드를 사용합니다.

다음 스크립트를 실행합니다.

SELECT 'ALTER SYSTEM KILL SESSION '''||sid||','||serial#||''' IMMEDIATE;' 
FROM v$session 
where username='YOUR_USER';

실행되어야 하는 sqls가 출력됩니다.

BEGIN
  FOR r IN (select sid,serial# from v$session where username='user')
  LOOP
      EXECUTE IMMEDIATE 'alter system kill session ''' || r.sid  || ',' || r.serial# || '''';
  END LOOP;
END;
/

저는 좋아요.

Oracle 11g에서는 다음과 같은 오류가 발생할 수 있기 때문에 작동하지 않을 수 있습니다.

Error report:
SQL Error: ORA-00026: missing or invalid session ID
00026. 00000 -  "missing or invalid session ID"
*Cause:    Missing or invalid session ID string for ALTER SYSTEM KILL SESSION.
*Action:   Retry with a valid session ID.

이 문제를 해결하려면 아래 코드를 사용하여 세션을 식별하십시오.

SQL> select inst_id,sid,serial# from gv$session또는 v$120

메모: v$session에는 inst_id 필드가 없습니다.

그리고 그들을 죽인다

alter system kill session 'sid,serial,@inst_id' IMMEDIATE;

살인 전날 비활성 세션

begin
    for i in (select * from v$session where status='INACTIVE' and (sysdate-PREV_EXEC_START)>1)
    LOOP
        EXECUTE IMMEDIATE(q'{ALTER SYSTEM KILL SESSION '}'||i.sid||q'[,]'  ||i.serial#||q'[']'||' IMMEDIATE');
    END LOOP;
end;

언급URL : https://stackoverflow.com/questions/31201693/how-to-kill-all-active-and-inactive-oracle-sessions-for-user

반응형