2008-09-10 74 views

Respuesta

42

Esta respuesta está fuertemente influenciado por una conversación aquí: 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; 

me salto sesiones matando originan en el servidor de base de datos para evitar la muerte de las conexiones de Oracle para sí mismo.

+0

me sale ORA-06550. ALTER SYSTEM parece no permitido dentro de begin end –

+0

He corregido el código. – BIBD

1

Try gatillo de inicio de sesión

Insted de usuarios que tratan de desconexión no debe permitir que se conecten.

Hay un ejemplo de dicho activador.

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

Esto de hecho funcionaría si mi objetivo fuera limitar el acceso a rangos o tiempos de IP específicos. Mi objetivo era obligar a todos mis usuarios a la base de datos, no evitar los inicios de sesión. Gracias, sin embargo, lo tendré en cuenta. – BIBD

7

Antes de las sesiones de matar, si es posible hacer

ALTER SYSTEM ENABLE RESTRICTED SESSION; 

para detener las nuevas sesiones de conexión.

+0

Sí, de hecho, esto hace que mi solución sea más completa. – BIBD

2

Si desea dejar de nuevos usuarios se conecten, sino permitir que las sesiones actuales a seguir hasta que estén inactivos, puede poner la base de datos en modalidad de inmovilización:

ALTER SYSTEM QUIESCE RESTRICTED; 

Desde el Oracle Database Administrator's Guide:

Las sesiones activas que no son DBA continuarán hasta que se vuelvan inactivas. Una sesión activa es una que actualmente es dentro de una transacción, una consulta, una recuperación , o una instrucción PL/SQL; o una sesión que actualmente tiene recursos compartidos (por ejemplo, enqueues). No hay sesiones inactivas se permite que se active ... Una vez que todas las sesiones no DBA se vuelven inactivas, el alteraciones en el sistema QUIESCE RESTRINGIDO la declaración se realiza, y la base de datos está en un estado de inmovilidad

+0

Lo tendré en cuenta. En mi caso, quise arrancar a los usuarios sin esperar a que finalicen sus transacciones (algunos de ellos son bastante largos). ¡Todos fuera de la piscina AHORA! – BIBD

1

encontré la debajo del fragmento útil. Tomado 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 
; 

Entonces corrieron:

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

Para matar las sesiones individuales.

11

Como SYS:

startup force; 

Brutal, pero elegante.

1

Para responder a la pregunta planteada, aquí es el SQL más preciso para realizar el trabajo, se puede combinar con PL bucle/SQL para ejecutar realmente matar a las declaraciones:

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

He estado usando algo así por un tiempo para matar mis sesiones en un servidor compartido. La primera línea del 'dónde' se puede quitar para matar las sesiones de todos los 'SYS' no:

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

Otros detalles

importantes cambios Oracle 11g para alterar sesión de matanza sesión

Oracle autor Mladen Gogala señala que un signo @ se requiere ahora a matar a una sesión cuando se utiliza la columna de la inst_id:

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

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

0

Si Oracle se ejecuta en Unix/Linux, entonces podemos grep para todas las conexiones de cliente y matarlo

grep todo proceso de cliente de Oracle:

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

matar a todos los procesos de cliente de Oracle:

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

Cuestiones relacionadas