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 :

[PL/SQL] ORA-01555 ?


Sujet :

Oracle

  1. #1
    Membre confirmé
    Inscrit en
    Mai 2004
    Messages
    148
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 148
    Par défaut [PL/SQL] ORA-01555 ?
    Bonjour

    Voila j'ai lancer un bloc PL/SQL, et il marchait convenablement.

    Aprés, j'ai reçu ce message :

    ORA-01555 : Snapshot tros vieux : rollback segment no "", nommé "_SYS.." trop petit.

    Que signifie et pq c'est arrivé ?

    Merci à vous

  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


    Par ailleurs, merci de mettre un titre plus explicite sans oublier les régles fondamentales du forum

  3. #3
    Expert Oracle confirmé

    Homme Profil pro
    Consultant Big Data
    Inscrit en
    Mars 2003
    Messages
    448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Consultant Big Data
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2003
    Messages : 448
    Par défaut
    Bonjour,

    Quelle version d'Oracle ?

    En tout cas, cela signifie qu'Oracle est incapable de te retourner un jeu de données cohérents, car les valeurs modifiées ont été supprimées des RBS (Rollback Segments), certainement à cause des COMMIT intermédiaires.

    Pour être plus clair :
    Je suis sur que, dans ton code, tu parcours des données via un curseur sur lequel tu fetches (donc une boucle), et qu'ensuite tu modifies ces données.

    Lorsque tu modifies les données, les anciennes valeurs sont conservées dans le RBS qui gère ta transaction. Et lors du prochain fetch sur ton curseur, comme ces données ont été modifiées, et qu'Oracle te donne toujours un jeu de données cohérentes, il a besoin d'aller chercher ces données dans le RBS.

    Or si jamais tu commites dans ta boucle, ces anciennes données peuvent être effacées par d'autres mises à jour. Or lors du fetch, Oracle en avait besoin.

    Moralité : ne commite qu'à la fin de ton traitement, pas dans ta boucle.

  4. #4
    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
    Il est également possible d'augmenter le UNDO_RETENTION si c'est plutôt un problème de performance du traitement

  5. #5
    Membre confirmé
    Inscrit en
    Mai 2004
    Messages
    148
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 148
    Par défaut Rollback segments
    vous avez raison,
    je fait des insertions dans une table et je commit chaque 500 dans le curseur.

  6. #6
    Membre confirmé
    Inscrit en
    Mai 2004
    Messages
    148
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 148
    Par défaut
    Bonjour

    Existes t-il un moyen pour contourner ce pb ?

    Vu que j'ai un nombre important de données à insérer, et je commit à chaque 100 records insérés.

    Merci à vous d'avance

  7. #7
    Membre émérite Avatar de plabrevo
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    548
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 548
    Par défaut
    La note Metalink 40689.1 decrit en detail les raisons du pourquoi, ainsi que les possibles solutions, dont celles deja evoquees dans ce post.

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 12
    Par défaut
    Bonjour,

    Si vous voulez verifier que le parametrage du undo rentention est correct! Allez voir dans la table v$undostat. La requete ci-dessous vous donne la durée de la requete la plus longue.

    Elle est MAJ toutes les 10Min et initialisé toutes les 24H.

    select max(maxquerylen) from v$undostat;

  9. #9
    Membre éclairé Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 495
    Par défaut ORA-01555: clichés trop vieux : rollback segment no 19
    Bonjour

    je reviens sur cette question :
    j'ai sur une requête d'extraction qui dans l'esprit ces cette opération


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    with Lisrentrant as ( distinct select a.IDentrant1 as IDentrant1, b.c3 as c3 from entrant_a inner join  entrant_b
                                       on inner join a.IDentrant1 =b.IDentrant1  )
    ,
         lotretour as   ( select a.IDentrant1 as IDentrant1, b.c3 as c3 from sortant_a inner join  sortant_a
                                       on inner join a.IDentrant1 =b.IDentrant1  )
    select * from Lisrentrant  left outer join  lotretour 
           on Lisrentrant.IDentrant1 = lotretour.IDentrant1 
    where lotretour.c3 is null
    j'obtient
    ORA-01555: clichés trop vieux : rollback segment no 19,...
    *Cause: rollback records needed by a reader for consistent read are
    overwritten by other writers
    ICi il n'y a aucune mise à jour directe effectué dans le select .

    toutefois la base est vivante , il peut donc exister des update de celle-ci qui modifie les données

    Est-ce que la volumétrie de la base , et donc le temps de réponse de chaque sous requête peut entrainer ce problème (notamment la première avec l'opération select distinct ????

    il n y a pas d'update donc pourquoi avons nous un référence à une opération de roolback?

  10. #10
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 953
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 953
    Par défaut
    Citation Envoyé par dedalios Voir le message
    Est-ce que la volumétrie de la base , et donc le temps de réponse de chaque sous requête peut entrainer ce problème (notamment la première avec l'opération select distinct ????
    Potentiellement, vérifiez le paramètre UNDO RETENTION à comparer au temps d'exécution de la requête.

    Citation Envoyé par dedalios Voir le message
    il n y a pas d'update donc pourquoi avons nous un référence à une opération de roolback?
    Read Consistency

Discussions similaires

  1. ORA-01555 caused by SQL statement below
    Par aberhab dans le forum Oracle
    Réponses: 5
    Dernier message: 15/09/2011, 18h01
  2. Réponses: 10
    Dernier message: 08/06/2009, 16h50
  3. ORA-01555
    Par loki8 dans le forum Oracle
    Réponses: 31
    Dernier message: 06/04/2006, 16h11
  4. [9i][SQLPLUS][PL/SQL] ORA-20000 ?
    Par sali dans le forum Oracle
    Réponses: 1
    Dernier message: 06/04/2006, 08h04
  5. Erreur ORA-01555 sur un select
    Par LRI dans le forum Oracle
    Réponses: 2
    Dernier message: 13/05/2005, 10h42

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