Thursday, April 13, 2006

1ère PARTIE : GESTION DE L'ESPACE D'ANNULATION SOUS ORACLE9I

I – INTRODUCTION ET GENERALITES
Jusqu'à la version 8i de son produit phare (la base de données Oracle) l'éditeur Oracle n'offre qu'un seul mode de gestion de l'espace d'annulation. Il s'agit du mode manuel. Dans ce mode, l'administrateur doit :
- Créer et gérer un nombre optimal de segments d'annulation (en anglais rollback segments ; c'est la terminologie utilisée dans le mode manuel de gestion de l'espace d'annulation) ;
- Assigner les transactions "volumineuses/longues", s'il en existe dans son environnement, à un ensemble particulier de segments d'annulation. Ceci suppose d'avoir préalablement procéder à une estimation, à défaut d'une mesure exacte, de la longueur de la transaction la plus longue devant s'exécuter dans la base de données ;
- Mettre des segments additionnels en ligne en fonction des changements des demandes des processus de traitement ;
- Effectuer une multitude de tâches de gestion liées aux segments d'annulation.
Les administrateurs savent que cette série de tâches est coûteuse en termes de temps (c'est-à-dire chronophage). L'éditeur Oracle aussi.
C'est pourquoi ce dernier a mis en place, à partir de la version Oracle9i, un deuxième mode, le mode automatique de gestion de l'espace d'annulation. Il s'agit d'un mode qui facilite relativement bien la vie aux administrateurs comparativement au mode manuel. Cependant ce dernier reste utilisable pour des raisons de compatibilité arrière.
Dans la terminologie Oracle9i, les segments d'annulation s'appellent "undo segments".
Contrairement aux "rollback segments", l'administrateur ne crée plus et ne gère plus des undo segments individuels. La base de données Oracle le fait pour l'administrateur lorsque ce dernier crée le tablespace d'annulation (undo tablespace dans la terminologie Oracle9i). Toutes les transactions dans une instance partagent un seul undo tablespace. Toute transaction qui s'exécute peut consommer de l'espace libre dans le undo tablespace et une fois la transaction finie, son espace d'annulation est libéré. C'est dire que l'espace pour les undo segments est dynamiquement alloué, consommé, libéré et réutilisé sous le contrôle de la base de données Oracle (et non plus sous le contrôle de l'administrateur comme c'est le cas en mode manuel).
Le présent article est destiné à faire le point sur les deux modes, en les mettant en perspective et aussi à montrer comment on peut faire le passage du mode manuel au mode automatique sur une base Oracle9i.


II - MODE MANUEL DE GESTION DE L'ESPACE D'ANNULATION
Une instance Oracle est dite opérationnelle en mode manuel de gestion de l'annulation lorsque l'administrateur utilise la méthode "rollback segment" de gestion de l'espace d'annulation.

II-1) Démarrage d'une instance en mode manuel de gestion d'annulation
Le positionnement du paramètre d'initialisation UNDO_MANAGEMENT à la valeur MANUAL fait que la commande STARTUP démarre l'instance en mode manuel de gestion des annulations (en anglais : manual undo management mode).
Si le paramètre d'initialisation UNDO_MANAGEMENT n'est pas spécifié, l'instance démarre en mode manuel de gestion des annulations.
Quand l'instance démarre, elle met un certain nombre de rollback segments en ligne tel que déterminés par :
- le paramètre d'initialisation ROLLBACK_SEGMENTS ;
- les paramètres d'initialisation TRANSACTIONS et TRANSACTIONS_PER_ROLLBACK_SEGMENT.
Le tableau ci-dessous décrit brièvement ces paramètres.



PARAMETRE D'INITIALISATIONDESCRIPTION
ROLLBACK_SEGMENTSSpécifie les rollback segments à "acquérir" au démarrage de l'instance
TRANSACTIONSSpécifie le nombre maximal de transactions concurrentes
TRANSACTIONS_PER_ROLLBACK_SEGMENTSpécifie le nombre de transactions concurrentes que chaque rollback segment espère "supporter".
MAX_ROLLBACK_SEGMENTSSpécifie le nombre maximal de rollback segments qui peuvent être en ligne pour une instance.


