사용자의 활성 및 비활성 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
'programing' 카테고리의 다른 글
| Oracle은 SQL Server의 테이블 변수와 동등합니까? (0) | 2023.04.05 |
|---|---|
| JSON을 통해 JSON의 가치를 얻습니다.그물 (0) | 2023.04.05 |
| Contact Form 7의 이메일 송신을 금지하는 방법 (0) | 2023.04.05 |
| jquery/ajax를 사용하여 Div의 콘텐츠 새로 고침/재로드 (0) | 2023.04.05 |
| angular-translate를 사용한 유닛 테스트 방법 (0) | 2023.04.05 |