2008-09-10 8 views

Répondre

42

Cette réponse est fortement influencée 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 des sessions provenant de tuer sur le serveur de base de données afin d'éviter tuer les connexions d'Oracle lui-même.

+0

Je reçois ORA-06550. ALTER SYSTEM ne semble pas autorisé à l'intérieur begin begin –

+0

J'ai corrigé le code. – BIBD

1

déclencheur Essayez l'ouverture de session

Insted d'essayer de déconnecter les utilisateurs que vous ne devriez pas leur permettre de se connecter.

Il existe 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; 
+0

Cela fonctionnerait en effet si mon objectif était de limiter l'accès à certaines plages ou heures IP. Mon but était de forcer tous mes utilisateurs à partir de la base de données, pas d'empêcher les connexions. Merci, cependant - je garderai cela à l'esprit. – BIBD

7

Avant sessions tuer, si possible faire

ALTER SYSTEM ENABLE RESTRICTED SESSION; 

pour arrêter de nouvelles sessions de connexion.

+0

Oui, en effet, cela rend ma solution plus complète. – BIBD

2

Si vous voulez arrêter les nouveaux utilisateurs de se connecter, mais autoriser les sessions en cours de continuer jusqu'à ce qu'ils sont inactifs, vous pouvez mettre la base de données en mode QUIESCE:

ALTER SYSTEM QUIESCE RESTRICTED; 

De l'Oracle Database Administrator's Guide:

Les sessions actives non-DBA continueront jusqu'à ce qu'elles deviennent inactives. Une session active est une session actuellement dans une transaction, une requête, une extraction ou une instruction PL/SQL; ou une session qui contient actuellement toutes les ressources partagées (par exemple, files d'attente). Aucune session inactives sont autorisés à devenir actif ... Une fois que toutes sessions non-DBA deviennent inactives, l'instruction RESTREINT ALTER SYSTEM QUIESCE complète, et la base de données est dans un état mis au repos

+0

Je vais garder cela à l'esprit. Dans mon cas, je voulais démarrer les utilisateurs sans attendre que leurs transactions se terminent (certaines d'entre elles sont plutôt longues). Tout le monde hors de la piscine MAINTENANT !!! – BIBD

1

J'ai trouvé la ci-dessous extrait 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 des sessions individuelles.

11

SYS:

startup force; 

Brutal, mais élégant.

1

Pour répondre à la question posée, voici le SQL le plus précis pour accomplir le travail, vous pouvez combiner avec boucle PL/SQL pour exécuter effectivement tuer des déclarations:

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

Je l'ai utilisé quelque chose comme ça pendant un certain temps pour tuer mes sessions sur un serveur partagé. La première ligne du 'où' peut être enlevé 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; 
2

Informations complémentaires

changements de données Oracle 11g importantes pour modifier session Session kill

auteur Oracle Mladen Gogala note qu'un signe @ 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

0

Si Oracle est en cours d'exécution sous Unix/Linux, nous pouvons alors grep pour toutes les connexions client et tuez-le

grep tous les processus client Oracle:

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

Tuez tous les processus client Oracle:

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

Questions connexes