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 :
Le panneau Récapitulatif d’annulation donne des informations sur la configuration actuelle :
Le panneau Récapitulatif des statistiques d’annulation donne des informations statistiques sur l’annulation :
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 :
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 :
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 :
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...