II-2) Détermination du nombre et des tailles des rollback segments
Un ou plusieurs tablespaces peuvent être créés pour les rollback segments. Et ces derniers sont créés manuellement dans ces tablespaces par l'administrateur qui doit préalablement calculer/estimer leur nombre et tailles.
La taille d'un rollback segment est déterminée par les valeurs du paramètre de stockage du rollback segment (Voir plus loin les commandes "CREATE ROLLBACK SEGMENT" et "ALTER ROLLBACK SEGMENT"). Cette taille peut affecter les performances de la base de données Oracle.
Pour le nombre de rollback segments, Oracle fournit les recommandations générales que nous reproduisons dans le tableau ci-dessous.



Nombre de transactions concurrentes (N)Nombre de rollback segments recommandés
N inférieur à 16 4
16 inf. ou égal à N et N inf. à 32 8
32 inf. ou égal à N N/4

En ce qui concerne les tailles, Oracle donne les règles qui suivent :
- Assigner de grands rollback segments aux transactions qui modifient des données pendant que ces dernières sont sélectionnées (commande SQL select) par des requêtes longues qui en général requièrent l'accès à des rollback segments pour reconstruire une version consistante (en lecture) des données modifiées.
- Assigner de grands rollback segments aux transactions qui modifient de grandes quantités de données et qui du coup, génèrent beaucoup d'entrées volumineuses d'annulation, à des fins d'amélioration des performances de telles transactions.
- Assigner les transactions OLTP (Online Transaction Processing) à de petits rollback segments qui ont une probabilité plus forte de rester stockés dans le cache de tampon où ils peuvent être accédés rapidement. Un rollback segment typique OLTP doit avoir deux extents et une taille de 10 Ko environ. La meilleure façon d'éviter les contentions, c'est de créer beaucoup de rollback segments et d'assigner chaque transaction à sa propre rollback segment.
- Utiliser la commande SET TRANSACTION pour assigner des transactions aux rollback segments appropriés comme ci-après :
SET TRANSACTION USE ROLLBACK SEGMENT rbs_oltp13

II-3) Types et règles de fonctionnement des rollback segments
Une transaction ne peut utiliser qu'un seul rollback segment pour stocker des enregistrements de rollback. En revanche, plusieurs transactions peuvent écrire dans un même rollback segment.
Oracle distingue les rollback segments SYSTEM et non-SYSTEM.
Les modifications apportées aux objets du tablespace SYSTEM sont stockées dans le rollback segment SYSTEM qui est créé automatiquement lors de la création de la base de données.
Une base de données qui contient des tablespaces non-SYSTEM nécessite au moins deux rollback segments non-SYSTEM.
Les rollback segments non-SYSTEM peuvent être privés, publics ou en état différé.
Par défaut, tous les rollback segments créés sont privés, ce qui signifie que seule l'instance courante y a accès.
Un rollback segment privé n'est disponible que pour une seule instance et pour tous les utilisateurs de l'instance. Il est automatiquement acquis par l'instance Oracle s'il est spécifié au travers du paramètre d'initialisation ROLLBACK_SEGMENTS. Mais il peut également être acquis manuellement lorsque l'administrateur exécute la commande "ALTER ROLLBACK SEGMENT ONLINE ;"
Un rollback segment public est disponible pour toute instance d'un environnement Real Application Cluster par exemple. Mais un tel rollback segment ne peut être utilisé que par une instance Oracle à la fois. Il est créé dans la base de données à l'aide de la commande "CREATE PUBLIC ROLLBACK SEGMENT".
Oracle détermine le nombre rollback publics à accéder en se basant sur les paramètres d'initialisation TRANSACTIONS et TRANSACTIONS_PER_ROLLBACK_SEGMENT.
Les rollback segments en état différé sont automatiquement créés lorsqu'un utilisateur annule une transaction qui a modifié des données dans un tablespace qui est actuellement hors ligne (offline). Lorsque le tablespace est mis en ligne (online), les entrées de rollback sont utilisées pour restaurer les anciennes valeurs de lignes et le rollback en état différé utilisé est supprimé.

