Oracle
 sql >> Base de données >  >> RDS >> Oracle

Comment tuer une instruction SELECT en cours d'exécution

Au fur et à mesure que vous obtenez des pages de résultats, je suppose que vous avez démarré la session dans SQL * Plus. Si c'est le cas, la chose la plus simple à faire est de frapper ctrl + pause plusieurs, plusieurs fois jusqu'à ce qu'il s'arrête.

La ou les manières les plus compliquées et les plus génériques que je détaille ci-dessous par ordre croissant de férocité / mal. Le premier fonctionnera probablement pour vous, mais si ce n'est pas le cas, vous pouvez continuer à descendre dans la liste.

La plupart d'entre eux ne sont pas recommandés et peuvent avoir des conséquences inattendues.


1. Niveau Oracle - Tuez le processus dans la base de données

Selon la réponse d'ObiWanKenobi et la documentation ALTER SESSION

alter system kill session 'sid,serial#';

Pour trouver le sid , l'identifiant de session et le serial# , numéro de série, exécutez la requête suivante - résumée à partir d'OracleBase - et recherchez votre session :

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 vous utilisez un RAC, vous devez le modifier légèrement pour prendre en compte les multiples instances, inst_id est ce qui les identifie :

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'

Cette requête fonctionnerait également si vous n'exécutez pas de RAC.

Si vous utilisez un outil tel que PL/SQL Developer, la fenêtre des sessions vous aidera également à le trouver.

Pour un "kill" légèrement plus fort, vous pouvez spécifier le mot clé IMMEDIATE, qui indique à la base de données de ne pas attendre la fin de la transaction :

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

2. Niveau du système d'exploitation - Émettre un SIGTERM

kill pid

Cela suppose que vous utilisez Linux ou une autre variante *nix. Un SIGTERM est un signal de fin du système d'exploitation au processus spécifique lui demandant d'arrêter de s'exécuter. Il essaie de laisser le processus se terminer normalement.

Si vous vous trompez, vous risquez de mettre fin à des processus essentiels du système d'exploitation. Soyez donc prudent lors de la saisie.

Vous pouvez trouver le pid , ID de processus, en exécutant la requête suivante, qui vous fournira également des informations utiles telles que le terminal à partir duquel le processus s'exécute et le nom d'utilisateur qui l'exécute afin que vous puissiez vous assurer de choisir le bon.

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

Encore une fois, si vous utilisez un RAC, vous devez modifier légèrement ceci :

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

Changer le where clause à where s.status = 'KILLED' vous aidera à trouver les processus déjà tués qui sont toujours "en cours d'exécution".

3. SE - Émettre un SIGKILL

kill -9 pid

Utiliser le même pid vous avez ramassé en 2, un SIGKILL est un signal du système d'exploitation à un processus spécifique qui provoque l'arrêt immédiat du processus. Encore une fois soyez prudent lorsque vous tapez.

Cela devrait rarement être nécessaire. Si vous faisiez DML ou DDL, cela arrêtera toute restauration en cours et peut rendre difficile la restauration de la base de données dans un état cohérent en cas d'échec.

Toutes les options restantes tueront toutes les sessions et rendront votre base de données - et dans le cas des serveurs 6 et 7 également - indisponible. Ils ne doivent être utilisés qu'en cas d'absolue nécessité...

4. Oracle - Arrêter la base de données

shutdown immediate

C'est en fait plus poli qu'un SIGKILL , bien qu'il agisse évidemment sur tous les processus de la base de données plutôt que sur votre processus spécifique. C'est toujours bon d'être poli avec votre base de données.

La fermeture de la base de données ne doit se faire qu'avec l'accord de votre DBA, si vous en avez un. C'est bien de le dire également aux personnes qui utilisent la base de données.

Il ferme la base de données, met fin à toutes les sessions et effectue un rollback sur toutes les transactions non validées. Cela peut prendre un certain temps si vous avez d'importantes transactions non validées qui doivent être annulées.

5. Oracle - Arrêter la base de données (la manière la moins agréable)

shutdown abort

C'est à peu près la même chose qu'un SIGKILL , mais encore une fois sur tous les processus de la base de données. C'est un signal à la base de données pour qu'elle arrête tout immédiatement et meure - un gros crash. Il met fin à toutes les sessions et n'effectue aucune restauration ; à cause de cela, cela peut signifier que la base de données prend plus de temps à startup de nouveau. Malgré le langage incendiaire, un shutdown abort n'est pas purement diabolique et peut normalement être utilisé en toute sécurité.

Comme avant, informez d'abord les personnes concernées.

6. SE - Redémarrez le serveur

reboot

Évidemment, cela arrête non seulement la base de données mais aussi le serveur, donc utilisez-le avec prudence et avec le consentement de vos administrateurs système en plus des administrateurs de base de données, des développeurs, des clients et des utilisateurs.

7. SE - La dernière étape

Le redémarrage n'a pas fonctionné... Une fois que vous avez atteint cette étape, vous feriez mieux d'espérer que vous utilisez une machine virtuelle. Nous avons fini par le supprimer...