Duplicate for standby : RMAN-05507: standby control file checkpoint is more recent than duplication point-in-time

Voici un nouvel article à propos du standby control file et une erreur que l’on peut rencontrer en créant une base standby duplicate for standby RMAN à partir d’un backup RMAN.

J’avais besoin de créer une base standby pour un test. Ayant le backup RMAN de la nuit sous la main, je le transfère vers la machine sur laquelle je veux créer cette base.

L’objet de cet article n’est pas d’expliquer comment on réalise cette opération, mais de se focaliser sur le problème de l’erreur RMAN-05507.

Pour pouvoir restaurer cette sauvegarde et créer une base standby, il manque alors un standby controlfile que l’on crée comme ceci sous SQL*PLUS :

SQL> alter database create standby controlfile as '/backup/control_stdby_ctl';

ou bien par RMAN:

RMAN> backup current controlfile for standby format='/backup/control_stdby.ctl';

On transfère ce fichier sur le serveur standby en le plaçant avec le reste de la sauvegarde et on peut lancer la création de la base standby par un DUPLICATE FOR STANDBY qui va rechercher un standby controlfile dans le répertoire du backup indiqué par la directive RMAN backup_location.

RMAN> duplicate database 'db1' for standby backup location '/backup';

Tout commence bien, le standby controlfile est sélectionné pour restaurer la base, mais au moment de débuter la restauration des datafiles, l’erreur se produit :

RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of Duplicate Db command at 08/30/2019 18:01:44
RMAN-05501: aborting duplication of target database
RMAN-05507: standby control file checkpoint (135623586078) is more recent than duplication point-in-time (135623520292)

Il semble donc que disposer d’un standby controlfile ne suffise pas, il faut qu’il soit généré à un moment particulier, mais lesquel ?

J’ai donc recherché sur la primaire à quel numéro de séquence appartenait le SCN 135623586078, étant donné que c’est celui du standby controlfile qui a été généré manuellement après le backup de la base.

RMAN> list backup of archivelog all;
BS Key  Size       Device Type Elapsed Time Completion Time
------- ---------- ----------- ------------ ---------------
371     18.69M     DISK        00:00:01     30-AUG-19
        BP Key: 371   Status: AVAILABLE  Compressed: YES  Tag: ARCH_20190830_DB1
        Piece Name: /backup/arch_20190830_164501_d=DB1_I=3848200849_s=43483_p=1

  List of Archived Logs in backup set 371
  Thrd Seq     Low SCN    Low Time  Next SCN   Next Time
  ---- ------- ---------- --------- ---------- ---------
  1    210     135623520264 30-AUG-19 135623520297 30-AUG-19
  1    211     135623520297 30-AUG-19 135623582415 30-AUG-19
  1    212     135623582415 30-AUG-19 135623582493 30-AUG-19
  2    173     135623520269 30-AUG-19 135623520292 30-AUG-19
  2    174     135623520292 30-AUG-19 135623582510 30-AUG-19

La séquence 174 (du thread 2, la base primaire est un RAC à 2 noeuds) contient donc le SCN 135623520292 de la sauvegarde qui sert de base au point in time duplicate.

Au début du duplicate, RMAN explore donc le répertoire contenant le backup et détermine le SCN à utiliser sur la base des sauvegardes d’archivelog présentes dans le répertoire.

Le standby controlfile ayant été généré plus tard que le backup full, son SCN est supérieur (attention au n° du thread en RAC). Pour éviter l’erreur RMAN-05507, il suffit donc d’inclure dans le backup la sauvegarde des archivelogs de la base primaire créés au même moment ou juste après celle du standby controlfile.

Pour cela, on ajoute :

  • une rotation des logs avant de créer le standby
  • un archivage des logs après la création
 SQL> alter system switch logfile;
 SQL> alter database create standby controlfile as '/backup/control_stdby.ctl' ;
 SQL> alter system archive log current;

ou bien dans le script de sauvegarde RMAN

 rman <<-EOF >> ${LOG_FILE}
    set echo on
    connect target /
    sql 'alter system switch logfile';
    backup current controlfile for standby format='/backup/control_stdby.ctl';
    sql 'alter system archive log current';
    exit;
EOF

Il faut ensuite sauvegarder les archivelogs et les transférer vers le serveur standby en même temps que le standby controlfile.

Une fois ceci fait, le duplicate se déroule correctement, le SCN du standby controlfile existe dans les archivelogs présents dans le backup.

contents of Memory Script:
{
   restore clone standby controlfile from  '/backup/control_stdby.ctl';
}
executing Memory Script

Starting restore at 30-AUG-19

channel a2: skipped, AUTOBACKUP already found
channel a3: skipped, AUTOBACKUP already found
channel a4: skipped, AUTOBACKUP already found
channel a1: copied control file copy
output file name=+DATA/db1/db1_control01.ctl
output file name=+FRA/db1/db1_control02.ctl
Finished restore at 30-AUG-19

contents of Memory Script:
{
   sql clone 'alter database mount standby database';
}
executing Memory Script

sql statement: alter database mount standby database

contents of Memory Script:
{
   set until scn  135623595357;
   set newname for tempfile  1 to
 "+DATA/db1/db1__temp_01.dbf";
   set newname for tempfile  2 to
 "+DATA/db1/db1__temp_02.dbf";
   set newname for tempfile  3 to
 "+DATA/db1/db1_temp_03.dbf";
   set newname for tempfile  4 to
 "+DATA/db1/db1_temp_04.dbf";
  switch clone tempfile all;
   set newname for datafile  1 to
 "+DATA/db1/db1_system_01.dbf";
   set newname for datafile  2 to
 "+DATA/db1/db1_sysaux_01.dbf";
   set newname for datafile  3 to
 "+DATA/db1/db1_undo1_01.dbf";
   set newname for datafile  4 to
 "+DATA/db1/db1_tools_01.dbf";
   set newname for datafile  5 to
 "+DATA/db1/db1_undo2_01.dbf";
...
...
   set newname for datafile  124 to
 "+DATA";
   set newname for datafile  125 to
 "+DATA";
   restore
   clone database
   ;
}
executing Memory Script

executing command: SET until clause
executing command: SET NEWNAME
...
...

Le script détermine un SCN de duplication set until scn 135623595357, ce qui correspond au SCN maximum présent dans les sauvegardes d’archivelogs présentes dans le répertoire /backup.

Il n’est pas vraiment pratique de procéder en plusieurs fois, idéalement il faudrait inclure un backup de standby controlfile à chaque backup. Il faut donc placer celui-ci à un moment bien précis : après le backup des datafiles et avant le backup des archivelogs.

Un script de backup RMAN devrait donc être découpé comme ceci pour ne plus avoir de soucis :

  1. backup database
  2. alter system switch logfile
  3. backup current controlfile for standby
  4. alter system archive log current
  5. backup archivelog

 

2 réflexions sur “Duplicate for standby : RMAN-05507: standby control file checkpoint is more recent than duplication point-in-time”

  1. Hafedh Kaddachi

    Bonjour
    Merci pour cet article fort intéressant.
    Je propose plutôt : ALTER SYSTEM ARCHIVE LOG CURRENT;
    Á la place de alter system switch Logfile;
    La première syntaxe forcera les switch log files sur tous les noeuds du RAC, s’il existe.
    Puis elle est synchrone.

    1. Laurent GALLET

      Bonjour Hafedh,
      C’est une bonne remarque, effectivement il est préférable d’utiliser ARCHIVE LOG CURRENT en particulier dans le cas d’une primaire RAC.
      Merci pour cette contribution.

Les commentaires sont fermés.