Frage

Ich muss schnell (und gewaltsam) alle externen Sitzungen beenden, die eine Verbindung zu meiner Oracle-Datenbank herstellen, ohne die Aufsicht eines Administrators.

Ich möchte nicht einfach die Datenbank sperren und die Benutzer ordnungsgemäß beenden lassen.

Wie würde ich das skripten?

War es hilfreich?

Lösung

Diese Antwort stark von einem Gespräch hier beeinflusst: 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;

überspringen I Sitzungen, auf dem Datenbank-Server Tötung zu vermeiden Oracle Verbindungen zu sich selbst töten.

Andere Tipps

Als SYS:

startup force;

Brutal, aber elegant.

Vor der Tötung Sitzungen, wenn möglich do

ALTER SYSTEM ENABLE RESTRICTED SESSION;

, um neue Sitzungen zu stoppen zu verbinden.

Ich habe eine Zeit lang so etwas wie dies bereits mit meinen Sitzungen auf einem gemeinsamen Server zu töten. Die erste Zeile der ‚wo‘ entfernt werden kann, alle nicht ‚sys‘ Sitzungen zu töten:

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;

Wenn Sie den Anschluss neue Benutzer stoppen wollen, aber erlauben aktuelle Sitzungen fortzusetzen, bis sie inaktiv sind, können Sie die Datenbank in QUIESCE Modus setzen:

ALTER SYSTEM QUIESCE RESTRICTED;

Von dem Oracle Database Administrator-Handbuch :

  

Nicht-DBA aktive Sitzungen werden auch weiterhin   bis sie inaktiv werden. eine aktive   Sitzung ist eine, die derzeit   innerhalb einer Transaktion, eine Abfrage, ein   holen, oder eine PL / SQL-Anweisung; oder ein   Sitzung, die zur Zeit hält jeder   gemeinsam genutzte Ressourcen (zum Beispiel,   Enqueues). Keine inaktiven Sitzungen sind   erlaubt aktiv Sobald alle zu werden ...   Nicht-DBA-Sitzungen werden inaktiv, die   ALTES SYSTEM QUIESCE RESTRICTED   Anweisung abgeschlossen ist, und die Datenbank   ist in einem eingefrorenen Zustand

Weitere Informationen

  

Wichtige Oracle 11g Änderungen Sitzung Kill-Sitzung ändern

     

Oracle Autor Mladen Gogala stellt fest, dass ein @ -Zeichen jetzt erforderlich ist, um   töten eine Sitzung, wenn die INST_ID Spalte:

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

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

Versuchen Trigger bei der Anmeldung

Insted zu versuchen, Benutzer trennen Sie sollten nicht zulassen, verbinden.

Es gibt und Beispiel für einen solchen Auslöser.

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;

Ich fand die folgenden hilfreich Schnipsel. Entnommen aus: 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
;

Dann lief:

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

Einzelsitzungen zu töten.

Zur Beantwortung der Frage gebeten, hier ist die genaueste SQL den Auftrag zu erfüllen, Sie es mit PL / SQL-Schleife kombinieren laufen tatsächlich Aussagen töten:

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;

Wenn Oracle in Unix läuft / Linux, dann können wir für alle Client-Verbindungen grep und töten es

grep alle Oracle-Client-Prozess:

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

Tötet alle Oracle-Client-Prozess:

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top