Wie kann ich alle Sitzungen beenden, die eine Verbindung zu meiner Oracle-Datenbank herstellen?
-
09-06-2019 - |
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?
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';
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}'