문제

감독 및 관리자 없이 Oracle 데이터베이스에 연결되는 모든 외부 세션을 신속하게(그리고 강제로) 종료해야 합니다.

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

이 스크립트를 어떻게 작성합니까?

도움이 되었습니까?

해결책

이 답변은 다음 대화의 영향을 많이 받았습니다. 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;

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

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

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;

새로운 사용자의 연결을 중지하고 현재 세션이 비활성 상태가 될 때까지 계속되도록 하려면 데이터베이스를 QUIESCE 모드로 설정하면 됩니다.

ALTER SYSTEM QUIESCE RESTRICTED;

로부터 오라클 데이터베이스 관리자 가이드:

비 DBA 활성 세션은 비활성화 될 때까지 계속됩니다.활성 세션은 현재 트랜잭션, 쿼리, 페치 또는 PL/SQL 문 내부에있는 세션입니다.또는 현재 공유 리소스를 보유하고있는 세션 (예 : Enqueues).비활성 세션이 활성화 될 수 없음 ... 모든 비 DBA 세션이 비활성화되면 Alter System Quiesce 제한 된 명세서가 완료되고 데이터베이스는 정지 상태에 있습니다.

추가 정보

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

Oracle Author 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이 있습니다. PL/SQL 루프와 결합하여 실제로 킬 문장을 실행할 수 있습니다.

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하여 종료할 수 있습니다.

모든 Oracle 클라이언트 프로세스를 grep하십시오.

ps -ef | grep local = no | grep -v grep | awk '{print $ 2}'| WC -L

모든 Oracle 클라이언트 프로세스를 종료합니다.

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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top