Oracle - Généralités sur les fichiers de contrôle (control files)

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 log
  • MAXLOGMEMBERS : nombre maximal de membres dans un groupe de fichiers de redo log
  • MAXLOGHISTORY : nombre maximal d'informations sur les switchs de log
  • MAXDATAFILES : nombre maximal de fichiers de données
  • MAXINSTANCES : 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 commande CREATE 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

SQL > 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

SQL > 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

SQL > 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 :

SQL > 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.

SQL > 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 :

SQL > 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 :

SQL > 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

SQL > select value from v$parameter where name='user_dump_dest'
SQL > 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;

A 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 clause LOGFILE. Il sera alors nécessaire d'ouvrir la base de données avec la commande ALTER DATABASE RESETLOGS. Dans ce cas précis, les fichiers de redo log ne doivent pas forcément déjà exister mais la clause SIZE 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

A 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.