Introduction
Cet article présente les fichiers de contrôle sous Oracle avec un cas
pratique de modification des fichiers de contrôles pour une base de données
afin de modifier les paramètres MAXLOGFILES, MAXLOGMEMBERS
et MAXLOGHISTORY
.
Généralités sur les fichiers de contrôle
Le fichier de contrôle est un petit fichier binaire nécessaire à une base de données Oracle pour démarrer et fonctionner avec succès. Chaque fichier de contrôle est associée à une seule base de données Oracle. Avant qu’une base de données ne soit ouverte, le fichier de contrôle est lu pour déterminer sur la base de données est dans un état valide pour utilisation.
Un fichier de contrôle est mis à jour en continu par le serveur Oracle durant l’utilisation de la base de données, aussi ce dernier doit être accessible en écriture lorsque la base de données est ouverte. L’information dans un fichier de contrôle ne peut être modifié que par le serveur Oracle, il est impossible d’éditer ce fichier manuellement.
Si pour une raison quelconque le fichier de contrôle n’est pas accessible, la base de données ne peut pas fonctionner proprement. Si toutes les copies des fichiers de contrôle d’une base de données sont perdues, la base de données doit être restaurée avant de pouvoir être ouverte.
Taille des fichiers de contrôle
Les mots clés durant la création de la base de données affectent la taille d’un fichier de contrôle. Ceci est particulièrement significatif lorsque les paramètre possèdent de larges valeurs.
La taille des fichiers de contrôle est influencée par les mots clés
ci-dessous avec les commandes CREATE DATABASE
et CREATE CONTROLFILE
:
MAXLOGFILES
: nombre maximal de groupes de fichiers de redo logMAXLOGMEMBERS
: nombre maximal de membres dans un groupe de fichiers de redo logMAXLOGHISTORY
: nombre maximal d’informations sur les switchs de logMAXDATAFILES
: nombre maximal de fichiers de donnéesMAXINSTANCES
: nombre maximal d’instances
Contenu des fichiers de contrôle
Les informations contenues dans un fichier de contrôle sont listées ci-dessous :
- Le nom de la base de données qui est pris avec le paramètre d’initialisation
DB_NAME
ou le nom utilisé dans la commandeCREATE DATABASE
. - L’identifiant de la base de données lorsque la base de données est créée.
- Le timestamp de la création de la base de données.
- Les noms et localisations des fichiers de données et des fichiers de redo log sont mis à jour dans un fichier de contrôle lorsqu’un fichier de données ou un fichier de redo log est ajouté ou supprimé.
- Les informations sur les tablespaces sont mises à jour lorsqu’un tablespace est supprimé ou ajouté.
- L’historique des switches de redo log.
- Les localisations et statuts des logs archivés sont enregistrés lorsque l’archivage est activé.
- Les localisations et statuts des backups sont enregistrés par l’utilitaire Recovery Manager.
- Le numéro de séquence de log courant est enregistré lorsque des switchs de log se produisent.
- Les informations de checkpoint sont enregistrées lorsque le checkpoint se produit.
Multiplexage des fichiers de contrôle
Pour se prémunir d’un crash de lecture sur un unique fichier de contrôle, il est fortement recommandé de multiplexer les fichiers de contrôle, en essayant dans la mesure du possible de copier les différentes copies sur des disques différents. Si un fichier de contrôle est perdu, une copie multiplexée du fichier de contrôle peut être utilisée pour redémarrer l’instance sans avoir à restaurer la base de données.
Les fichiers de contrôles peuvent être multiplexés jusqu’à 8 fois.
Pour créer des fichiers de contrôle multiplexés :
- des fichiers de contrôle multiples sont créés à la création de la base de données en incluant les noms et les chemins des fichiers de contrôle dans le fichier d’initialisation de l’instance :
control_files = ( "/sdata/oracle/v8/TSTT1ORA/control/control01.ctl", "/sdata/oracle/v8/TSTT1ORA/control/control02.ctl", "/sdata/oracle/v8/TSTT1ORA/control/control03.ctl" )
- en ajoutant un fichier de contrôle après la création de la base de données.
Le comportement des fichiers multiplexés est le suivant :
- deux ou plusieurs fichiers sont listés dans le paramètre d’initialisation
CONTROL_FILES
du fichier d’initialisation de l’instance. Oracle écrit dans chacun des fichiers. - Le premier fichier listé dans le paramètre
CONTROL_FILES
est l’unique fichier lu par le serveur Oracle pendant une opération de base de données. - Si un seul des fichiers de contrôle devient indisponible, l’instance devient inopérante et doit être arrêtée.
Le fichier de contrôle enregistre la structure physique de la base de
données, aussi il est recommandé de réaliser une sauvegarde des fichiers de
contrôle après chaque modification de la structure physique de la base de
données grâce à la commande ALTER DATABASE BACKUP CONTROLFILE TO TRACE
qui sera mise en œuvre dans le cas pratique.
L’ajout d’un fichier de contrôle nécessite un arrêt de l’instance et les étapes sont données dans le cas pratique qui suit où le fichier de contrôle control04.ctl dans le répertoire /sdata/oracle/v8/TSTT1ORA/control est ajouté au système de fichiers de contrôle.
Étape 1 : Arrêt de l’intance
shutdown immediate;
Étape 2 : Copie du fichier de contrôle
le fichier de contrôle control04.ctl est copié à partir d’un des fichiers de contrôle existant dans le répertoire approprié
Étape 3 : Ajout
le fichier de contrôle control04.ctl est ajouté au système de fichiers de contrôle dans le fichier d’initialisation de l’instance
control_files = (
"/sdata/oracle/v8/TSTT1ORA/control/control01.ctl",
"/sdata/oracle/v8/TSTT1ORA/control/control02.ctl",
"/sdata/oracle/v8/TSTT1ORA/control/control03.ctl",
"/sdata/oracle/v8/TSTT1ORA/control/control04.ctl"
)
Étape 4 : Redémarrage de l’instance
startup;
Informations sur les fichiers de contrôle
Vue V$CONTROLFILE
La vue V$CONTROLFILE
liste le nom et le statut des fichiers de contrôle
associés à une instance
select * from v$controlfile;
status name ------ ----------------------------------------------- /SDATA/ORACLE/V8/TSTT1ORA/CONTROL/CONTROL01.CTL /SDATA/ORACLE/V8/TSTT1ORA/CONTROL/CONTROL02.CTL /SDATA/ORACLE/V8/TSTT1ORA/CONTROL/CONTROL03.CTL /SDATA/ORACLE/V8/TSTT1ORA/CONTROL/CONTROL04.CTL
La vue V$PARAMETER
retourne également ces informations :
select name, value from v$parameter where name='control_files';
name value ------------- ----------------------------------------------- control_files /SDATA/ORACLE/V8/TSTT1ORA/CONTROL/CONTROL01.CTL, /SDATA/ORACLE/V8/TSTT1ORA/CONTROL/CONTROL02.CTL, /SDATA/ORACLE/V8/TSTT1ORA/CONTROL/CONTROL03.CTL, /SDATA/ORACLE/V8/TSTT1ORA/CONTROL/CONTROL04.CTL
Vue V$CONTROLFILE_RECORD_SECTION
La vue v$controlfile_record_section
fournit quant à elle des informations
sur les sections dans les fichiers de contrôle.
select type, record_size, records_total, records_used from v$controlfile_record_section
TYPE RECORD_SIZE RECORDS_TOTAL RECORDS_USED ---- ----------- ------------- ------------ DATABASE 192 1 1 CKPT PROGRESS 4084 1 0 REDO THREAD 104 1 1 REDO LOG 72 32 3 DATAFILE 180 254 10 FILENAME 524 319 16 TABLESPACE 68 254 10 RESERVED1 56 254 0 RESERVED2 1 1 0 LOG HISTORY 36 1815 1077 OFFLINE RANGE 56 291 0 ARCHIVED LOG 584 13 0 BACKUP SET 40 408 0 BACKUP PIECE 736 510 0 BACKUP DATAFILE 116 560 0 BACKUP REDOLOG 76 107 0 DATAFILE COPY 660 519 0 BACKUP CORRUPTION 44 371 0 COPY CORRUPTION 40 408 0 DELETED OBJECT 20 408 0 PROXY COPY 852 575 0 RESERVED4 1 8168 0
La colonne records_total dans la vue V$CONTROLFILE_RECORD_SECTION
montre
notamment certains paramètres qui ont été appliqués lors de la création de la
base de données et parmi ceux ci : MAXLOGFILES
, MAXDATAFILES
, MAXLOGHISTORY
.
Dans le cas pratique :
- 32 groupes de fichiers de redo log (
MAXLOGFILES
) - 1815 historiques de switchs de log (
MAXLOGHISTORY
) - 254 fichiers de données au maximum (
MAXDATAFILES
)
Vues dynamiques dépendantes des fichiers de contrôle
Les vues dynamiques ci-dessous retournent des informations à partir des fichiers de contrôle :
$BACKUP V$DATAFILE
V$TEMPFILE V$TABLESPACE
V$ARCHIVE V$LOG
V$LOGFILE V$LOGHIST
V$ARCHIVED_LOG V$DATABASE
Cas pratique de recréation d’un fichier de contrôle
Dans le cas pratique, la base de données CGC a été créée avec les caractéristiques ci-dessous :
CREATE DATABASE CGC
LOGFILE
GROUP 1 ('/sdata/oracle/v8/TSTT1ORA/redolog/redo1_01.log',
'/sdata/oracle/v8/TSTT1ORA/redolog/redo1_02.log') SIZE 1024K,
GROUP 2 ('/sdata/oracle/v8/TSTT1ORA/redolog/redo2_01.log',
'/sdata/oracle/v8/TSTT1ORA/redolog/redo2_02.log') SIZE 1024K,
GROUP 3 ('/sdata/oracle/v8/TSTT1ORA/redolog/redo3_01.log',
'/sdata/oracle/v8/TSTT1ORA/redolog/redo3_02.log') SIZE 1024K
MAXLOGFILES 32
MAXLOGMEMBERS 2
MAXLOGHISTORY 1
DATAFILE '/sdata/oracle/v8/TSTT1ORA/data/system01.dbf' SIZE 264M REUSE AUTOEXTEND OFF
MAXDATAFILES 254
MAXINSTANCES 1
CHARACTER SET WE8ISO8859P1
NATIONAL CHARACTER SET WE8ISO8859P1;
Les fichiers de contrôle lors de la création de la base de données ont été pris en compte dans le fichier d’initialisation de l’instance avec la commande :
startup nomount pfile="/oracle/admin/CGC/pfile/initTSTT1ORA.ora"
On souhaite à présent recréer les fichiers de contrôle afin de modifier les
paramètres MAXLOGMEMBERS
et MAXLOGHISTORY
pour donner les valeurs respectives 3
et 250.
Préliminaires à la création du nouveau fichier de contrôle
Première étape : lister tous
les fichiers de données et les fichiers de redo log avec leur taille en
consultant les vues V$DATAFILE
, V$LOGFILE
et V$LOG
ou bien sauvegarder le
fichier de contrôle.
Pour les fichiers de données :
select bytes/1024/1024 as 'Taille (Mb)', name from v$datafile ;
Taille (Mb) NAME ----------- -------------------------------------------------------- 264 /SDATA/ORACLE/V8/TSTT1ORA/DATA/SYSTEM01.DBF 100 /SDATA/ORACLE/V8/TSTT1ORA/DATA/RBS01.DBF 100 /SDATA/ORACLE/V8/TSTT1ORA/DATA/CGC_DATA01.DBF 50 /SDATA/ORACLE/V8/TSTT1ORA/DATA/TEMP01.DBF 12 /SDATA/ORACLE/V8/TSTT1ORA/DATA/TOOLS01.DBF 50 /SDATA/ORACLE/V8/TSTT1ORA/DATA/CGC_INDX01.DBF 5 /SDATA/ORACLE/V8/TSTT1ORA/DATA/SCOTT_DATA01.DBF 2 /SDATA/ORACLE/V8/TSTT1ORA/DATA/SCOTT_INDX01.DBF 5 /SDATA/ORACLE/V8/TSTT1ORA/DATA/SCOTT_PART_DATA01.DBF 2 /SDATA/ORACLE/V8/TSTT1ORA/DATA/SCOTT_PART_INDX01.DBF
Pour les fichiers de redo log :
select bytes/1024 as 'Taille (Kb)', a.group#, member from v$log a, v$logfile b where a.group# = b.group#
Taille (Kb) GROUP# MEMBER ----------- ------ ------------------------------------------------- 1024 1 /SDATA/ORACLE/V8/TSTT1ORA/REDOLOG/REDO1_01.LOG 1024 1 /SDATA/ORACLE/V8/TSTT1ORA/REDOLOG/REDO1_02.LOG 1024 2 /SDATA/ORACLE/V8/TSTT1ORA/REDOLOG/REDO2_02.LOG 1024 2 /SDATA/ORACLE/V8/TSTT1ORA/REDOLOG/REDO2_01.LOG 1024 3 /SDATA/ORACLE/V8/TSTT1ORA/REDOLOG/REDO3_01.LOG 1024 3 /SDATA/ORACLE/V8/TSTT1ORA/REDOLOG/REDO3_02.LOG
Il est important de tout lister car dans le cas contraire, la base de données ne pourra pas être restaurée.
La méthode la plus sure pour éviter toute erreur dans le listing consiste à
sauvegarder le fichier de contrôle original avec la commande : ALTER
DATABASE BACKUP CONTROLFILE TO TRACE
La commande ALTER DATABASE BACKUP CONTROLFILE TO TRACE
génère un
script SQL de création des fichiers de contrôle dans un fichier de trace créé
dans le répertoire de trace udump.
NB : pour retrouver le répertoire udump des fichiers de trace
select value from v$parameter where name='user_dump_dest'
ALTER DATABASE BACKUP CONTROLFILE TO TRACE
Voici le résultat obtenu dans le fichier de trace généré :
CREATE CONTROLFILE REUSE DATABASE "CGC" NORESETLOGS NOARCHIVELOG
MAXLOGFILES 32
MAXLOGMEMBERS 2
MAXDATAFILES 254
MAXINSTANCES 1
MAXLOGHISTORY 1815
LOGFILE
GROUP 1 (
'/SDATA/ORACLE/V8/TSTT1ORA/REDOLOG/REDO1_01.LOG',
'/SDATA/ORACLE/V8/TSTT1ORA/REDOLOG/REDO1_02.LOG'
) SIZE 1M,
GROUP 2 (
'/SDATA/ORACLE/V8/TSTT1ORA/REDOLOG/REDO2_01.LOG',
'/SDATA/ORACLE/V8/TSTT1ORA/REDOLOG/REDO2_02.LOG'
) SIZE 1M,
GROUP 3 (
'/SDATA/ORACLE/V8/TSTT1ORA/REDOLOG/REDO3_01.LOG',
'/SDATA/ORACLE/V8/TSTT1ORA/REDOLOG/REDO3_02.LOG'
) SIZE 1M
DATAFILE
'/SDATA/ORACLE/V8/TSTT1ORA/DATA/SYSTEM01.DBF',
'/SDATA/ORACLE/V8/TSTT1ORA/DATA/RBS01.DBF',
'/SDATA/ORACLE/V8/TSTT1ORA/DATA/CGC_DATA01.DBF',
'/SDATA/ORACLE/V8/TSTT1ORA/DATA/TEMP01.DBF',
'/SDATA/ORACLE/V8/TSTT1ORA/DATA/TOOLS01.DBF',
'/SDATA/ORACLE/V8/TSTT1ORA/DATA/CGC_INDX01.DBF',
'/SDATA/ORACLE/V8/TSTT1ORA/DATA/SCOTT_DATA01.DBF',
'/SDATA/ORACLE/V8/TSTT1ORA/DATA/SCOTT_INDX01.DBF',
'/SDATA/ORACLE/V8/TSTT1ORA/DATA/SCOTT_PART_DATA01.DBF',
'/SDATA/ORACLE/V8/TSTT1ORA/DATA/SCOTT_PART_INDX01.DBF'
CHARACTER SET WE8ISO8859P1
Seconde étape :
Shutdown de la base de données et sauvegarder les fichiers de données et les fichiers de redo log.
Création du nouveau fichier de contrôle
Afin de créer le nouveau fichier de contrôle, redémarrer l’instance mais ne pas monter ou ouvrir la base de données.
svrmgr > startup pfile="/oracle/admin/CGC/pfile/initTSTT1ORA.ora" nomount;
À partir de cette étape la commande CREATE CONTROL FILE
peut être mise en
œuvre :
CREATE CONTROLFILE [REUSE] [SET] DATABASE database
LOGFILE [GROUP int] filespec
[RESETLOGS | NORESETLOGS]
DATAFILE filespec options [CHARACTER SET charset]
Options:
MAXDATAFILES int
MAXLOGFILES int
MAXLOGMEMBERS int
MAXLOGHISTORY int
MAXINSTANCES int
ARCHIVELOG | NOARCHIVELOG
FORCE LOGGING
Filespec :
'filename' [size] [REUSE]
'filename' [size] K [REUSE]
'filename' [size] M [REUSE]
Les fichiers de redolog et de fichiers de données seront donnés une seule fois et séparés par des virgules.
- Spécifier le mot clé
REUSE
pour indiquer que les fichiers de contrôles spécifiés dans le fichier d’initialisation existent déjà et peuvent être réutilisés et écrasés.
- Spécifier
RESETLOGS
pour demander à Oracle d’ignorer le contenu des fichiers de redo log dans la clauseLOGFILE
. Il sera alors nécessaire d’ouvrir la base de données avec la commandeALTER DATABASE RESETLOGS
. Dans ce cas précis, les fichiers de redo log ne doivent pas forcément déjà exister mais la clauseSIZE
doit impérativement être indiquée.
NORESETLOGS
forcera Oracle à utiliser les fichiers de redo log tels qu’ils étaient avant que la base de données ne soit ouverte. Ces fichiers doivent exister et doivent être les fichiers de redo log courants plutôt que des sauvegardes.
Dans le cas qui nous intéresse, la commande CREATE CONTROLFILE
sera lancée
avec l’option NORESETLOGS
et les paramètres MAXLOGMEMBERS
et MAXLOGHISTORY
auront respectivement pour valeur 4 et 250 :
CREATE CONTROLFILE REUSE DATABASE "CGC" NORESETLOGS NOARCHIVELOG
MAXLOGFILES 32
MAXLOGMEMBERS 4
MAXDATAFILES 254
MAXINSTANCES 1
MAXLOGHISTORY 250
LOGFILE
GROUP 1 ('/SDATA/ORACLE/V8/TSTT1ORA/REDOLOG/REDO1_01.LOG',
'/SDATA/ORACLE/V8/TSTT1ORA/REDOLOG/REDO1_02.LOG') SIZE 1M,
GROUP 2 ('/SDATA/ORACLE/V8/TSTT1ORA/REDOLOG/REDO2_01.LOG',
'/SDATA/ORACLE/V8/TSTT1ORA/REDOLOG/REDO2_02.LOG') SIZE 1M,
GROUP 3 ('/SDATA/ORACLE/V8/TSTT1ORA/REDOLOG/REDO3_01.LOG',
'/SDATA/ORACLE/V8/TSTT1ORA/REDOLOG/REDO3_02.LOG') SIZE 1M
DATAFILE '/SDATA/ORACLE/V8/TSTT1ORA/DATA/SYSTEM01.DBF',
'/SDATA/ORACLE/V8/TSTT1ORA/DATA/RBS01.DBF',
'/SDATA/ORACLE/V8/TSTT1ORA/DATA/CGC_DATA01.DBF',
'/SDATA/ORACLE/V8/TSTT1ORA/DATA/TEMP01.DBF',
'/SDATA/ORACLE/V8/TSTT1ORA/DATA/TOOLS01.DBF',
'/SDATA/ORACLE/V8/TSTT1ORA/DATA/CGC_INDX01.DBF',
'/SDATA/ORACLE/V8/TSTT1ORA/DATA/SCOTT_DATA01.DBF',
'/SDATA/ORACLE/V8/TSTT1ORA/DATA/SCOTT_INDX01.DBF',
'/SDATA/ORACLE/V8/TSTT1ORA/DATA/SCOTT_PART_DATA01.DBF',
'/SDATA/ORACLE/V8/TSTT1ORA/DATA/SCOTT_PART_INDX01.DBF'
CHARACTER SET WE8ISO8859P1
À l’issue de la commande CREATE CONTROLFILE
, les fichiers de contrôle
CONTROL01.CTL, CONTROL02.CTL, CONTROL03.CTL
et CONTROL04.CTL
sont réutilisés et
mis à jour avec ces nouvelles informations.
La base de données peut alors être ouverte dans le contexte de ce cas
pratique, en revanche si l’option RESETLOGS
est utilisé : à l’issue de
l’ouverture, la commande ALTER DATABASE RESETLOGS
doit être exécutée.