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

Administration Oracle Discussion :

Snapshot too old


Sujet :

Administration Oracle

  1. #1
    Membre éclairé Avatar de ilalaina
    Homme Profil pro
    Inscrit en
    Mai 2007
    Messages
    341
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Mai 2007
    Messages : 341
    Par défaut Snapshot too old
    Bonjour à tous.

    Je travaille sur oracle 8.

    J'ai une procédure qui génère toujours l'erreur "Snapshot too old".
    J'ai essayé d'assigner un gros rollback segment à la transaction, mais l'erreur persiste toujours. J'ai même augmenté progressivement la taille optimale du rollback segment en question (de 32 Mo à 1 Go) pour tester mais toujours le même problême. (Mais snapshot too old sur un autre rollback segment).
    C'est ce que je ne comprends pas parce 1 Go devrait suffire selon mon estimation.
    J'ai mis à 1 go la taille optimale de toutes les rollback segments pour essayer de comprendre mais le problème n'est toujours pas résolu.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for c_curs in cCurs loop
    maProcedure2(mesParams);
    end loop;
    C'est tout ce que fait ma procédure.
    Et l'autre procédure maProcedure2 ne fait que des inserts selon les conditions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if ... then
    insert into ........
    commit;
    end if;
    Pourriez vous m'éclaircir un peu car je suis à court d'idées.
    Merci d'avance.

  2. #2
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    C'est pas la taille mais le nombre de rollback segment que tu dois augmenter. Essaye d'optimiser ta requête aussi

  3. #3
    Membre éclairé Avatar de ilalaina
    Homme Profil pro
    Inscrit en
    Mai 2007
    Messages
    341
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Mai 2007
    Messages : 341
    Par défaut
    Merci pour la réponse, je vais essayer de ce côté tout à l'heure car je ne peux pas encore redémarrer la base pour l'instant.
    Toutefois j'aurais qualques questions :
    • Une procédure peut-elle être considérée comme une seule transaction ou est-ce que chaque DML constitue une transaction? C'est à dire si dans une procédure, juste après "BEGIN" je mets
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      set transaction use rollback segment ...
      ce rollback segment sera utilisé dans toute la procédure (J'ai plusieurs commit dans la procédure).
    • Si je ne spécifie pas de rollback segment à utiliser est-ce que c'est le rollback segment "SYSTEM" qui va être utilisé puisque c'est celui par défaut.

    Merci.

  4. #4
    Membre Expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Par défaut
    Une transaction démarre implicitement à la première instruction SQL qui écrit dans la base et se termine par COMMIT: s'il y a plusieurs COMMIT, il y a donc plusieurs transactions. Et l'instruction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     SET transaction USE rollback segment ...
    doit être répétée à chaque début de transaction si la transaction doit utiliser ce rollback segment en particulier. Il n'y aucun lien entre le "BEGIN" PL/SQL et le début de transaction.

    En général le rollback segment SYSTEM est utilisé par Oracle dans des cas très particulier et non par des transactions applicatives. S'il n'y a pas de rollback segment spécifié pour une transaction, Oracle en choisit un en fonction de critères internes comme "choisir le plus rollback segment qui a le moins de transactions en cours".

  5. #5
    Expert confirmé
    Avatar de pachot
    Homme Profil pro
    Developer Advocate YugabyteDB
    Inscrit en
    Novembre 2007
    Messages
    1 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Suisse

    Informations professionnelles :
    Activité : Developer Advocate YugabyteDB
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 822
    Billets dans le blog
    1
    Par défaut fetch across commit
    Bonjour,

    Je suppose que le curseur c_curs lit la table sur laquelle est fait le insert.
    Le problème vient du fait que tu oucres un curseur et que tu fais un commit après chaque fetch. C'est quelque chose à éviter car chaque fetch doit aller voir les rollback segments pour reconstruire les données telles qu'elles étaient à l'ouverture du curseur, et celà nécessite beaucoup de undo, beaucoup plus que les 1Go estimés.

    Tu ne devrais pas faire un commit dans la boucle, pas de commit dans la procédure. C'est seulement à la fin, au plus haut niveau que l'on fait le commit.

    D'ailleurs, lorsque to programme plante en cous, comment sais-tu ce qui a déjà été inséré est commité ?

    C'est le seul moyen. En oracle 8, pas possible d'éviter que les rollbacks soient écrasés lorsqu'ils sont commités. Inutile de les augmenter.

    Cordialement,
    Franck.

  6. #6
    Membre confirmé Avatar de gaboo_bl
    Profil pro
    Inscrit en
    Août 2006
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2006
    Messages : 67
    Par défaut
    Bonjour,

    Est ce que ton curseur est ouvert en for update? Si oui c'est très probablement de la que vient ton problème, comme expliqué par pachot.

    Une solution de contournement qui marche bien (et par ailleurs qui est souvent plus rapide) serait dans ce cas de charger les données de ton curseur dans une variable tableau (tu crée un type t1 de ton enregistrement, et un autre type qui sera un tableau de t1) et de travailler sur ce tableau, puis de tout mettre à jour en une seule fois avec un forall.

Discussions similaires

  1. ORA-01555: Snapshot too old
    Par alicia26 dans le forum Administration
    Réponses: 9
    Dernier message: 10/05/2011, 11h55
  2. Réponses: 10
    Dernier message: 08/06/2009, 16h50
  3. ORA-01555: snapshot too old
    Par skaloup dans le forum Administration
    Réponses: 6
    Dernier message: 13/06/2007, 15h41
  4. Snapshot too old lors d'un ajout de colonne
    Par jokos2000 dans le forum Oracle
    Réponses: 6
    Dernier message: 19/09/2006, 13h55

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