Pregunta

Necesito de forma rápida (y la fuerza) matar a todas las sesiones externas se conecta a la base de datos de oracle sin la supervisión de un y administrador.

No quiero simplemente bloquear la base de datos y permitir a los usuarios salir correctamente.

Cómo iba yo a este script?

¿Fue útil?

Solución

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 la matanza de sesiones que se originan en el servidor de base de datos para evitar la matanza de Oracle conexiones a sí mismo.

Otros consejos

Como SYS:

startup force;

Brutal, pero a la vez elegante.

Antes de la matanza de sesiones, si es posible hacer

ALTER SYSTEM ENABLE RESTRICTED SESSION;

para detener nuevas sesiones de conexión.

He estado usando algo como esto por un tiempo para matar a mis sesiones en un servidor compartido.La primera línea de la 'donde' se puede quitar para matar a todos los no 'sys' sesiones:

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 usted desea dejar de nuevos usuarios se conecten, pero permiten que la corriente sesiones para continuar hasta que estén inactivos, usted puede poner la base de datos en modo inactivo modo:

ALTER SYSTEM QUIESCE RESTRICTED;

A partir de la Base de datos de Oracle Guía del Administrador de:

No DBA sesiones activas continuará hasta que se vuelven inactivos.Un activo la sesión es el que actualmente dentro de una transacción, una consulta, un fetch, o PL/SQL de declaración;o un sesión que es en la actualidad la celebración de cualquier los recursos compartidos (por ejemplo, pone en cola).No hay sesiones inactivas se permite convertirse en activo...una Vez que todos los no DBA sesiones se vuelven inactivas, el MODIFICAR EL SISTEMA EN MODO INACTIVO RESTRINGIDO declaración completa, y la base de datos está en un estado inactivo

Información adicional

Importante Oracle 11g cambios para alterar la sesión de matar sesión

Oracle autor Mladen Gogala observa que un signo @ se requiere ahora matar a una sesión cuando se utiliza el inst_id columna:

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

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

Trate de disparar en inicio de sesión

En lugar de tratar de desconectar a los usuarios que no deben permitir la conexión.

Hay un ejemplo de tales gatillo.

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;

Me encontré con el siguiente fragmento de código ú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
;

Luego corrió:

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

Para matar a las sesiones individuales.

Para responder a la pregunta planteada, aquí es la más precisa de SQL para realizar el trabajo, se puede combinar con PL/SQL bucle para ejecutar instrucciones de interrupción:

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 se ejecuta en Unix /Linux, podemos grep para todas las conexiones de cliente y lo mata

grep todos los cliente de oracle proceso:

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

Matar a todos los cliente de oracle proceso :

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top