Blog ENI : Toute la veille numérique !
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
💥 Les 22 & 23 novembre : Accès 100% GRATUIT
à la Bibliothèque Numérique ENI. Je m'inscris !

Gestion des informations d'annulation

Vue d’ensemble

1. Définitions

Lorsque des modifications de données sont en cours, Oracle génère des informations d’annulation qui seront utilisées, si nécessaire, pour annuler les modifications. Ces informations d’annulation contiennent essentiellement la valeur précédente des données qui sont modifiées par la transaction ("image avant", "before image" en anglais) et l’identification des blocs concernés.

Les informations d’annulation sont stockées dans des segments d’annulation.

Elles sont principalement utilisées pour :

  • l’annulation de la transaction (ROLLBACK) ;

  • la lecture cohérente ;

  • certaines fonctionnalités de flashback ;

  • la récupération de la base de données (RECOVER).

Le segment d’annulation est une structure utilisée par Oracle pour stocker temporairement la version précédente des données en cours de modification dans une transaction. Si la transaction est validée (COMMIT), l’espace occupé est libéré ; si la transaction est annulée (ROLLBACK), la version précédente des données est remise à la place de la nouvelle.

Les segments d’annulation sont par ailleurs utilisés par Oracle pour le mécanisme de lecture cohérente. La notion de lecture cohérente correspond au fait que les données en cours de modification dans une transaction ne sont pas vues des autres utilisateurs tant que la transaction n’est pas validée ; les autres utilisateurs voient les données telles qu’elles étaient avant le début de la transaction, dans un état cohérent vis-à-vis des transactions et des règles de gestion. Si un utilisateur interroge une table en cours de mise à jour dans une autre transaction, Oracle utilise la valeur précédente des données, stockée dans les segments d’annulation, pour répondre à la requête.

