Comment restaurer une base de données sans perdre les données Live ?

Il y a quelques semaines, j’ai été appelé par une équipe applicative suite au crash de batch. L’impact n’était pas aussi faible que j’ai pu le constater à l’origine…
Dans un premier temps, il s’avère que les batchs migrés d’AIX à Linux possèdent une incohérence. En cas de plantage, les batchs ont été suffisamment bien écrit pour effectuer un import des données exportées avant lancement.
En revanche, il s’est avéré 6 jours après le crash que des données étaient manquantes dans certaines tables.
Heureusement, le service applicatif a demandé aux utilisateurs de ne pas intégrer de nouvelles données. Par contre, difficile de demander aux internautes de ne pas se connecter sur le site pour ne pas alimenter de tables…

Ainsi, toutes les tables étaient intactes excepté pour les tables « web »…
De ce fait, on m’a demandé d’effectuer une restauration de la base de données à 6 jours sans perdre les données Live.
J’ai donc effectué un Point-in-Time Duplicate Database vers un serveur tiers pour ensuite effectué un export des tables à restaurer.
Voici le déroulé de l’opération :

  1. Récupération des fichiers de sauvegarde et des archivelogs sur le serveur tiers par le biais de « cp » ou « scp ».
  2. Création de l’arborescence identique au système d’origine :
    mkdir -p /opt/oracle/admin/dbrecup/adump
    mkdir -p /opt/oracle/diag/rdbms/dbrecup/dbrecup/alert
    mkdir /opt/oracle/diag/rdbms/dbrecup/dbrecup/cdump
    mkdir /opt/oracle/diag/rdbms/dbrecup/dbrecup/hm
    mkdir /opt/oracle/diag/rdbms/dbrecup/dbrecup/incident
    mkdir /opt/oracle/diag/rdbms/dbrecup/dbrecup/incpkg
    mkdir /opt/oracle/diag/rdbms/dbrecup/dbrecup/ir
    mkdir /opt/oracle/diag/rdbms/dbrecup/dbrecup/lck
    mkdir /opt/oracle/diag/rdbms/dbrecup/dbrecup/metadata
    mkdir /opt/oracle/diag/rdbms/dbrecup/dbrecup/metadata_dgif
    mkdir /opt/oracle/diag/rdbms/dbrecup/dbrecup/metadata_pv
    mkdir /opt/oracle/diag/rdbms/dbrecup/dbrecup/stage
    mkdir /opt/oracle/diag/rdbms/dbrecup/dbrecup/sweep
    mkdir /opt/oracle/diag/rdbms/dbrecup/dbrecup/trace
    mkdir -p /u03/oradata/dbrecup/datafile/
    mkdir -p /u01/oradata/dbrecup/controlfile/
    mkdir -p /u02/oradata/dbrecup/controlfile/
    mkdir -p /u01/oradata/dbrecup/onlinelog/
    mkdir -p /u02/oradata/dbrecup/onlinelog/
    mkdir -p /u04/oradata/oraflash
  3. Création d’un fichier de paramètre pour pouvoir démarrer la base :
    echo "DB_NAME=dbrecup" > /opt/oracle/product/11.2.0/dbhome_1/dbs/initdbrecup.ora
  4. Génération du fichier de mot de passe :
    orapwd file=orapwdbrecup entries=5
  5. Préparation de l’environnement :
    export ORACLE_HOME=/opt/oracle/product/11.2.0/dbhome_1
    export ORACLE_SID=dbrecup
    export NLS_LANG=american_america.AL32UTF8
    export NLS_DATE_FORMAT=YYYY-MM-DD:HH24:MI:SS
  6. Démarrage de la base en mode nomount :
    sqlplus / as sysdba
    startup nomount pfile='?/dbs/initderecup.ora
    exit
  7. Connexion à RMAN :
    rman AUXILIARY /
  8. Lancement de la restauration :
    DUPLICATE DATABASE to dbrecup
    UNTIL TIME "TO_DATE('XXXX-XX-XX:YY:YY:YY','YYYY-MM-DD:HH24:MI:SS')"
    BACKUP LOCATION '/u03/oradata/backup'
    nofilenamecheck;
  9. Une fois récupéré, un simple export a été fait :
    sqlplus / as sysdba
    create directory EXP_RECUP as '/tmp/expdp';
    exit
  10. expdp user directory=EXP_RECUP dumpfile=EXPDP_RECUP_before_reinject_olds_%U.dmp logfile=EXPDP_RECUP_before_reinject_olds.log PARALLEL=2

Puis un import a été fait dans les tables dans la base de données de prod.
En espérant vous être utile 🙂
Pascal