Comment tuer une déclaration SELECT en cours D'exécution

Comment puis-je arrêter une déclaration SELECT en tuant la session?

la commande me donne en permanence la sortie basée sur L'instruction SELECT, je veux l'arrêter entre les deux.

40
demandé sur Ben 2012-03-03 15:00:53

6 réponses

comme vous continuez à obtenir des pages de résultats, je suppose que vous avez commencé la session en SQL*Plus. Si oui, la chose facile à faire est de bash ctrl + break beaucoup, beaucoup de fois jusqu'à ce qu'il s'arrête.

le(S) moyen (s) plus compliqué (s) et plus générique (s) que je détaille ci-dessous dans l'ordre de la férocité croissante / le mal. Le premier sera probablement travailler pour vous, mais si ce n'est pas vous pouvez continuer à aller en bas de la liste.

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



1. niveau Oracle - tuer le processus dans la base de données

Que par ObiWanKenobi la réponse de et le ALTER SESSION documentation

alter system kill session 'sid,serial#';

pour trouver le sid , numéro de session, et le serial# , numéro de série, exécutez la requête suivante-résumée à partir de OracleBase - et trouvez 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 lancez un RAC alors vous devez changer légèrement ceci pour tenir compte des instances multiples, 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 aussi si vous n'exécutez pas un RAC.

si vous utilisez un outil comme PL/SQL Developer, alors la fenêtre sessions vous aidera aussi à le trouver.

pour un "kill" légèrement plus fort, vous pouvez spécifier le mot-clé immédiat, qui demande à la base de données de ne pas attendre que la transaction complète:

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

2. niveau OS - Issue a SIGTERM

kill pid

cela suppose 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 fonctionner. Il essaie de laisser le processus se terminer avec élégance.

si vous vous trompez, vous pourriez mettre fin aux processus essentiels du système D'exploitation.

vous pouvez trouver le pid , process id, en lançant la requête suivante, ce qui vous indiquera aussi des informations utiles comme le terminal d'où le processus est lancé et le nom d'utilisateur qui l'exécute afin que vous puissiez 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 le changer légèrement en:

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

changer la clause where en where s.status = 'KILLED' vous aidera à trouver déjà processus tué qui sont encore"en cours d'exécution".

3. OS - Issue a SIGKILL

kill -9 pid

en utilisant le même pid que vous avez pris dans 2, un SIGKILL est un signal du système d'exploitation à un processus spécifique qui provoque la fin du processus immédiatement. Encore une fois, soyez prudent en tapant.

cela devrait rarement être nécessaire. Si vous faisiez DML ou DDL il va arrêter tout de restauration en cours de traitement et peut rendre difficile à récupérer la base de données d'un état cohérent en cas de défaillance.

toutes les options restantes tueront toutes les sessions et résulteront en votre base de données - et dans le cas du serveur 6 et 7 ainsi - devenant indisponible. Ils ne doivent être utilisés que si cela est absolument nécessaire...

4. Oracle - Shutdown base de données

shutdown immediate

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

fermer la base de données ne doit être fait avec le consentement de votre DBA, si vous en avez un. C'est bien de le dire aux gens qui utilisent la base de données aussi.

il ferme la base de données, mettant fin à toutes les sessions et fait un rollback sur toutes les transactions non engagées. Cela peut prendre un certain temps si vous avez d'importantes transactions non engagées qui doivent être reconduites.

5. Oracle - Arrêt de la base de données ( la moins belle façon )

shutdown abort

C'est à peu près le même qu'un SIGKILL , mais encore une fois sur tous les processus dans la base de données. C'est un signal à la base de données pour arrêter tout immédiatement et mourir - un accident difficile. Il termine toutes les sessions et ne recule pas; de ce fait il peut signifier que la base de données prend plus de startup à nouveau. Malgré le langage incendiaire un shutdown abort n'est pas un mal pur et peut normalement être utilisé en toute sécurité.

As avant d'informer les gens sur les personnes concernées en premier.

6. OS - redémarrer le serveur

reboot

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

7. OS - La dernière étape

j'ai eu un redémarrage qui n'a pas fonctionné... Une fois que vous avez atteint ce stade, vous espérez que vous utilisez une machine virtuelle. Nous avons fini par le supprimer...

63
répondu Ben 2017-05-23 12:26:18

C'est ce que j'utilise. Je fais cette première recherche pour trouver les sessions et les utilisateurs:

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';

cela me permettra de savoir s'il y a plusieurs sessions pour le même utilisateur. Ensuite, je vérifie habituellement si une session bloque la base de données.

SELECT SID, SQL_ID, USERNAME, BLOCKING_SESSION, COMMAND, MODULE, STATUS FROM v$session WHERE BLOCKING_SESSION IS NOT NULL;  

puis j'exécute un ALTER statement pour tuer une session spécifique dans ce format:

ALTER SYSTEM KILL SESSION 'sid,serial#'; 

par exemple:

ALTER SYSTEM KILL SESSION '314, 2643';
3
répondu James Drinkard 2015-07-17 14:25:36

pour tuer une session dans Oracle, vous utilisez la commande ALTER SYSTEM KILL SESSION .

détails ici: http://www.oracle-base.com/articles/misc/KillingOracleSessions.php

2
répondu ObiWanKenobi 2012-03-03 11:16:37

il n'est pas nécessaire de tuer la session entière. Dans Oracle 18c vous pouvez utiliser ALTER SYSTEM CANCEL :

Annulation d'une Instruction SQL dans une Session

vous pouvez annuler une instruction SQL dans une session en utilisant L'instruction annuler SQL ALTER SYSTEM.

au lieu de terminer une session, vous pouvez annuler une déclaration SQL chargée dans une session. Lorsque vous annuler une déclaration DML, la déclaration est annulée.

ALTER SYSTEM CANCEL SQL 'SID, SERIAL[, @INST_ID][, SQL_ID]';

si @INST_ID n'est pas spécifié, l'ID d'instance de la session courante est utilisé.

si SQL_ID n'est pas spécifié, l'instruction SQL en cours d'exécution dans la session spécifiée est terminée.

2
répondu Lukasz Szozda 2018-02-28 17:54:26

Oh! il suffit de lire les commentaires en question, ma chère je l'ai manqué. mais juste laisser la réponse être ici au cas où il peut être utile à une autre personne

j'ai essayé "Ctrl+C" et "Ctrl+ Pause" aucun n'a fonctionné. J'utilisais SQL Plus qui est venu avec le Client Oracle 10.2.0.1.0. SQL Plus est utilisé par la plupart comme client pour se connecter avec Oracle DB. J'ai utilisé L'option Cancel, sous File menu et cela a arrêté l'exécution!

File Menu, Oracle SQL*Plus

une fois que vous cliquez Fichier attendre quelques minutes puis la commande select s'arrête et menu apparaît cliquez sur Annuler.

0
répondu Shiva 2013-11-13 11:31:44

si vous voulez arrêter le processus, vous pouvez le tuer manuellement à partir du Gestionnaire des tâches d'un autre côté si vous voulez arrêter d'exécuter la requête dans le SGBD, vous pouvez arrêter comme indiqué ici pour MS sqlserver T-SQL arrêter ou abandonner la commande dans le serveur SQL Espérons que cela vous aide à

-1
répondu Rizwan Shahid 2017-05-23 12:10:06