Voici un billet faisant suite à une formation récente et a une question d'un des stagiaires. Que faire en cas de pertes de tous les redologs de la base si on ne dispose pas de sauvegarde type RMAN ?

Perdre les redolog est sans doute la pire des choses sur une base Oracle. Ces fichiers ne sont pas énormes mais vitaux. Toute transaction passe par eux.

En cas de perte totale des redolog et si on ne dispose pas de sauvegarde la méthode est simple mais demande un certain soin. Dans cet exemple une base nommée YODA dispose de 3 groupes de 2 membres. Les requêtes SQL suivantes présentent cet état :

SYS@YODA >col member format a40
SYS@YODA >select group#,member,status from v$logfile;

    GROUP# MEMBER				    STATUS
---------- ---------------------------------------- ---------------------
	 1 /u02/app/oracle/oradata/YODA/redo01a.rdo
	 1 /u03/app/oracle/oradata/YODA/redo01b.rdo
	 2 /u02/app/oracle/oradata/YODA/redo02a.rdo
	 2 /u03/app/oracle/oradata/YODA/redo02b.rdo
	 3 /u02/app/oracle/oradata/YODA/redo03a.rdo
	 3 /u03/app/oracle/oradata/YODA/redo03b.rdo

6 ligne(s) sélectionnée(s).

SYS@YODA >select group#,members,status from v$log;

    GROUP#    MEMBERS STATUS
---------- ---------- ------------------------------------------------
	 1	    2 INACTIVE
	 2	    2 CURRENT
	 3	    2 INACTIVE

SYS@YODA >

Dans un premier temps stopper la base de données ( shutdown immediate )

Par le système d'exploitation supprimons tous les fichiers .rdo

rm -f /u02/app/oracle/oradata/YODA/*.rdo
rm -f /u03/app/oracle/oradata/YODA/*.rdo

Si on tente un redémarrage, une erreur se produit.

SYS@YODA >startup
Instance ORACLE lancée.

Total System Global Area  668082176 bytes
Fixed Size		    2256232 bytes
Variable Size		  201327256 bytes
Database Buffers	  461373440 bytes
Redo Buffers		    3125248 bytes
Base de données montée.
ORA-03113: fin de fichier sur canal de communication
ID de processus : 5951
ID de session : 1,  Numéro de série : 5


SYS@YODA >

La consultation de alert_YODA.log, via ADRCI ( merci 11g ), montrera bien la perte des 6 fichiers composant les redologs.

Relancer la base en mode mount et interroger la vue v$log afin de connaître le statut des membres

SYS@YODA >startup mount;
Instance ORACLE lancée.

Total System Global Area  668082176 bytes
Fixed Size		    2256232 bytes
Variable Size		  201327256 bytes
Database Buffers	  461373440 bytes
Redo Buffers		    3125248 bytes
Base de données montée.
SYS@YODA >select group#,members,status from v$log;

    GROUP#    MEMBERS STATUS
---------- ---------- ------------------------------------------------
	 1	    2 INACTIVE
	 3	    2 INACTIVE
	 2	    2 CURRENT

SYS@YODA >

Supprimer le premier groupe en INACTIVE, ici le groupe 1.

SYS@yoda >alter database drop logfile group 1;

Base de données modifiée.

Re-créer le groupe 1.

SYS@YODA >alter database add logfile group 1 ( '/u02/app/oracle/oradata/YODA/redo01a.rdo','/u03/app/oracle/oradata/YODA/redo01b.rdo') size 50M;

Base de données modifiée.

Procéder de la même manière pour le second groupe en INACTIVE en adaptant le numéro du groupe et le nom des fichiers ici le groupe 3.

SYS@YODA >alter database drop logfile group 3;

Base de données modifiée.

SYS@YODA >alter database add logfile group 3 ( '/u02/app/oracle/oradata/YODA/redo03a.rdo','/u03/app/oracle/oradata/YODA/redo03b.rdo') size 50M;

Base de données modifiée.

SYS@YODA >

Le groupe 2, qui est CURRENT, doit dans un premier temps vidé avant sa suppression, sinon il y aura une erreur.

SYS@yoda >alter database drop logfile group 2;
alter database drop logfile group 2
*
ERREUR à la ligne 1 :
ORA-01623: le journal 2 est le journal en cours pour l'instance YODA (thread 1) - suppression impossible
ORA-00312: journal en ligne 2 thread 1 : '/u02/app/oracle/oradata/YODA/redo02a.rdo'
ORA-00312: journal en ligne 2 thread 1 : '/u03/app/oracle/oradata/YODA/redo02b.rdo'

Utiliser la clause clear pour vider le redolog courant, puis le supprimer comme ci-dessus et recréer le groupe.

SYS@yoda >alter database clear logfile group 2;

Base de données modifiée.

SYS@yoda >alter database drop logfile group 2;

Base de données modifiée.

SYS@yoda >alter database add logfile group 2 ( '/u02/app/oracle/oradata/YODA/redo02a.rdo','/u03/app/oracle/oradata/YODA/redo02b.rdo') size 50M;

Base de données modifiée.

SYS@YODA >

En cas de base en archivelog, la méthode est similaire. Toutefois je conseille de passer temporairement en noarchivelog pour les manipulations. Il y a toutefois une différence pour le redolog courant, il faut utiliser la clause UNARCHIVED avec le CLEAR ( voir l'exemple suivant :

SYS@yoda >alter database clear unarchived logfile group 2;

Base de données modifiée.

SYS@yoda >

Une fois la situation rétablie, réactiver le mode archivelog.