source

세션을 종료하지 않고 오라클에서 단일 쿼리를 종료할 수 있습니까?

ittop 2023. 6. 26. 23:08
반응형

세션을 종료하지 않고 오라클에서 단일 쿼리를 종료할 수 있습니까?

Oracle 10.2.0.4에서 사용자의 쿼리를 전체 세션을 종료하지 않고 종료할 수 있습니다.이렇게 하면 쿼리를 종료할 수 있지만 사용자가 세션에서 로그아웃하지 않으므로 다른 쿼리를 계속 만들 수 있습니다.이것이 가능합니까?아니면 세션을 죽이는 둔기가 쿼리의 실행을 끝낼 수 있는 유일한 방법입니까?

속임수를 찾았어요.이것이 얼마나 안전하게 가지고 놀 수 있는지는 모르겠지만, 효과가 있습니다.Oracle 이벤트 10237이 있는데, 이 이벤트는 "시뮬레이션 ^C(테스트 목적)"로 설명됩니다.

중단할 세션의 SID와 SERIAL#이 있어야 합니다.

SYS.DBMS_SYSTEM을 호출합니다.SET_EV(sid, serial#, 10237, 1, '')를 눌러 대상 세션에서 이벤트를 활성화합니다.현재 실행 중인 모든 문이 중단되어야 합니다("ORA-01013: 사용자가 현재 작업 취소를 요청했습니다" 수신).이벤트가 설정되어 있는 동안 세션이 실행을 시도하는 모든 추가 문은 동일한 오류로 즉시 종료됩니다.

이벤트를 비활성화하려면 네 번째 매개 변수를 "0"으로 설정한 상태에서 동일한 호출을 수행합니다.그러면 세션이 문을 다시 실행할 수 있습니다.

대상 세션은 이벤트가 설정되었음을 감지해야 하며, 이벤트가 수행 중인 작업에 따라 시간이 걸리거나 발생하지 않을 수 있습니다.따라서 이벤트를 빠르게 설정하거나 해제할 수 없습니다.설정을 켜고 문제의 문이 중지되었는지 확인한 다음 해제해야 합니다.

여기 샘플 코드가 있습니다.이는 SQL Plus에서 "sid" 및 "serial" 대체 변수가 적절하게 정의된 익명 블록으로 실행되어야 합니다.이러한 매개 변수를 사용하여 저장 프로시저로 전환할 수 있습니다.

DECLARE
  l_status  v$session.status%TYPE;
BEGIN

  dbms_system.set_ev( &sid, &serial, 10237, 1, '');

  LOOP
    SELECT status INTO l_status FROM v$session
      WHERE sid = &sid and serial# = &serial;
    EXIT WHEN l_status='INACTIVE';
  END LOOP;

  dbms_system.set_ev( &sid, &serial, 10237, 0, '');
END;

TOD에서 할 수 있으니 가능할 것 같습니다.쿼리가 실행되는 동안 Cancel(취소) 대화 상자가 나타나 쿼리를 중지할 수 있습니다.

어떻게 구현되는지는 잘 모르겠지만, 그것도 알아보면 매우 흥미로울 것입니다.

만약 당신이 java를 사용한다면 java.sql이 있습니다.이 작업을 수행해야 하는 문 취소() 메서드입니다.참고 사항 및 제한 사항은 여기를 참조하십시오.

http://download.oracle.com/docs/cd/B14117_01/java.101/b10979/tips.htm#BACDAICJ

18c부터 다음 명령을 사용하여 전체 세션을 종료하지 않고 단일 쿼리를 종료할 수 있습니다.

ALTER SYSTEM CANCEL SQL 'SID, SERIAL, @INST_ID, SQL_ID';

위의 명령은 12.2에서 작동할 수 있지만 해당 릴리스에서는 문서화되어 있지 않습니다.


18c 이전에는 사용자의 응용 프로그램이 OCI 취소 또는 동등한 방법으로 쿼리를 취소할 수 있어야 합니다.

그렇지 않으면 리소스 관리자(Oracle EE의 경우)를 사용하는 것이 가장 좋습니다. DBMS_RESOURCE_MANAGER.SWITCH_CONSTUMER_GROUP_FOR_SESS를 사용하여 대상 세션을 소비자 그룹 CANCEL_SQL로 설정할 수 있습니다.

다른 세션 쿼리를 취소하기 위한 또 다른 해킹은 sqlplus windows 클라이언트 세션에서는 작동하지 않지만 kill -URG를 사용하여 오라클 프로세스에 긴급 신호를 보내는 것입니다(일상적인 사용이 아닌 해킹입니다).

이 기능이 작동하는 이유에 대해 다음과 같이 썼습니다.

http://blog.tanelpoder.com/2010/02/17/how-to-cancel-a-query-running-in-another-session/

리소스 제한을 확인할 수 있습니다.

"사용자가 호출 수준 리소스 제한을 초과하면 Oracle은 문 처리를 중지하고 문을 롤백한 후 오류를 반환합니다.그러나 현재 트랜잭션에 대한 이전의 모든 설명은 그대로 유지되며 사용자의 세션은 연결된 상태로 유지됩니다."

이는 SQL을 취소하는 이유가 잘못된 행 집합을 업데이트하는 것이 아니라 리소스 제한 때문이라고 가정합니다(예:리소스 제한을 추가해도 현재 실행 중인 SQL에 영향을 미치지 못할 것으로 예상됩니다.

http://download.oracle.com/docs/cd/B19306_01/server.102/b14220/security.htm#i13767
http://download.oracle.com/docs/cd/B19306_01/server.102/b14231/dbrm.htm#i1010776

언급URL : https://stackoverflow.com/questions/466963/is-it-possible-to-kill-a-single-query-in-oracle-without-killing-the-session

반응형