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?

29
demandé sur BIBD 2008-09-11 01:16:10

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.

44
répondu BIBD 2013-06-10 15:51:26

comme SYS:

startup force;

Brutal, mais élégant.

11
répondu Gaius 2010-09-29 19:45:24

avant les séances de killing, si possible do

ALTER SYSTEM ENABLE RESTRICTED SESSION;

pour empêcher les nouvelles sessions de se connecter.

7
répondu 2008-09-13 20:00:36

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;
4
répondu Thomas Bratt 2011-10-18 10:55:32

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

2
répondu Gazmo 2008-10-24 16:10:07

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';

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

2
répondu Vadzim 2012-02-02 18:14:21

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;
1
répondu Grrey 2008-09-12 17:34:05

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.

1
répondu jon077 2009-06-02 14:05:04

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;
1
répondu dovka 2011-05-25 16:22:15

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 }'

0
répondu Ramki 2016-03-30 04:47:34