2008-09-17 12 views
53

¿Existe alguna forma mejor de desconectar a la fuerza a todos los usuarios de un esquema de base de datos Oracle 10g que reiniciar los servicios de la base de datos Oracle?Eliminando un usuario conectado de un esquema de base de datos de Oracle 10g

Tenemos varios desarrolladores que usan SQL Developer conectándose al mismo esquema en un único servidor Oracle 10g. El problema es que cuando queremos soltar el esquema para reconstruirlo, inevitablemente, alguien todavía está conectado y no podemos dejar caer el esquema de la base de datos o el usuario mientras alguien todavía está conectado.

De la misma manera, no queremos eliminar todas las conexiones a otros esquemas porque otras personas pueden estar todavía conectadas y probando con esos esquemas.

¿Alguien sabe de una manera rápida de resolver esto?

Respuesta

97

para encontrar las sesiones, como un uso DBA

select sid,serial# from v$session where username = '<your_schema>'

Si usted quiere estar seguro sólo para obtener las sesiones que utilizan SQL Developer, puede añadir and program = 'SQL Developer'. Si sólo desea matar a las sesiones que pertenecen a un promotor específico, puede agregar una restricción a la os_user

Entonces matarlos con

alter system kill session '<sid>,<serial#>'

(por ejemplo alter system kill session '39,1232')

Un consulta que produce sentencias de ejecución listas para usar podría ser

select 'alter system kill session ''' || sid || ',' || serial# || ''';' from v$session where username = '<your_schema>'

Esto devolverá una instrucción de muertes por sesión de ese usuario - algo así como:

alter system kill session '375,64855';

alter system kill session '346,53146';

+0

me encontré con que en nuestro entorno RAC, matando a la sesión menudo dejó colgando, pero encontrar el ID del proceso y matando desde el sistema operativo siempre trabajado . – Jonathan

+4

small addition - agregue inmediatamente al comando: 'select 'alter system kill session' '' || sid || ',' || número de serie || '' 'inmediato;' de v $ session donde username = ''; 'esto forzará el comando – Michael

+0

nice answer. Exactamente lo que estaba buscando. –

0

¿Has probado ALTER SYSTEM KILL SESSION? Obtener el SID y la Serie No. de V $ sesión para cada sesión en el esquema dado, y luego hacer

ALTER SCHEMA MATANZA DE SESIONES sid, serial # ;

0

Sólo mis dos centavos: la mejor manera (pero probablemente no el más rápido en el corto plazo) probablemente sea para cada desarrollador trabajar en su propia instancia de base de datos (ver rule #1 for database work).

La instalación de Oracle en una estación de desarrollador se ha convertido en un pan comido desde Oracle Database 10g Express Edition.

+0

Solo para Windows y ciertos sabores de Linux. –

+0

Eso no es realmente relevante para la pregunta? – Konrads

+0

Puede que no sea la respuesta que el solicitante estaba buscando y puedo entender perfectamente por qué no se ha elevado mucho, pero creo que es muy relevante teniendo en cuenta el caso de uso que presentó específicamente. Múltiples desarrolladores trabajando en la misma base de datos es una muy mala idea, y este problema definitivamente no es lo peor que sucederá. – Mac

1

Asegúrese de modificar el sistema y habilitar la sesión restringida antes de matarlos o volverán a iniciar sesión rápidamente en la base de datos antes de completar su trabajo.

+2

Puede ser más fácil y menos intrusivo bloquear al usuario que intenta desconectar, luego eliminar todas las sesiones conectadas de ese usuario, soltarlo y volver a crearlo. No es necesario restringir innecesariamente el acceso a otros usuarios. –

1

sólo tiene que utilizar SQL:

disconnect; 

conn tiger/scott as sysdba; 
15

encontrar las sesiones existentes a la base de datos utilizando la siguiente consulta:

SELECT s.inst_id, 
     s.sid, 
     s.serial#, 
     p.spid, 
     s.username, 
     s.program 
FROM gv$session s 
     JOIN gv$process p ON p.addr = s.paddr AND p.inst_id = s.inst_id 
WHERE s.type != 'BACKGROUND'; 

verá algo parecido a continuación. Oracle Sessions

A continuación, ejecute la consulta a continuación con los valores extraídos de los resultados anteriores.

ALTER SYSTEM KILL SESSION '<put above s.sid here>,<put above s.serial# here>'; 

Ex: ALTER SISTEMA DE MATAR DE SESIONES '93, 943' ;

7

mi propuesta es esta simple bloque anónimo:

DECLARE 
    lc_username VARCHAR2 (32) := 'your user name here'; 
BEGIN 
    FOR ln_cur IN (SELECT sid, serial# FROM v$session WHERE username = lc_username) 
    LOOP 
     EXECUTE IMMEDIATE ('ALTER SYSTEM KILL SESSION ''' || ln_cur.sid || ',' || ln_cur.serial# || ''' IMMEDIATE'); 
    END LOOP; 
END; 
/
+1

es mejor tener en cuenta a los ospid antes de matar sesiones, pueden quedarse atascados – user3380585

Cuestiones relacionadas