2009-11-06 3 views
2

Une idée à propos de ORA-1555: snapshot trop vieux: rollback segment number Je reçois cette erreur et rien ne semble être faux. Veuillez indiquer dans quelles conditions cela peut se produire et comment cela peut être évité?ORA-1555: snapshot trop vieux: numéro de segment de rollback

+0

s'il vous plaît laissez-moi savoir - Qui m'a doewnvoted et pourquoi –

+2

-1 pour ne pas ajouter à propos WHT vous Tring faire – Vijay

+0

Bien sûr, il pourrait être beaucoup plus d'autres détails pour l'erreur (et pas le seul mentionné ci-dessous). Qu'essayez-vous de faire? – Guru

Répondre

2

Je vous suggère de lire la réponse de Tom. http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:1441804355350

« L'ORA-1555 arrive quand les gens essaient de gagner de l'espace en général Ils ont de petits rollback segments qui pourraient se développer si elles avaient besoin (et réduisent la taille à l'aide OPTIMAL) Donc, ils vont commencer avec disons 10 ou alors 1meg rollback segments.Ces segments de retour pourraient augmenter à 100meg chacun si nous les laissons (dans cet exemple), cependant, ils ne pousseront jamais à moins que vous obteniez une grosse transaction
"

+0

Oui, j'ai une grande transaction –

+0

Le lien est très utile, mais j'ai besoin de plus d'informations –

+0

Encore une fois, je ne cite que le lien: "Ce que vous devez faire ici est la taille rollback donc qu'il s'enroule moins fréquemment (moins fréquemment alors vos demandes de longue durée) " Vous avez besoin de plus d'informations, mais nous avons également besoin de plus d'informations sur ce que vous essayez de faire, et quand cela se produit ... – guigui42

2

Généralement, cela se produit lorsque le code valide à l'intérieur d'un curseur.

par ex.

for x in (select ... from ...) 
loop 
    do something 
    commit; 
end loop; 

Voir le formulaire de lien AskTom pour d'autres exemples.

+0

Comment l'éviter –

+0

Validez à la fin seulement. Commiting ne libère pas de ressources dans Oracle de la même manière que dans d'autres systèmes car un verrou est très léger, et les lecteurs et les rédacteurs ne se bloquent pas les uns les autres. Les validations plus fréquentes que nécessaire sont une erreur de conception courante lorsque vous travaillez avec Oracle. –

+0

Mieux encore, n'utilisez pas un curseur bien sûr. –

5

Des commits fréquents peuvent être la cause de l'ORA-1555. Tout est une question de cohérence de lecture. L'heure à laquelle vous démarrez une requête Oracle enregistre une image avant. Le résultat de votre requête n'est donc pas modifié par DML qui a lieu entre temps (votre grosse transaction). L'image avant utilise les segments d'annulation pour obtenir les valeurs des données qui sont modifiées après la prise de l'image avant. En validant votre grande transaction, vous dites à Oracle que les données de restauration de cette transaction peuvent être écrasées. Si votre requête nécessite des données des segments d'annulation qui sont remplacées, vous obtenez cette erreur. Moins vous engagez, moins vous avez de chance que les données de restauration dont vous avez besoin soient remplacées. Une cause commune de ORA-1555 est une procédure qui fait tout cela en elle-même: un curseur sur une table, une boucle dans les enregistrements, et met à jour/supprimer la même table et valide chaque x enregistrements.

Comme guigui dit: laisser les rollback segments se développent pour contenir votre transaction entière