Fichiers de journalisation : AdministrationDate de publication : le 20 Octobre 2005 I. Introduction A. Contenu du Redo Log B. Comment Oracle écrit dans les fichiers de journalisation II. Informations sur les fichiers de journalisation III. Création des groupes et des membres de journalisation A. Création des groupes de journalisation B. Création des membres de journalisation IV. Remplacement et renommination des membres de journalisation V. Suppression du groupe de journalisation VI. Suppression des membres de journalisation VII. Forcer les Log Switchs VIII. Vérification des blocs dans les fichiers de journalisation IX. Initialisation des fichiers de journalisation I. Introduction
Oracle utilise les journaux redo pour être sûre que toute modification effectuée par
un utilisateur ne sera pas perdue s'il y'a défaillance dans le système. Les journaux
redo sont essentiels pour les processus de restauration. Quand une instance s'arrête
anormalement, il se peut que certains informations dans les journaux redos ne soient pas
encore écrites dans les fichiers de données. Oracle dispose les journaux redo en groupes.
Chaque groupe à au moins un journal redo. Vous devez avoir au minimum deux groupes distincts
de journaux redo (aussi appelé redo threads), chacun contient au minimum un seul membre.
Chaque base de données à ses groupes de journaux redo. Ces groupes, multiplexés ou non,
sont appelés instance du thread de redo. Dans des configurations typiques, une seule instance
de la base accède à la base Oracle, ainsi, seulement un thread est présent.
Dans un environnement RAC, deux ou plusieurs instances accèdent simultanément une seule
base de données et chaque instance à son propre thread de redo
Chaque base de données à ses groupes redo log. Ces groupes, multiplexés ou non,
sont appelés instance thread de redo. Dans des configurations typiques, une seule
instance de la base accède à la base Oracle, ainsi, seulement un thread est présent.
Dans un environnement RAC, deux ou plusieurs instances accèdent simultanément une seule
base de données et chaque instance à son propre thread de redo.
![]() Groupe de fichiers de journalisations et les membres A. Contenu du Redo Log
Les fichiers de journalisation sont remplis par des enregistrements redo. Un enregistrement redo,
aussi appelé une entrée redo, est composé d'un groupe de vecteurs de change, qui est une
description d'un changement effectué à un bloc de la base. Par exemple, si on modifie
la valeur d'un salaire dans la table employee, on génère un enregistrement redo qui contient
des vecteurs de change décrivant les modifications sur le bloc du segment de données de la table,
le bloc de données du segment undo et la table de transaction des segments undo.
![]() Les entrées redo enregistre les données qu'on peut utiliser pour reconstruire touts les changements effectués sur la base, inclus les segments undo. De plus, le journal redo protége aussi les données rollback. Quand on restaure la base en utilisant les données redo, la base lit les vecteurs de change dans les enregistrements redo et applique le changement aux blocs appropriés.
Les enregistrements redo sont mis d'une façon circulaire dans le buffer redo log de la mémoire SGA.
Et ils sont écrits dans un seul fichier de journalisation par le processus LGWR. Dés qu'une
transaction est comité, LGWR écrit les enregistrements redo de la transaction depuis
le buffer redo log du SGA vers le fichier journal redo, et attribut un SCN pour identifier
les enregistrements redo pour chaque transaction comité. Seulement quand tous les enregistrements
redo associés à la transaction donnée sont sans incident sur le disque dans les journaux en ligne
et que le processus utilisateur a notifié que la transaction à été comité.
![]() Les enregistrements redo peuvent aussi être écrits dans le fichier journal redo avant que la transaction correspondante soit comité. Si le buffer redo log est plein ou une autre transaction à comité, LGWR vide toutes les entrées des journaux redo du buffer redo log dans le fichier journal redo, bien que certain enregistrements redo ne devrait pas être comités. Si nécessaire, oracle peut roll back ces changements. B. Comment Oracle écrit dans les fichiers de journalisation
La base oracle exige au minimum deux fichiers de journalisation.
LGWR écrit dans les fichiers de journalisation d'une façon circulaire. Quand le fichier journal
redo courant est plein, LGWR commence à écrire dans le prochain fichier journal redo disponible.
Quand le dernier est plein, LGWR commence à écrire dans le premier journal redo.
![]() Figure 1
Les fichiers journaux Active (Current) et Inactive
Oracle utilise un seul fichier de journalisation à la fois pour stocker les enregistrements redo depuis le redo log buffer. Le fichier de journalisation dont le processus LGWR est entrains d'écrire dedans est appelé le fichier de journalisation courant.
Les fichiers de journalisation qui sont nécessaire à la restauration de la base sont appelés les fichiers de journalisation actives. Les fichiers de journalisation qui ne sont pas nécessaire à la restauration s'appelles les fichiers de journalisation inactives.
Si on a activé l'archivage (mode ARCHIVELOG), alors la base ne peut pas réutiliser ou sur écrire dans le fichier de journalisation en ligne tant que l'un des processus ARCn n'a pas archivé ses contenus. Si l'archivage est désactivé (mode NOARCHIVELOG), alors quand le dernier fichier de journalisation est plein, LGWR continue en sur écrivant le premier fichier active disponible.
Les Log Switches et les numéros de séquence du journal
Un log switch est le point où la base arrête d'écrire dans l'un des fichiers de journalisation en ligne et commence à écrire dans un autre. Normalement, un log switch survient quand le fichier de journalisation courant est complètement rempli et il doit continuer à écrire dans le fichier de journalisation suivant. Pourtant, on peut configurer les log switche de se reproduire dans des intervalles réguliers, sans soucier si le fichier de journalisation en cours est complètement rempli. On peut aussi forcer les log switch manuellement.
Oracle assigne à chaque fichier de journalisation un nouveau numéro de séquence chaque fois un log switch arrive et le processus LGWR commence à écrire dedans. Quand oracle archive les fichiers de journalisation, le log archivé garde le numéro de séquence du journal. Le fichier de journalisation qui est recyclé fournis le prochain numéro de séquence du journal disponible.
Chaque fichier de journalisation en ligne ou archivé est identifié uniquement par son numéro de séquence (log sequence).
Durant un crash, l'instance ou une restauration media , la base applique proprement les fichiers de journalisation dans un ordre croissant en utilisant le numéro de séquence du fichier de journalisation archivé nécessaire et des fichiers de journalisation.
II. Informations sur les fichiers de journalisation
Les vues V$THREAD, V$LOG, V$LOGFILE et V$LOG_HISTORY fournis des informations
sur les journaux Redo.
La vue V$THREAD donne les informations sur le fichier de journalisation en cours.
La vue V$LOG donne les informations en lisant dans le fichier de contrôle
au lieu dans le dictionnaire de données.
Pour voir les noms des membres d'un groupe on utilise la vue V$LOGFILE
GROUP# est le numéro du groupe Redo Log.
STATUS prends la valeur INVALID si le fichier est inaccessible,
STALE si le fichier est incomplet , DELETED si le fichier n'est plus utilisé
et la valeur blanc si le fichier est en cours d'utilisation.
MEMBER est le nom du membre Redo Log
A partir de la 10g on'a une nouvelle colonne dans la vue V$LOGFILE : IS_RECOVERY_DEST_FILE.
Cette colonne se trouve dans les vues V$CONROLFILE, V$ARCHIVED_LOG, V$DATAFILE_COPY,
V$DATAFILE et V$BACKUP_PIECE, elle prends la valeur YES si le fichier à été crée
dans la région de restauration flash.
La vue V$LOG_HISTORY contient des informations concernant l'historique des
fichiers journaux à partir du fichier de contrôle. Le maximun que peut retenir
la vue depends du paramètre MAXLOGHISTORY.
La seule solution pour initialiser cette vue, il faut recréer le fichier de contrôle.
voir mon tuto : fichier de contôle ou utiliser CONTROL_FILE_RECORD_KEEP_TIME.
III. Création des groupes et des membres de journalisation
Pour créer un nouveau groupe de fichier de journalisation ou un membre, on doit avoir le privilège système
ALTER DATABASE. La base peut avoir au maximum MAXLOGFILES groupes.
A. Création des groupes de journalisation
Pour créer un nouveau groupe de fichiers journalisation, on utilise
la requête ALTER DATABASE avec la clause ADD LOGFILE.
Par exemple ::
On peut spécifier le numéro qui identifie le groupe en
utilisant la clause GROUP :
L'utilisation des numéros de groupes facilite l'administration des groupes de journalisation.
Le numéro de groupe doit être entre 1 et MAXLOGFILES. Surtout ne sauter pas
les numéros de groupes (par exemple 10, 20,30), sinon on consomme inutilement
de l'espace dans les fichiers de contrôles.
B. Création des membres de journalisation
Dans certain cas, il n'est pas nécessaire de créer complètement un groupe de fichiers
de journalisation. Le groupe peut déjà exister car un ou plusieurs membre a été supprimé
(par exemple, suite une panne d'un disque). Dans ce cas, on peut ajouter
de nouveaux membres dans le groupe existant.
Pour créer un nouveau membre de fichier de journalisation d'un groupe existant, on utilise la commande ALTER DATABASE avec la clause ADD LOGFILE MEMBER. Dans l'exemple suivant on ajoute un nouveau membre au groupe de journalisation numéro 2 :
Noter que le nom du fichier doit être indiqué, mais sa taille n'est pas obligatoire.
La taille du nouveau membre est déterminé à partir de la taille des membres existants du groupe.
Quand on utilse ALTER DATABASE, on peut identifier alternativement le groupe cible
en spécifiant tous les autres membres du groupe dans la clause TO, comme le montre
l'exemple suivant :
IV. Remplacement et renommination des membres de journalisation
On peut utiliser les commandes OS pour déplacer les fichiers de journalisation, après on utilise
la commande ALTER DATABSE pour donner leurs nouveaux noms (emplacement) connu par la base.
Cette procèdure est necessaire, par exemple, si le disque actuellement utilisé pour certains
fichiers redo logs doit être retiré, ou si les fichiers de données et certains fichiers
de journalisation se trouvent dans un même disque et devrait être séparés pour réduir la contention.
Pour renommer un membre de fichiers de journalisation, on doit avoir le privillège système ALTER DATABASE.
En plus, On doit aussi avoir les privilèges système pour copier les fichiers dans le repertoire
désiré et les privilèges pour ouvrir et sauvegarder la base de données.
Avant de déplacer les fichiers de journalisations, ou tous autres changements de structures de la base, sauvegarder
complètement la base. Par precaution, après la renommination ou le déplacement d'un ensemble de
fichiers fichiers de journalisation, effectuer immediatement une sauvegarde du fichier de contrôle.
Pour déplacer les fichiers de journalisations, on utilise les étapes suivantes :
Les étapes à suivre pour renommer les membres des journaux
1. Arrêter la base.
2. Copier les fichiers de journalisation dans le nouveau emplacement.
L'exemple suivant utilise les commandes OS (UNIX) pour déplacer les membres
des journaux dans un nouveau emplacement :
3. Démarrer la base avec un mount, sans l'ouvrir.
4. Renommer le membre de fichier de journalisation.
Use the ALTER DATABASE statement with the RENAME FILE clause to rename the
database redo log files.
5. Ouvrir la base normalement.
La modification du fichier journal prends effet à l'ouverture de la base.
V. Suppression du groupe de journalisation
Dans certains cas, on doit supprimer un groupe en entier. Par exemple,
on veut réduir le nombre de groupes. Dans d'autres cas, on doit supprimer un ou plusieurs
membres. Par exemple, si certains memebres se trouvent dans un disque défaillant.
![]() Suppression d'un groupe Pour supprimer un groupe de journaux, on doit avoir le privilège système ALTER DATABASE.
Avant de supprimer un groupe de journaux, il faut prendre en considération les restrictions
et les precautions suivantes :
Pour voir ce qui se passe, utilisez la vue V$LOG.
Supprimer un groupe de journaux avec la commande ALTER DATABASE en utilisant la clause DROP LOGFILE.
Dans cette exemple on supprime le groupe de journaux ayant comme numéro 3 :
Quand un groupe de journaux est supprimé de la base, et on n'utilise pas l'OMF, les fichiers
OS ne seront pas supprimés du disque. Il faut utiliser les commandes OS pour les supprimés
physiquement.
Quand on utilise OMF, le nettoyage des fichiers OS se fait automatiquement.
VI. Suppression des membres de journalisation
Pour supprimer un membre d'un fichier de journalisation, on doit avoir le privilège système ALTER DATABASE.
Pour supprimer un membre inactive d'un fichier de journalisation, on utilise la commande ALTER DATABASE avec la clause DROP LOGFILE MEMBER.
![]() Suppression d'un membre La commande suivante supprime le journal /oracle/dbs/log3c.rdo :
Quand un membre d'un journal est supprimé, le fichier OS n'est pas supprimé du disque.
Pour supprime un membre d'un groupe actif, on doit forcer en premier le log switch.
VII. Forcer les Log Switchs
Le log switch se produit quand LGWR s'arrête d'écrire dans un groupe de journaux et commence à écrire
dans un autre. Par defaut, un log switch se produit automatiquement quand le groupe du fichier
de journalisation en cours est remplis.
On peut forcer un log switch pour que le groupe courant soit inactif et disponible pour
des opérations de maintenances sur les fichiers journaux. Par exemple, on veut supprimer le groupe
actuellement actif, mais on est incapable de le supprimer tant qu'il est actif. On doit aussi
obliger un switch log si le groupe actuellement actif à besoin d'être archivé dans un temps
spécifique avant que les membres du groupe seront complètement remplis.
Cette option est utile dans des configurations où les fichiers de journalisation sont assez larges et
ils prennent plus de temps pour se remplir.
Pour forcer un log switch, on doit avoir le privilège ALTER SYSTEM. Utilisez la commande
ALTER SYSTEM avec la clause SWITCH LOGFILE.
La commande suivante force un log switch:
VIII. Vérification des blocs dans les fichiers de journalisation
On peut configurer la base pour utiliser le CHECKSUMS, afin que les blocs des
fichiers journaux soit vérifiés. Si on affecte le paramètre d'initialisation
DB_BLOCK_CHECKSUM à TRUE, Oracle calcule le checksum pour chaque bloc oracle
quand il écrit dans le disque, y compris les blocs des journaux. Le checksum
est stocké dans l'entête du bloc.
Oracle utilise le checksum pour detecter les blocs corrompu dans les fichiers de journalisation.
La base vérifie le bloc du journal quand le bloc est lit à partir du journal archivé durant la
restauration et quand il écrit le bloc dans le journal archivé. Une erreur sera detecté et écrite
dans le fichier d'alert, si une corruption est detectée.
Si une corruption est detecté dans un bloc du journal pendant son archivage, le système
tente de lire le bloc depuis un autre membre dans le groupe. Si le bloc est corrompu
dans tous les membres du groupe des journaux, alors l'archivage ne peut pas se poursuivre.
La valeur par défaut du paramètre DB_BLOCK_CHECKSUM est TRUE. La valeur de ce paramètre
peut être modifié dynamiquement en utilisant ALTER SYSTEM
IX. Initialisation des fichiers de journalisation
On peut initialiser un fichier de journalisation sans arrêter la base, par exemple,
si le fichier de journalisation est corrompu. ![]() Initialisation d'un groupe
On peut utiliser cette commande si on ne peut pas supprimer les journaux , il y'a deux situations :
Si le fichier journal corrompu n'est pas encore archivé, on utilise la clé UNARCHIVED.
Cette commande initialise les fichiers journaux corrompus et évite leur archivage.
Si on initialise le fichier journal qui est nécessaire pour la restauration ou la sauvegarde,
on ne peut plus restaurer depuis cette sauvegarde.
Pour initialiser un journal non archivé qui est nécessaire pour mettre un tablespace
hors ligne en ligne, on utilise la clause UNRECOVERABLE DATAFILE dans la commande
DATABASE CLEAR LOGFILE.
Si on initialise un journal nécessaire pour mettre un tablespace hors ligne
en ligne, on sera incapable de mettre le tablespace en ligne une autre fois.
On est obligé de supprimer le tablespace ou effectuer une restauration incomplète.
Il faut noter que le tablespace mis hors ligne normalement n'a pas besoin de restauration.
Ce document est issu de http://www.developpez.com et reste la propriété exclusive de son auteur.
La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à l'obtention préalable de l'autorisation de l'auteur.
|