sql >> Base de Datos >  >> RDS >> Oracle

Cómo matar una instrucción SELECT en ejecución

A medida que sigue obteniendo páginas de resultados, asumo que inició la sesión en SQL*Plus. Si es así, lo más fácil es presionar ctrl + descanso muchas, muchas veces hasta que se detiene.

Las formas más complicadas y genéricas las detallo a continuación en orden creciente de ferocidad / maldad. El primero probablemente funcione para usted, pero si no es así, puede seguir bajando en la lista.

La mayoría de estos no se recomiendan y pueden tener consecuencias no deseadas.


1. Nivel de oráculo - Matar el proceso en la base de datos

Según la respuesta de ObiWanKenobi y la documentación ALTER SESSION

alter system kill session 'sid,serial#';

Para encontrar el sid , id de sesión y el serial# , número de serie, ejecute la siguiente consulta, resumida de OracleBase, y encuentre su sesión:

select s.sid, s.serial#, p.spid, s.username, s.schemaname
     , s.program, s.terminal, s.osuser
  from v$session s
  join v$process p
    on s.paddr = p.addr
 where s.type != 'BACKGROUND'

Si está ejecutando un RAC, debe cambiar esto ligeramente para tener en cuenta las múltiples instancias, inst_id es lo que los identifica:

select s.inst_id, s.sid, s.serial#, p.spid, s.username
     , s.schemaname, s.program, s.terminal, s.osuser
  from Gv$session s
  join Gv$process p
    on s.paddr = p.addr
   and s.inst_id = p.inst_id
 where s.type != 'BACKGROUND'

Esta consulta también funcionaría si no está ejecutando un RAC.

Si está utilizando una herramienta como PL/SQL Developer, la ventana de sesiones también lo ayudará a encontrarla.

Para una "eliminación" un poco más fuerte, puede especificar la palabra clave INMEDIATO, que indica a la base de datos que no espere a que se complete la transacción:

alter system kill session 'sid,serial#' immediate;

2. Nivel de sistema operativo - Emitir un SIGTERM

kill pid

Esto supone que está utilizando Linux u otra variante *nix. Un SIGTERM es una señal de finalización del sistema operativo al proceso específico que le pide que deje de ejecutarse. Intenta permitir que el proceso finalice correctamente.

Hacer esto mal podría resultar en la finalización de procesos esenciales del sistema operativo, así que tenga cuidado al escribir.

Puede encontrar el pid , identificación del proceso, ejecutando la siguiente consulta, que también le brindará información útil como el terminal desde el que se ejecuta el proceso y el nombre de usuario que lo ejecuta para que pueda asegurarse de elegir el correcto.

select p.*
  from v$process p
  left outer join v$session s
    on p.addr = s.paddr
 where s.sid = ?
   and s.serial# = ?

Una vez más, si está ejecutando un RAC, debe cambiar esto ligeramente a:

select p.*
  from Gv$process p
  left outer join Gv$session s
    on p.addr = s.paddr
 where s.sid = ?
   and s.serial# = ?

Cambiando el where cláusula a where s.status = 'KILLED' lo ayudará a encontrar procesos ya eliminados que todavía están "en ejecución".

3. SO - Emitir un SIGKILL

kill -9 pid

Usando el mismo pid recogiste en 2, un SIGKILL es una señal del sistema operativo a un proceso específico que hace que el proceso finalice inmediatamente. Una vez más tenga cuidado al escribir.

Esto rara vez debería ser necesario. Si estaba usando DML o DDL, detendrá el procesamiento de cualquier reversión y puede dificultar la recuperación de la base de datos a un estado consistente en caso de falla.

Todas las opciones restantes eliminarán todas las sesiones y darán como resultado que su base de datos, y en el caso de los servidores 6 y 7 también, deje de estar disponible. Solo deben usarse si es absolutamente necesario...

4. Oráculo - Cerrar la base de datos

shutdown immediate

En realidad, esto es más educado que un SIGKILL , aunque obviamente actúa sobre todos los procesos en la base de datos en lugar de su proceso específico. Es siempre Es bueno ser cortés con tu base de datos.

El cierre de la base de datos solo debe realizarse con el consentimiento de su DBA, si tiene uno. Es bueno decirles a las personas que usan la base de datos también.

Cierra la base de datos, finaliza todas las sesiones y hace un rollback en todas las transacciones no comprometidas. Puede llevar un tiempo si tiene grandes transacciones no confirmadas que deben revertirse.

5. Oráculo - Cierra la base de datos (la forma menos agradable)

shutdown abort

Esto es aproximadamente lo mismo que un SIGKILL , aunque una vez más en todos los procesos de la base de datos. Es una señal a la base de datos para que detenga todo de inmediato y muera:un choque fuerte. Finaliza todas las sesiones y no retrocede; debido a esto, puede significar que la base de datos tarda más en startup otra vez. A pesar del lenguaje incendiario, un shutdown abort no es pura maldad y normalmente se puede usar de manera segura.

Como antes, informe primero a las personas relevantes.

6. SO - Reiniciar el servidor

reboot

Obviamente, esto no solo detiene la base de datos sino también el servidor, así que utilícelo con precaución y con el consentimiento de sus administradores de sistemas además de los DBA, desarrolladores, clientes y usuarios.

7. SO - La última etapa

El reinicio no funcionó... Una vez que haya llegado a esta etapa, es mejor que esté usando una máquina virtual. Terminamos borrándolo...