II-4) Création et modification des rollback segments
Création d'un rollback segment
La syntaxe de base de la commande "CREATE ROLLBACK" pour la création d'un rollback segment est :
CREATE [PUBLIC] ROLLBACK SEGMENT
STORAGE(INITIAL [KM]
NEXT [KM]
MINEXTENTS
MAXEXTENTS
OPTIMAL [KM])
Les paramètres et options de la commande sont synthétisés dans le tableau ci-dessous.


PARAMETRE
COMMENTAIRES
INITIAL
Oracle recommande que INITIAL=NEXT afin que les extents soient toujours de même taille ; le paramètre PCTINCREASE ne pouvant être spécifié, il vaut toujours 0.
NEXT
-
MINEXTENTSNe peut avoir une valeur inférieure à 2 pour les rollback segments.
MAXEXTENTSOracle recommande d'éviter d'attribuer la valeur UNLIMITED à ce paramètre car cela pourrait provoquer une extension inutile d'un rollback segment et même de fichiers de données à la suite d'une erreur de programme.
OPTIMALEst utilisé pour spécifier la taille à laquelle un rollback segment se rétrécira après s'être étendu automatiquement. Définir la valeur de ce paramètre en fonction de l'espace nécessaire pour une transaction moyenne. Si l'on ne dispose pas des informations nécessaires, indiquer une valeur correspondant à la taille initiale (MINEXTENTS * EXTENT_SIZE). C'est la valeur minimale recommandée.


Quand on crée un rollback segment, il est initialement hors ligne (offline en anglais) et non disponible pour les transactions. Mais il peut être mis dynamiquement en ligne (voir la commande ALTER ROLLBACK SEGMENT" ci-dessous).

Modification d'un rollback segment
La syntaxe complète de modification d'un rollback segment se présente comme indiqué ci-dessous :
ALTER ROLLBACK SEGMENT
{ONLINE OFFLINE
STORAGE(NEXT MAXEXTENTS OPTIMAL )
SHRINK [TO [KM]]
La nature d'un rollback segment, public ou privé ne peut être modifié par la suite. La solution consiste à le supprimer et à le recréer.
L'option SHRINK permet au rollback segment de se rétrécir à la taille spécifiée ou à la valeur à laquelle le paramètre OPTIMAL a été positionné. Toutefois le rétrécissement s'arrête si un extent ne peut pas être libéré parce qu'il est actif.
Lors de la mise hors ligne d'un rollback segment, si des transactions l'utilisent encore, l'état du rollback segment passe à "PENDING OFFLINE" et est consultable dans la vue de performance dynamique V$ROLLSTAT. Une fois les transactions terminées, le rollback segment est mis hors ligne.
La suppression d'un rollback segment se fait à l'aide de la commande
DROP ROLLBACK SEGMENT

II-5) Informations et statistiques relatives aux rollback segments
Les informations générales sur les rollback segments sont stockées dans la vue DBA_ROLLBACK_SEGS. On y trouve, entre autres, des informations d'identification, d'emplacement, le type et l'état des rollback segments.

Les statistiques sont stockées dans la vue de performance dynamique V$ROLLSTAT. On y trouve entre autres, le numéro de rollback segment (colonne USN), la taille actuelle (colonne RSSIZE), le nombre de transactions utilisant le rollback segment (colonne XACTS), la valeur OPTIMAL du segment (colonne OPTSIZE) et l'état du rollback segment (colonne STATUS). On fait souvent une jointure entre cette vue et V$ROLLNAME afin d'avoir les noms de rollback segment dans les requêtes.

On détermine souvent l'activité courante des rollback segments en identifiant les sessions qui les utilisent à l'aide d'une requête qui fait recours aux vues V$SESSION, V$TRANSACTION et V$ROLLNAME et est similaire à celle qui suit :
SQL> select s.username, r.name, t.used_ublk "nbre rb blocs generes"
2 from v$session s, v$rollname r, v$transaction t
3 where s.saddr = t.ses_addr
4 and t.xidusn = r.usn ;
[A SUIVRE ...]

0 Comments:

Post a Comment

<< Home