IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Oracle Discussion :

[Oracle] Killer un update en cours


Sujet :

Oracle

  1. #1
    Membre régulier Avatar de venegan
    Inscrit en
    Mars 2005
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 72
    Points : 70
    Points
    70
    Par défaut [Oracle] Killer un update en cours
    Je voudrais savoir s il existe une commande pour voir les update en cours et de les killer car j ai lancé une requete (update) qui répond pas..

    je suis sous Oracle 8i.

    Merci.

  2. #2
    Membre émérite Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Points : 2 370
    Points
    2 370
    Par défaut
    Si tu as l'OEM (Oracle Entreprise Manager) tu peux voir les sessions en cours, voir le code SQL en cours et killer la session que tu veux.

    Sinon en ligne de commande c'est possible aussi mais je n'ai plus la méthode en tête... Je me demande si il ne faut pas aller zieuter dans SQL_TEXT pour y trouver ton code SQL et ensuite killer la session qui y correspond.

  3. #3
    Membre expert
    Avatar de LeoAnderson
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 938
    Points : 3 199
    Points
    3 199
    Par défaut
    IL faut commencer par identifier la session :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT sid,serial#,osuser,program
      FROM   v$session s
     WHERE Type = 'USER';
    ensuite, en ayant le privilège nécessaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ALTER SYSTEM KILL SESSION '<sid>,<serial#>';

  4. #4
    Membre émérite Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Points : 2 370
    Points
    2 370
    Par défaut
    Certes Leo mais la question est comment identifier la session. Imaginons qu'un utilisateur distant envoie 3 requêtes depuis 3 fenêtres SQL*Plus. Comment identifier sans OEM celle qui est en train de faire un UPDATE ?

  5. #5
    Rédacteur

    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 320
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 320
    Points : 3 798
    Points
    3 798
    Par défaut
    Bonjour ,
    Grace à la jointure entre v$session et v$sqlarea on peut identifier la requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    v$session.sql_address = v$sqlarea.address

  6. #6
    Membre confirmé

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    487
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 487
    Points : 455
    Points
    455
    Par défaut
    et la colonne command de v$session nous donne le type de commande.
    Pour un update, c'est 6.

  7. #7
    Membre émérite Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Points : 2 370
    Points
    2 370
    Par défaut
    Donc on aura quelquechose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT sid,serial#,osuser,program
      FROM   v$session s
     WHERE Type = 'USER' and command=6;
    pour trouver la session qui fait un update ou bien quelquechose comme ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT sid,serial#,osuser,program,command, sql_text
      FROM   v$session, v$sqlarea
     WHERE Type = 'USER'
     AND v$session.sql_address = v$sqlarea.address;
    pour trouver celle qu'on veut ?

  8. #8
    Rédacteur

    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 320
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 320
    Points : 3 798
    Points
    3 798
    Par défaut
    Tout à fait ,
    tu pourrais même si tu étais perfectionniste faire un replace ou decode sur le type de commande et le remplacer par quelquechose de plus explicite.
    Du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT sid,serial#,osuser,program,DECODE(command,'3','Select','6','Update','7','Delete','2','Insert','85','Truncate','0','Pl/Sql',command), sql_text 
      FROM   v$session, v$sqlarea 
     WHERE TYPE = 'USER' 
     AND v$session.sql_address = v$sqlarea.address;
    Aprés à toi de chercher les ordres SQL Que je n'ai pas mis ...

  9. #9
    Membre confirmé

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    487
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 487
    Points : 455
    Points
    455
    Par défaut
    Citation Envoyé par Jaouad
    Tout à fait ,
    tu pourrais même si tu étais perfectionniste faire un replace ou decode sur le type de commande et le remplacer par quelquechose de plus explicite.
    Du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT sid,serial#,osuser,program,DECODE(command,'3','Select','6','Update','7','Delete','2','Insert','85','Truncate','0','Pl/Sql',command), sql_text 
      FROM   v$session, v$sqlarea 
     WHERE TYPE = 'USER' 
     AND v$session.sql_address = v$sqlarea.address;
    Aprés à toi de chercher les ordres SQL Que je n'ai pas mis ...
    Bonjour Jaouad,
    Que veux dire '0','Pl/Sql'' dans ton decode?
    le code 0 n'est pas renseigné dans les specs de la vue v$session et je me suis toujours demandé sa signification.

  10. #10
    Rédacteur

    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 320
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 320
    Points : 3 798
    Points
    3 798
    Par défaut
    c 'est pas reéllement du SQL , mais le 0 à mon sens sont des ordes récursifs ou systéme si tu préfère.
    D'ailleurs en régle génèrale c est SYS qui les lance

  11. #11
    Membre régulier Avatar de venegan
    Inscrit en
    Mars 2005
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 72
    Points : 70
    Points
    70
    Par défaut
    Merci pour vos réponses, le seul hic c est que il ne connait pas la (les) table(s) v$session. Est ce que je dois etre un user special ?

  12. #12
    Membre régulier
    Inscrit en
    Mars 2006
    Messages
    88
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 88
    Points : 95
    Points
    95
    Par défaut
    Non, pas besoin d'être un user spécial, mais il faut avoir les droits pour lire ces tables systèmes. De la même façon, il faut avoir le droit d'executer les ordres de type "ALTER SYSTEM". D'un point de vue global sur la base, seul un utilisateur système ou administrateur (donc de haut niveau d'habilitation) peut les donner à un autre utilisateur.

    @+,
    NicK.

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Août 2005
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 68
    Points : 78
    Points
    78
    Par défaut
    Bonjour à tous,

    Suite à des déconvenues récentes, je déconseille de killer une session qui est en train de faire un update car Oracle doit ensuite rollbacker en tâche de fond, ce qui est très très long. Les lignes restent bien sûr lockées pendant toute l'opération.

    Si un update malheureux a été lancé (ex update sur une grosse table sans clause where) mieux vaut attendre qu'il se termine et faire un rollback explicite que le killer : c'est pire que pire.

Discussions similaires

  1. Réponses: 5
    Dernier message: 20/03/2008, 13h47
  2. Réponses: 7
    Dernier message: 17/10/2006, 16h32
  3. [Oracle] combiner un update et un insert
    Par Pakkaï dans le forum Langage SQL
    Réponses: 3
    Dernier message: 31/08/2006, 11h39
  4. [Débutant] [Forms 6/Oracle 8.1.7] recherche cours
    Par alliga dans le forum Oracle
    Réponses: 15
    Dernier message: 10/02/2006, 08h17
  5. [C#] [Oracle] Problème d'Update
    Par _Air_ dans le forum Windows Forms
    Réponses: 12
    Dernier message: 06/04/2005, 13h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo