programing

오라클 데이터베이스에 연결된 모든 세션을 종료하려면 어떻게 해야 합니까?

padding 2023. 6. 7. 22:12
반응형

오라클 데이터베이스에 연결된 모든 세션을 종료하려면 어떻게 해야 합니까?

및 관리자의 감독 없이 오라클 데이터베이스에 연결된 모든 외부 세션을 신속하고 강제로 종료해야 합니다.

데이터베이스를 잠그고 사용자가 정상적으로 종료되도록 하고 싶지 않습니다.

어떻게 대본을 작성해야 할까요?

대답은 여기서의 대화에 크게 영향을 받습니다. http://www.tek-tips.com/viewthread.cfm?qid=1395151&page=3

ALTER SYSTEM ENABLE RESTRICTED SESSION;

begin     
    for x in (  
            select Sid, Serial#, machine, program  
            from v$session  
            where  
                machine <> 'MyDatabaseServerName'  
        ) loop  
        execute immediate 'Alter System Kill Session '''|| x.Sid  
                     || ',' || x.Serial# || ''' IMMEDIATE';  
    end loop;  
end;

데이터베이스 서버에서 발생하는 세션을 제거하는 작업을 건너뛰어 Oracle과의 연결이 끊어지지 않도록 합니다.

SYS로:

startup force;

잔인하지만 우아합니다.

세션을 죽이기 전에, 가능하다면,

ALTER SYSTEM ENABLE RESTRICTED SESSION;

새 세션 연결을 중지합니다.

공유 서버에서 세션을 종료하기 위해 한동안 이와 같은 것을 사용했습니다.'where'의 첫 번째 줄을 제거하여 'sys'가 아닌 모든 세션을 종료할 수 있습니다.

BEGIN
  FOR c IN (
      SELECT s.sid, s.serial#
      FROM v$session s
      WHERE (s.Osuser = 'MyUser' or s.MACHINE = 'MyNtDomain\MyMachineName')
      AND s.USERNAME <> 'SYS'
      AND s.STATUS <> 'KILLED'
  )
  LOOP
      EXECUTE IMMEDIATE 'alter system kill session ''' || c.sid || ',' || c.serial# || '''';
  END LOOP;
END;

새 사용자의 연결을 중지하고 현재 세션이 비활성화될 때까지 계속되도록 하려면 데이터베이스를 STOPECE 모드로 전환할 수 있습니다.

ALTER SYSTEM QUIESCE RESTRICTED;

Oracle Database Administrator's Guide에서 다음을 확인할 수 있습니다.

비 DBA 활성 세션은 비활성화될 때까지 계속됩니다.활성 세션은 현재 트랜잭션, 쿼리, 가져오기 또는 PL/SQL 문 내부에 있거나 공유 리소스(예: 대기열)를 현재 보유하고 있는 세션입니다.비활성 세션은 활성화할 수 없습니다...모든 비 DBA 세션이 비활성화되면 ALTER SYSTEM STUEPCE RESTRICTED 문이 완료되고 데이터베이스가 중지 상태가 됩니다.

추가 정보

세션 종료 세션을 변경하기 위한 Oracle 11g의 중요한 변경 사항

Oracle 작성자인 Mladen Gogala는 inst_id 열을 사용할 때 세션을 종료하려면 @ 기호가 필요하다고 언급합니다.

alter system kill session '130,620,@1';

http://www.dba-oracle.com/tips_killing_oracle_sessions.htm

로그온 시 트리거 시도

사용자의 연결을 끊는 대신 연결을 허용하지 않아야 합니다.

이러한 트리거에는 및 예가 있습니다.

CREATE OR REPLACE TRIGGER rds_logon_trigger
AFTER LOGON ON DATABASE
BEGIN
  IF SYS_CONTEXT('USERENV','IP_ADDRESS') not in ('192.168.2.121','192.168.2.123','192.168.2.233') THEN
    RAISE_APPLICATION_ERROR(-20003,'You are not allowed to connect to the database');
  END IF;

  IF (to_number(to_char(sysdate,'HH24'))< 6) and (to_number(to_char(sysdate,'HH24')) >18) THEN
    RAISE_APPLICATION_ERROR(-20005,'Logon only allowed during business hours');
  END IF;

END;

아래 스니펫이 도움이 되었습니다.출처: http://jeromeblog-jerome.blogspot.com/2007/10/how-to-unlock-record-on-oracle.html

select
owner||'.'||object_name obj ,
oracle_username||' ('||s.status||')' oruser ,
os_user_name osuser ,
machine computer ,
l.process unix ,
s.sid||','||s.serial# ss ,
r.name rs ,
to_char(s.logon_time,'yyyy/mm/dd hh24:mi:ss') time
from v$locked_object l ,
dba_objects o ,
v$session s ,
v$transaction t ,
v$rollname r
where l.object_id = o.object_id
and s.sid=l.session_id
and s.taddr=t.addr
and t.xidusn=r.usn
order by osuser, ss, obj
;

그런 다음 실행:

Alter System Kill Session '<value from ss above>'
;

개별 세션을 종료합니다.

작업을 수행하는 데 가장 정확한 SQL은 다음과 같습니다. 이 SQL을 PL/SQL 루프와 결합하여 kill 문을 실제로 실행할 수 있습니다.

select ses.USERNAME,
    substr(MACHINE,1,10) as MACHINE, 
    substr(module,1,25) as module,
    status, 
    'alter system kill session '''||SID||','||ses.SERIAL#||''';' as kill
from v$session ses LEFT OUTER JOIN v$process p ON (ses.paddr=p.addr)
where schemaname <> 'SYS'
    and not exists
    (select 1 
        from DBA_ROLE_PRIVS 
        where GRANTED_ROLE='DBA' 
            and schemaname=grantee)
    and machine!='yourlocalhostname' 
order by LAST_CALL_ET desc;

Oracle이 Unix/Linux에서 실행 중인 경우 모든 클라이언트 연결을 grep하여 제거할 수 있습니다.

grep all 오라클 클라이언트 프로세스:

ps -ef | grep LOCAL=NO | grep -vgrep | awk '{print $2}' | wc -l

모든 오라클 클라이언트 프로세스 종료:

-9 킬 -9ps -ef | grep LOCAL=NO | grep -v grep | awk '{print $2}'

언급URL : https://stackoverflow.com/questions/55342/how-can-i-kill-all-sessions-connecting-to-my-oracle-database

반응형