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.