Restaurer une base de données à un SCN antérieur au dernier Resetlogs

Qu’est-ce qu’une incarnation ?

Une nouvelle incarnation de votre base de données est créée lorsqu’elle est ouverte avec l’option RESETLOGS. L’incarnation CURRENT est celle utilisée par la base actuellement (1). Nous pouvons comparer une incarnation à la vie d’une base de données. Si vous ouvrez votre base avec l’option RESETLOGS, une nouvelle incarnation (2) est créée et la précédente devient l’incarnation (1) PARENT. Si vous souhaitez restaurer votre base à un SCN antérieur au SCN de la dernière incarnation, vous serez dans l’obligation d’utiliser la commande RESET DATABASE TO INCARNATION comme je vais vous le montrer dans la suite de cet article.

Contraintes liées au changement d’incarnation

On ne peut pas utiliser les commandes habituelles « RMAN » du type « set until SCN ou set until TIME » avant un restore/recover si le SCN/TIME en question est antérieur à l’incarnation en cours.

Ceci pose problème dans des cas particuliers comme celui-ci : Suite à une erreur d’un utilisateur nous souhaitons restaurer notre base de données au SCN 1500 se trouvant juste avant la suppression de plusieurs lignes dans la table des « commandes ». Malheureusement nous avons depuis ouvert la base de données en « Resetlogs » suite à un incident sur un des fichiers « redologs ». Une nouvelle incarnation a été générée au moment de l’ouverture de la base en RESETLOGS, par conséquent les archivelogs générés dans l’incarnation précédente ne seront plus utilisables dans la présente incarnation.

Comment restaurer cette base de données au SCN 1500 et récupérer les lignes de commande supprimées ?

Méthode

Simulons une mauvaise manipulation engendrant la suppression de 48 lignes essentielles au fonctionnement d’une application. Cette manipulation nous contraint à restaurer la base avant la commande DML.

Dans notre exemple, le SCN courant de la base avant la suppression est 2176737. Ce résultat est obtenu en interrogeant la colonne current_scn de la vue v$database.

SQL> SELECT CURRENT_SCN FROM V$DATABASE;
CURRENT_SCN
-----------
    2176432

Pour récupérer les lignes supprimées, nous devons restaurer la base de données au SCN 2176432.
Avant notre restauration, notez l’incarnation courante dans la base. Nous y reviendrons ensuite. La liste des incarnations est consultable avec la commande suivante sous RMAN :

RMAN> LIST INCARNATION OF DATABASE;
using target database control file instead of recovery catalog
List of Database Incarnations
DB Key  Inc Key DB Name  DB ID            STATUS  Reset SCN  Reset Time
------- ------- -------- ---------------- --- ---------- ----------
1       1       ORCL     1388834883       PARENT  1          07-JUL-14
2       2       ORCL     1388834883       CURRENT 1594143    15-OCT-14

Positionnons la base à l’état MOUNT et lançons la restauration.

RMAN> SHUTDOWN IMMEDIATE
RMAN> STARTUP MOUNT
RMAN> RUN {
SET UNTIL SCN 2176432;
RESTORE DATABASE;
RECOVER DATABASE;
}
executing command: SET until clause
Starting restore at 18-JUN-15
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=243 device type=DISK
channel ORA_DISK_1: starting datafile backup set restore
channel ORA_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_DISK_1: restoring datafile 00001 to /app/oracle/oradata/ORCL/system01.dbf
……
Finished recover at 18-JUN-15

Ensuite, ouvrons la base avec l’option RESETLOGS pour terminer notre restauration (une nouvelle incarnation de la base commence avec comme Reset SCN le SCN suivant celui demandé dans notre commande de restauration)

SQL> ALTER DATABASE OPEN RESETLOGS;
Database altered.
RMAN> LIST INCARNATION OF DATABASE;
using target database control file instead of recovery catalog
List of Database Incarnations
DB Key  Inc Key DB Name  DB ID            STATUS  Reset SCN  Reset Time
------- ------- -------- ---------------- --- ---------- ----------
1       1       ORCL     1388834883       PARENT  1          07-JUL-14
2       2       ORCL     1388834883       PARENT  1594143    15-OCT-14
3       3       ORCL     1388834883       CURRENT 2176433    18-JUN-15

Malheureusement, suite à une nouvelle erreur utilisateur lors de laquelle des informations ont été involontairement supprimées, nous devons restaurer la base au même SCN que précédemment. Notons que le SCN demandé appartient à l’incarnation 2 de votre base de données et non l’incarnation CURRENT (3).

RMAN> SHUTDOWN IMMEDIATE;
RMAN> STARTUP MOUNT;
RMAN> RUN {
SET UNTIL SCN 2176432;
RESTORE DATABASE;
RECOVER DATABASE;
}
executing command: SET until clause
Starting restore at 18-JUN-15
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=243 device type=DISK
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of restore command at 06/18/2015 20:55:52
RMAN-20208: UNTIL CHANGE is before RESETLOGS change

Nous obtenons l’erreur ci-dessous car rappelez-vous, le SCN appartient à une autre incarnation (2), vous devez utiliser la commande RESET DATABASE TO INCARNATION pour changer l’incarnation CURRENT et relancer la restauration.

RMAN> RESET DATABASE TO INCARNATION 2;
database reset to incarnation 2
RMAN> LIST INCARNATION OF DATABASE;
List of Database Incarnations
DB Key  Inc Key DB Name  DB ID            STATUS  Reset SCN  Reset Time
------- ------- -------- ---------------- --- ---------- ----------
1       1       ORCL     1388834883       PARENT  1          07-JUL-14
2       2       ORCL     1388834883       CURRENT 1594143    15-OCT-14
3       3       ORCL     1388834883       ORPHAN  2176433    18-JUN-15
RMAN> RUN {
SET UNTIL SCN 2176432;
RESTORE DATABASE;
RECOVER DATABASE;
}
executing command: SET until clause
Starting restore at 18-JUN-15
using channel ORA_DISK_1
channel ORA_DISK_1: starting datafile backup set restore
channel ORA_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_DISK_1: restoring datafile 00001 to /app/oracle/oradata/ORCL/system01.dbf
……
Finished recover at 18-JUN-15
SQL> ALTER DATABASE OPEN RESETLOGS;
Database altered.

La restauration s’est terminée avec succès !
Remarque : L’incarnation numéro 3 est passée ORPHAN car elle n’a plus d’utilité pour RMAN.

RMAN> LIST INCARNATION OF DATABASE;
using target database control file instead of recovery catalog
List of Database Incarnations
DB Key  Inc Key DB Name  DB ID            STATUS  Reset SCN  Reset Time
------- ------- -------- ---------------- --- ---------- ----------
1       1       ORCL     1388834883       PARENT  1          07-JUL-14
2       2       ORCL     1388834883       PARENT  1594143    15-OCT-14
3       3       ORCL     1388834883       ORPHAN  2176433    18-JUN-15
4       4       ORCL     1388834883       CURRENT 2176433    18-JUN-15

1 réflexion sur “Restaurer une base de données à un SCN antérieur au dernier Resetlogs”

  1. Merci infiniment.
    Ce n’était jamais clair dans ma tête jusqu’à la lecture de cette note technique.

Les commentaires sont fermés.