Les segments d’annulation sont aussi utilisés par certaines fonctionnalités de flashback qui permettent de lire (et récupérer) les données telles qu’elles étaient à un instant donné dans le passé (voir chapitre Sauvegarde...

Mise en œuvre de la gestion automatique

1. Principe

Pour mettre en œuvre la gestion automatique des informations d’annulation, il faut :

  • positionner le paramètre UNDO_MANAGEMENT à AUTO et éventuellement affecter des valeurs aux paramètres UNDO_TABLESPACE et UNDO_RETENTION ;

  • créer au moins un tablespace d’annulation lors de la définition de la base de données ou ultérieurement.

2. Les paramètres d’initialisation

UNDO_MANAGEMENT

Ce paramètre indique le mode de gestion souhaité pour les informations d’annulation. Les valeurs possibles sont AUTO (valeur par défaut) ou MANUAL. Ce paramètre est statique ; il faut redémarrer la base de données pour changer le mode de gestion des informations d’annulation.

UNDO_TABLESPACE

Ce paramètre spécifie le nom du tablespace d’annulation à utiliser lors du démarrage de l’instance. Le nom de n’importe quel tablespace d’annulation peut être indiqué. Par défaut, ce paramètre est vide et le premier tablespace d’annulation trouvé dans la base de données est utilisé (voir plus loin) ; le paramètre UNDO_TABLESPACE est alors renseigné par Oracle. Ce paramètre est dynamique.

Le paramètre UNDO_TABLESPACE est surtout intéressant si la base de données dispose de plusieurs tablespaces d’annulation ; il permet d’indiquer le nom du tablespace d’annulation à utiliser lors du démarrage de l’instance. Ce paramètre est particulièrement utile en configuration Real Application...

Gestion du tablespace d’annulation

1. Caractéristiques du tablespace d’annulation

Le tablespace d’annulation est obligatoirement géré localement, avec une gestion automatique des extensions (EXTENT MANAGEMENT LOCAL AUTOALLOCATE). Il peut être SMALLFILE ou BIGFILE, et utiliser n’importe quelle taille de bloc (pas uniquement la taille de bloc standard). Par contre, il est forcément READ WRITE, LOGGING et PERMANENT.

Il est impossible et interdit de créer d’autres segments (table, index) dans un tablespace d’annulation. Plusieurs tablespaces d’annulation (contenant leurs propres segments d’annulation) peuvent être créés dans la base de données mais seulement un est actif (utilisé), à un instant donné par l’instance. Il est possible de changer de tablespace d’annulation dynamiquement. Le tablespace d’annulation actif ne peut pas être désactivé (passé OFFLINE) ou supprimé.

2. Fonctionnement du tablespace d’annulation

Dans un tablespace d’annulation, des segments d’annulation sont automatiquement créés et gérés par Oracle (et par lui seul). Ils sont nommés sous la forme _SYSSMU*, et dimensionnés (nombre et taille) automatiquement en fonction des besoins.

En fonction des besoins, les segments d’annulation stockés dans le tablespace d’annulation actuellement actif sont automatiquement activés. Oracle crée automatiquement de nouveaux segments d’annulation dans le tablespace d’annulation actif, s’il le juge nécessaire. Les segments d’annulation ainsi créés ne sont pas supprimés ; si Oracle estime ne plus en avoir besoin (baisse de l’activité transactionnelle), il les passe OFFLINE. Si l’instance en a de nouveau besoin ultérieurement, elle les repassera ONLINE

Tenter de gérer directement les segments...

Trouver des informations sur la gestion de l’annulation

1. Trouver des informations sur le tablespace d’annulation

Les vues présentées au chapitre Tablespaces et fichiers de données peuvent être utilisées pour retrouver des informations sur les tablespaces d’annulation et leurs fichiers de données :

  • DBA_TABLESPACES ou V$TABLESPACE  : informations sur les tablespaces.

  • DBA_DATA_FILES ou V$DATAFILE : informations sur les fichiers de données.

  • DBA_FREE_SPACE : informations sur l’espace disponible à l’intérieur d’un tablespace. 

  • DBA_SEGMENTS : informations sur les segments alloués à l’intérieur d’un tablespace .

  • DBA_EXTENTS : informations sur les extensions allouées à l’intérieur d’un tablespace. 

En complément, la vue DBA_UNDO_EXTENTS donne plus spécifiquement des informations sur les extensions allouées dans les tablespaces d’annulation :

DBA_UNDO_EXTENTS

SEGMENT_NAME

Nom du segment d’annulation auquel l’extension appartient.

TABLESPACE_NAME

Nom du tablespace d’annulation qui contient l’extension.

EXTENT_ID

Numéro de l’extension (0 pour la première).

FILE_ID

Identifiant du fichier de données qui contient l’extension.

BLOCK_ID

Numéro du premier bloc de l’extension.

BYTES

Taille de l’extension en octets.

BLOCKS

Taille de l’extension en blocs Oracle.

STATUS

Statut des informations d’annulation stockées dans l’extension, vis-à-vis des transactions : ACTIVE, EXPIRED, UNEXPIRED.

Exemple

SQL> SELECT tablespace_name,segment_name,extent_id,blocks,status 
  2  FROM dba_undo_extents 
  3  ORDER BY tablespace_name,segment_name,extent_id; 
TABLESPACE SEGMENT_NAME               EXTENT_ID     BLOCKS    STATUS 
---------- ------------------------- ---------- ---------- --------- 
UNDOTBS    _SYSSMU10_1216212870$              0          8 UNEXPIRED 
UNDOTBS    _SYSSMU10_1216212870$              1          8...

Utiliser EM Express

Le tablespace d’annulation et ses fichiers de données s’administrent à partir de la page Tablespaces et Fichiers de données (voir la section Utiliser EM Express du chapitre Tablespaces et fichiers de données).

Dans EM Express, sélectionnez l’élément Gestion de l’annulation (undo) du menu Stockage pour accéder à la page de gestion de l’annulation :

images/11RI02N19.png

Le panneau Récapitulatif d’annulation donne des informations sur la configuration actuelle :

images/11RI03N19.png

Le panneau Récapitulatif des statistiques d’annulation donne des informations statistiques sur l’annulation :

images/11RI04N19.png

Les statistiques sont calculées pour une période d’analyse (dernière heure, dernier jour ou dernière semaine) qui peut être modifiée en cliquant sur le bouton Paramètres de l’analyse des modifications :

images/11RI05N19.png

Le panneau Récapitulatif des statistiques d’annulation donne notamment des informations statistiques sur la durée de rétention pour la période analysée :

Rétention obligatoire des informations d’annulation

Durée de rétention minimum nécessaire pour gérer la requête la plus longue sur la période analysée et éviter l’erreur snapshot too old.

Rétention des informations d’annulation...

Utiliser SQL Developer

Dans SQL Developer, ouvrez le dossier Configuration de base de données du panneau DBA et cliquez sur l’élément Gestion automatique de l’annulation pour accéder à l’écran de gestion de l’annulation :

images/11RI08N19.png

Cet écran affiche des informations sur la gestion automatique de l’annulation, avec la configuration actuelle dans la partie supérieure et un conseiller sur l’annulation dans la partie inférieure.

Pour une raison inconnue, cet écran ne fonctionne pas avec une base de données en version 19c ; il affiche un message "Impossible de charger les informations sur l’annulation...". L’exemple présenté dans cette partie provient d’une base de données en version 12c (l’écran fonctionne aussi correctement avec une base de données en version 18c).

Le conseiller sur l’annulation affiche les tailles en Mo et les durées en secondes :

images/11RI09N19.png

Les statistiques sont calculées pour une période d’analyse qui peut être modifiée dans la partie supérieure.

La valeur Meilleure conservation possible donne la durée de rétention possible compte tenu de la taille actuelle du tablespace d’annulation et de l’activité constatée sur la période analysée.

La valeur Conservation obligatoire donne...

Problèmes courants et solutions

ORA-01552: imposs util. segment d'annul. système pour le tablespace non syst.'XXXX' 

Explication

Il n’y a pas de segment d’annulation actif (ONLINE) autre que le segment d’annulation SYSTEM (vérifiable dans V$ROLLNAME) et une transaction concerne le tablespace XXXX.

Cause(s)

La gestion automatique des segments d’annulation n’est pas active. La gestion automatique des segments d’annulation est active mais il n’y a pas de tablespace d’annulation actif.

Action(s)

Vérifiez si la base a démarré en gestion automatique des segments d’annulation (paramètre UNDO_MANAGEMENT). Dans le cas contraire, redémarrez la base de données en activant la gestion automatique. Vérifiez s’il existe un tablespace d’annulation (dans la vue DBA_TABLESPACES). Si c’est le cas, activez-le (paramètre UNDO_TABLESPACE). Dans le cas contraire, créez-en un et activez-le (paramètre UNDO_TABLESPACE).

ORA-30036: impossible d'étendre le segment parNdans le tablespace 
d'annulation'XXXX' 

Explication

Un segment d’annulation n’arrive pas à s’étendre.

Cause(s)

Le segment d’annulation n’arrive pas à s’étendre car le tablespace dans lequel il est stocké n’a pas suffisamment d’espace disponible...