Comment puis-je tuer toutes les sessions se connectant à ma base de données oracle?
j'ai besoin de rapidement (et de force) tuer toutes les sessions externes se connectant à ma base de données oracle sans la supervision et l'administrateur.
Je ne veux pas simplement verrouiller la base de données et laisser les utilisateurs quitter gracieusement.
Comment est-ce que j'écrirais ça?
10 réponses
Cette réponse est fortement influencé par une conversation ici: 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;
je saute les sessions de mise à mort provenant du serveur de base de données pour éviter de tuer les connexions D'Oracle à lui-même.
j'ai utilisé quelque chose comme ça pendant un moment pour tuer mes sessions sur un serveur partagé. La première ligne du 'Où' peut être retirée pour tuer toutes les sessions Non '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;
si vous voulez empêcher les nouveaux utilisateurs de se connecter, mais permettre aux sessions actuelles de continuer jusqu'à ce qu'elles soient inactives, vous pouvez mettre la base de données en mode QUIESCE:
ALTER SYSTEM QUIESCE RESTRICTED;
Base de données Oracle Guide de l'Administrateur:
les sessions actives Non-DBA se poursuivront jusqu'à ce qu'ils deviennent inactifs. Actif la session est celle qui est actuellement à l'intérieur d'une transaction, une requête, un fetch, ou une instruction PL/SQL; ou session, qui est actuellement la tenue de tout des ressources partagées (par exemple, place en file d'attente). Aucune séance inactive n'est autorisés à devenir active...Une fois que tous les les sessions non-DBA deviennent inactives, le ALTER SYSTEM QUIESCE RESTRICTED la déclaration complète, et la base de données est en mode inactif etat
informations Supplémentaires
Important Oracle 11g modifications alter session tuer session
l'auteur D'Oracle Mladen Gogala note qu'un @ sign est maintenant nécessaire pour tuer une session en utilisant la colonne inst_id:
alter system kill session '130,620,@1';
Essayez de déclenchement sur ouverture de session
Insted d'essayer de déconnecter les utilisateurs, vous ne devriez pas leur permettent de se connecter.
Il y a et un exemple d'un tel déclencheur.
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;
j'ai trouvé l'extrait ci-dessous utile. Tiré de: 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
;
Puis a couru:
Alter System Kill Session '<value from ss above>'
;
pour tuer les sessions individuelles.
Pour répondre à la question posée, voici le SQL le plus précis pour accomplir le travail, vous pouvez le combiner avec la boucle PL/SQL pour exécuter réellement des instructions de mise à mort:
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;
si Oracle tourne sous Unix / Linux alors nous pouvons grep pour toutes les connexions client et le tuer
grep tous les clients oracle processus:
ps-ef / grep LOCAL=NO / grep-v grep | awk '{print $2} ' / wc-l
Tuer tous les clients oracle processus :
kill -9 ps -ef | grep LOCAL=NO | grep -v grep | awk '{print }'