I. Description du fichier de contrôle▲
Le fichier de contrôle est un fichier binaire ; il contient des informations sur la structure physique de la base. Il est créé pendant la création de la base et il est modifié en permanence.
Ce fichier doit être toujours disponible, car il est consulté; et modifié fréquemment par le serveur Oracle. Et il est indispensable pour la restauration de la base.
Le fichier de contrôle contient les informations suivantes :
- informations sur la base ;
- historique des fichiers de journalisation archivés ;
- informations sur les tablespaces et les fichiers de données (nom de fichier, checkpoints du fichier de données, statut lecture/écriture, en ligne ou non) ;
- les journaux en ligne ;
- date et heure de création de la base ;
- le nom de la base ;
- le mode d'archivage actuel ;
- les numéros de séquence (de chaque journal) ;
- informations sur RMAN ;
- information Flashback (10g) ;
- informations sur les blocs corrompus ;
- l'ID de la base.
On peut utiliser un seul fichier de contrôle, mais Oracle en préconise au minimum deux sur des disques différents. Perdre tous les fichiers de contrôle rend difficile la restauration de la base.
La taille du fichier de contrôle dépend en principe de la valeur des paramètres MAXDATAFILES, MAXLOGFILES, MAXLOGMEMBERS, MAXLOGHISTORY, et MAXINSTANCES définis pendant la création de la base.
II. Multiplexage des fichiers de contrôle▲
Pour afficher les noms des fichiers de contrôle, on utilise :
SHOW
PARAMETER CONTROL_FILES
Ou
SELECT
VALUE
FROM
V$PARAMETER WHERE
NAME
=
'control_files'
;
II-A. Multiplexage des fichiers de contrôle en utilisant le pfile▲
Pour multiplexer les fichiers de contrôle, il suffit de copier un des fichiers dans un autre emplacement et de l'indiquer dans le paramètre CONTROL_FILES du fichier d'initialisation initSID.ora
Supposons qu'on a deux fichiers de contrôle /disk1/oradata/ctrlBASE01.ctl et /disk2/oradata/ctrlBASE02.ctl et qu'on veut ajouter un troisième fichier /disk3/oradata/ctrlBASE03.ctl
-
Visualiser les fichiers de contrôle existants
SélectionnezSELECT
VALUE
FROM
V$PARAMETERWHERE
NAME
=
'control_files'
; -
Arrêter la base
SélectionnezSHUTDOWN
IMMEDIATE
-
Modifier le paramètre CONTROL_FILES dans le fichier initSID.ora
SélectionnezCONTROL_FILES
=
(
'/disk1/oradata/BASE/ctrlBASE01.ctl'
,'/disk2/oradata/ BASE /ctrlBASE2.ctl'
,'/disk3/oradata/ BASE /ctrlBASE03.ctl'
)
- Copier le fichier de contrôle en utilisant les commandes OS
Sous Unix
cp /
disk1/
oradata/
BASE/
ctrlBASE01.ctl /
disk3/
oradata/
BASE/
ctrlBASE03.ctl
- Démarrer la base
STARTUP
Oracle met à jour les fichiers de contrôle en même temps, mais seul le premier fichier cité dans le paramètre CONTROL_FILES est consulté.
En oracle9i vous pouvez multiplexer jusqu'à 8 copies de fichiers de contrôle.
II-B. Multiplexage des fichiers de contrôle en utilisant le spfile▲
-
Ajouter le nouveau fichier de contrôle /disk3/oradata/BASE/ctrlBASE03.ctl dans le paramètre CONTROL_FILES en utilisant
SélectionnezALTER
SYSTEMSET
CONTROL_FILES=
(
'/disk1/oradata/BASE/ctrlBASE01.ctl'
,'/disk2/oradata/ BASE /ctrlBASE2.ctl'
,'/disk3/oradata/ BASE /ctrlBASE03.ctl'
)
SCOPE=
SPFILE; -
Arrêter la base
SélectionnezSHUTDOWN
IMMEDIATE
- Copier le fichier de contrôle en utilisant les commandes OS.
Sous Unix
cp /
disk1/
oradata/
BASE/
ctrlBASE01.ctl /
disk3/
oradata/
BASE/
ctrlBASE03.ctl
- Démarrer la base
STARTUP
III. Sauvegarde du fichier de contrôle▲
Il y a deux façons de sauvegarder le fichier de contrôle :
ALTER
DATABASE
BACKUP
CONTROLFILE TO
nom_du_fichier
Cette commande sauvegarde le fichier de contrôle en un fichier binaire.
L'autre façon est :
ALTER
DATABASE
BACKUP
CONTROLFILE TO
TRACE;
Cette commande crée un fichier en format texte dans le répertoire USER_DUMP_DEST, qu'on peut modifier pour reconstruire un nouveau fichier de contrôle.
Oracle recommande de sauvegarder le fichier de contrôle à chaque modification de la structure de la base comme le fait d'ajouter, renommer ou supprimer un fichier de données ou un fichier journal.
IV. Informations sur les fichiers de contrôle▲
Les vues suivantes affichent des informations sur les fichiers de contrôle :
- V$DATABASE
- V$CONTROLFILE
- V$CONTROLFILE_RECORD_SECTION
- V$PARAMETER
IV-A. La vue V$CONTROLFILE▲
La vue V$CONTROLFILE affiche tous les noms des fichiers de contrôle et leur statut qui peut être NULL ou INVALID.
SELECT
*
FROM
V$CONTROLFILE;
STATUS
NAME
------ --------------------------------------
/
ora01/
oradata/
MYDB/
ctrlMYDB01.ctl
/
ora02/
oradata/
MYDB/
ctrlMYDB02.ctl
/
ora03/
oradata/
MYDB/
ctrlMYDB03.ctl
3
rows
selected.
On peut visualiser ces informations avec la commande
show
parameter control_files
NAME
TYPE
VALUE
---------------- --------- ------------------------------
control_files string
H:\Oracle9i\oradata\or90\CONTROL01.CTL,
H:\Oracle9i\oradata\or90\CONTROL02.CTL,
H:\Oracle9i\oradata\or90\CONTROL03.CTL
IV-B. La vue V$CONTROLFILE_RECORD_SECTION▲
La vue V$CONTROLFILE_RECORD_SECTION contient plusieurs informations sur le fichier de contrôle.
select
*
from
v$controlfile_record_section;
TYPE
RECORD
RECORDS RECORDS FIRST
LAST
LAST
SIZE TOTAL USED INDEX
INDEX
RECID
DATABASE
192
1
1
0
0
0
CKPT PROGRESS 8180
11
0
0
0
0
REDO THREAD 104
8
1
0
0
0
REDO LOG
72
16
3
0
0
9
DATAFILE
180
100
5
0
0
18
FILENAME 524
149
9
0
0
0
TABLESPACE
68
100
6
0
0
2
TEMPORARY
FILENAME 56
100
1
0
0
1
RMAN CONFIGURATION 1108
50
0
0
0
0
LOG
HISTORY 36
454
29
1
29
29
OFFLINE
RANGE
56
292
0
0
0
0
ARCHIVED LOG
584
28
0
0
0
0
BACKUP
SET
40
409
0
0
0
0
BACKUP
PIECE 736
200
0
0
0
0
BACKUP
DATAFILE
116
282
0
0
0
0
BACKUP
REDOLOG 76
215
0
0
0
0
DATAFILE
COPY 660
223
1
1
1
1
BACKUP
CORRUPTION 44
371
0
0
0
0
COPY CORRUPTION 40
409
0
0
0
0
DELETED OBJECT 20
818
1
1
1
1
PROXY
COPY 852
249
0
0
0
0
BACKUP
SPFILE 36
454
0
0
0
0
DATABASE
INCARNATION 56
292
4
1
4
4
FLASHBACK LOG
84
2048
0
0
0
0
RECOVERY DESTINATION 180
1
1
0
0
0
INSTANCE
SPACE
RESERVATION 28
63
1
0
0
0
REMOVABLE RECOVERY FILES 32
1000
0
0
0
0
RMAN STATUS
116
141
0
0
0
0
THREAD INSTANCE
NAME
MAPPING 80
8
8
0
0
0
MTTR 100
8
1
0
0
0
DATAFILE
HISTORY 568
57
0
0
0
0
31
rows
selected
On a
- TYPE : Type de la section ;
- RECORD_SIZE : Taille d'une entrée en bits ;
- RECORDS_TOTAL : Nombre d'entrées allouées pour la section (qu'elles soient occupées ou non) ;
- RECORDS_USED : Nombres d'entrées utilisées dans la section ;
- FIRST_INDEX : Index de la première entrée ;
- LAST_INDEX : Index de la dernière entrée ;
- LAST_RECID : Id de la dernière entrée.
C'est dans cette vue qu'on trouve les valeurs de MAXLOGFILES, MAXDATAFILES, MAXINSTANCES, MAXINSTANCES et MAXLOGHISTORY
Type
RECORDS_TOTAL
REDO LOG
16
MAXLOGFILES
DATAFILE
100
MAXDATAFILES
REDO THREAD 8
MAXINSTANCES
LOG
HISTORY 454
MAXLOGHISTORY
Pour afficher la valeur de MAXLOGMEMBERS on utilise la vue X$KCCDI :
select
dimlm from
x
$kccdi;
Il existe des vues qui lisent directement dans le fichier de contrôle au lieu de lire dans le dictionnaire de données comme :
V$ARCHIVED_LOG, V$BACKUP, V$BACKUP_DATAFILE, V$BACKUP_PIECE, V$BACKUP_REDOLOG, V$BACKUP_SET, V$DATABASE, V$DATAFILE, V$DATAFILE_COPY, V$DATAFILE_HEADER, V$LOG, V$LOGFILE, V$THREAD.
On peut vérifier les accès au fichier de contrôle de ces vues par :
Select
sid, event
, total_waits from
v$session_event where
event
=
'control file sequential read'
;
V. Création d'un fichier de contrôle▲
Il est nécessaire de créer les fichiers de contrôle :
- si tous les fichiers de contrôle sont perdus ou corrompus ;
- en cas de changement du nom de la base ;
- en cas de modification de certains paramètres en dur comme MAXDATAFILES, MAXLOGFILES, MAXLOGHISTROY… ;
- si vous voulez déplacer la base sur une autre machine et que l'emplacement des fichiers de données et des fichiers journaux est différent des emplacements originaux.
Le fichier de contrôle initial est créé pendant la création de la base. Son nom est spécifié dans le paramètre d'initialisation CONTROL_FILES et voici un exemple :
CONTROL_FILES =
(/
u01/
oracle/
mabase/
control01.ctl,
/
u02/
oracle/
mabase/
control02.ctl,
/
u03/
oracle/
mabase/
control03.ctl)
Si vous utilisez OMF vous n'avez pas besoin de spécifier le fichier de contrôle dans le fichier d'initialisation. Oracle prend en compte l'emplacement du fichier de contrôle suivant ces paramètres dans l'ordre : DB_CREATE_ONLINE_LOG_DEST_n, DB_CREATE_FILE_DEST et DB_RECOVERY_FILE_DEST.
Même si le paramètre CONTROL_FILES n'est pas spécifié dans le fichier d'initialisation, oracle le crée automatiquement dans le répertoire par défaut de l' OS. Le fichier créé n'est pas un OMF.
Il faut avoir le privilège sysdba pour créer un fichier de contrôle.
Si le paramètre REMOTE_LOGIN_PASSWORDFILE =EXCLUSIVE, oracle signale une erreur. Il faut donc affecter à ce paramètre la valeur SHARED ou créer un nouveau fichier de mot de passe.
Si le fichier de contrôle existe déjà, il faut utiliser CONTROLFILE REUSE au lieu de CONTROLFILE SET dans la clause CREATE DATABASE, et si la taille de l'ancien fichier est différente du nouveau on ne peut pas utiliser l'option REUSE.
On peut créer un nouveau fichier de contrôle en utilisant CREATE CONTROLFILE et voici un exemple :
CREATE
CONTROLFILE
SET
DATABASE
mabase
LOGFILE
GROUP
1
(
'/u01/oracle/mabase/redo01_01.log'
,
'/u01/oracle/mabase/redo01_02.log'
)
,
GROUP
2
(
'/u01/oracle/mabase/redo02_01.log'
,
'/u01/oracle/mabase/redo02_02.log'
)
,
GROUP
3
(
'/u01/oracle/mabase/redo03_01.log'
,
'/u01/oracle/mabase/redo03_02.log'
)
NORESETLOGS
DATAFILE
'/u01/oracle/mabase/system01.dbf'
SIZE 3M,
'/u01/oracle/mabase/rbs01.dbs'
SIZE 5M,
'/u01/oracle/mabase/users01.dbs'
SIZE 5M,
'/u01/oracle/mabase/temp01.dbs'
SIZE 5M
MAXLOGFILES 50
MAXLOGMEMBERS 3
MAXLOGHISTORY 400
MAXDATAFILES 200
MAXINSTANCES 6
ARCHIVELOG;
Il faut faire très attention pendant la création du fichier de contrôle, car il peut endommager les fichiers de données et les fichiers journaux. Et le fait d'oublier de mentionner un fichier de données pendant la création du fichier de contrôle peut causer la perte de ce fichier et même la perte de la base entière. Il faut encore faire attention si vous utilisez le mode FORCE LOGGING.
Les étapes à suivre pour créer un nouveau fichier de contrôle :
- lister tous les fichiers de données et de journaux en ligne.
Soit en utilisant le fichier trace lancé par la commande :
ALTER
DATABASE
BACKUP
CONTROLFILE TO
TRACE;
Sinon vous pouvez utiliser les vues suivantes :
SELECT
MEMBER FROM
V$LOGFILE
;
SELECT
NAME
FROM
V$DATAFILE
;
SELECT
VALUE
FROM
V$PARAMETER WHERE
NAME
=
'CONTROL_FILES'
;
Si vous n'avez pas ces informations, vous ne pouvez pas ouvrir la base ;
-
arrêter la base
SélectionnezSHUTDOWN
IMMEDIATE
-
sauvegarder tous vos fichiers de données et journaux ;
-
démarrer la base en mode nomount
SélectionnezSTARTUP NOMOUN
- créer le nouveau fichier de contrôle en utilisant CREATE CONTROLFILE.
Si vous avez perdu l'un des groupes de fichiers journaux ou si vous avez renommé la base, utilisez l'option RESETLOGS, sinon utilisez l'option NORESETLOGS.
Quand on utilise l'option NORESETLOGS, oracle compare le numéro de groupe spécifié dans CREATE CONTROLFILE et l'entête du fichier journal. Si la comparaison échoue, on aura le message suivant :
01224
, 00000
, "group number in header %s does not match GROUP %s"
//
*
Cause: Group
number
specified at
CREATE
CONTROLFILE does not
match
the
//
group
number
stored
in
the header. Most likely the specification
//
is
wrong.
//
*
Action
: Omit the GROUP
option
or
give the correct one
.
Ce qui veut dire que le fichier journal :
- Appartient à une autre instance ou
- Le numéro de groupe est erroné dans CREATE CONTROLFILE ou
- Est une copie ancienne ;
Si le nouveau fichier de contrôle est créé avec l'option NORESETLOGS vous pouvez restaurer la base complètement, et s'il est créé avec l'option RESETLOGS vous devez utiliser USING BACKUP CONTROL FILE et ouvrir la base avec ALTER DATABASE OPEN RESETLOGS;
VI. Déplacement d'un fichier de contrôle▲
Supposons qu'on a trois fichiers de contrôle : u01/oracle/mabase/control01.ctl, u02/oracle/mabase/control02.ctl, u03/oracle/mabase/control03.ctl et on veut déplacer le fichier control03.ctl dans u04/oracle/mabase/control03.ctl.
-
Arrêter la base normalement
SélectionnezSHUTDOWN
IMMEDIATE
-
Déplacer les fichiers de contrôle
Sélectionnezmv u03
/
oracle/
mabase/
control03.ctl u04/
oracle/
mabase/
control03.ctl -
Modifier le paramètre CONTROL_FILES dans le fichier initSID.ora si vous utilisez le pfile
Sélectionnezcontrol_files
=
(
u01/
oracle/
mabase/
control01.ctl, u02/
oracle/
mabase/
control02.ctl,u04/
oracle/
mabase/
control03.ctl)
- Démarrer la base
STARTUP
VII. Suppression d'un fichier de contrôle▲
Supposons qu'on a trois fichiers de contrôle : u01/oracle/mabase/control01.ctl, u02/oracle/mabase/control02.ctl, u03/oracle/mabase/control03.ctl et on veut supprimer control03.ctl.
-
Arrêter la base normalement
SélectionnezSHUTDOWN
IMMEDIATE
-
Modifier le paramètre CONTROL_FILES dans le fichier initSID.ora si vous utilisez le pfile
Sélectionnezcontrol_files
=
(
u01/
oracle/
mabase/
control01.ctl, u02/
oracle/
mabase/
control02.ctl)
-
N'oubliez pas de supprimer le fichier de contrôle avec votre système d'exploitation
Sélectionnezrm u01
/
oracle/
mabase/
control03.ctl - Démarrer la base
STARTUP
VIII. Restauration d'un fichier de contrôle corrompu à partir d'un autre fichier valide▲
Supposons qu'on a trois fichiers de contrôle : u01/oracle/mabase/control01.ctl, u02/oracle/mabase/control02.ctl, u03/oracle/mabase/control03.ctl et que le fichier control03.ctl est corrompu.
-
Arrêter la base normalement
SélectionnezSHUTDOWN
IMMEDIATE
-
Copier le fichier de contrôle valide en écrasant le fichier corrompu
Sélectionnezcp u01
/
oracle/
mabase/
control01.ctl u03/
oracle/
mabase/
control03.ctl - Démarrer la base
STARTUP