Restaurer un schéma Oracle avec RMAN Tablespace Point-in-time Recovery

Contexte

Vous avez une base de données de production sur laquelle se trouve plusieurs schémas applicatifs. Chaque schéma héberge une application indépendante. Une mauvaise manipulation vous a fait perdre les données vitales d’un schéma pour faire fonctionner son application. La seule solution pour relancer le service sans impacter les autres schémas de la base de données est de faire une restauration « Point-in-time » du schéma (juste avant l’erreur).
Pour ce cas, Oracle nous fournit cette possibilité en Enterprise Edition avec la fonctionnalité « RMAN Tablespace Point-in-time Recovery ».

Prérequis et recommandations

Tout d’abord, vous devez prendre en compte les restrictions et recommandations présentes dans la note Oracle RMAN TSPITR Tips and Tricks (Doc ID 1531202.1)
Extrait de la note:

  • Can only be used for databases running in ARCHIVELOG mode
  • The tablespace (or list of tablespaces) must be self-contained and cannot be the current default tablespace.
  • TSPITR utilizes your backups. So the earliest point you can take the tablespace to is determined by your earliest available backup.
  • TSPITR cannot be performed if the tablespace undo or rollback segments, Oracle8 compatible advance queues with multiple recipients, or objects owned by SYS (such as PL/SQL, Java classes, callout programs, views, synonyms, users, privileges, dimensions, directories, and sequences)
  • Only available in Enterprise Edition
  • Cannot be used to recover tablespaces with underlying objects (such as materialized views) or contained objects (such as partitioned tables) unless all of the underlying or contained objects are in the recovery set
  • Cannot be used to recover tablespaces containing Undo or rollback segments
  • TSPITR does not recover query optimizer statistics for recovered objects. You must gather new statistics after TSPITR completes.

Identifier le schéma à restaurer et fixer la date de restauration

Avant de commencer l’opération, il faut identifier le schéma à restaurer ainsi que la date à laquelle vous souhaitez retourner.

Lister les tablespaces utilisés par le schéma

$ sqlplus sys/xxxxxxxx as sysdba
SQL> select OWNER, TABLESPACE_NAME, round(sum(BYTES)/1024/1024) Mo from dba_segments where owner='USER' group by OWNER, TABLESPACE_NAME order by 2;
OWNER                         TABLESPACE_NAME                       MO
------------------------------ ------------------------------ ----------
USER                           TABLESPACE1                             1
USER                           TABLESPACE2                          2266
USER                           TABLESPACE3                           139

Nous avons ici 3 tablespaces à restaurer.

Vérifier les dépendances

SQL>
BEGIN
   DBMS_TTS.TRANSPORT_SET_CHECK('TABLESPACE2,TABLESPACE1,TABLESPACE3', TRUE,TRUE);
END;
/
SQL> SELECT * FROM TRANSPORT_SET_VIOLATIONS;
no rows selected

La table TRANSPORT_ET_VIOLATIONS ne doit pas contenir de lignes. Sinon, inclure les tablespaces manquants.

S’assurer que les tablespaces ne sont pas utilisés par un autre schéma

SQL> select distinct OWNER, TABLESPACE_NAME from dba_segments where tablespace_name IN ('TABLESPACE1','TABLESPACE2','TABLESPACE3') order by 1;
 OWNER                         TABLESPACE_NAME
------------------------------ ------------------------------
TEST                           TABLESPACE1
TEST                           TABLESPACE2
TEST                           TABLESPACE3

Vérifier que des objets n’ont pas été créés après la date de restauration

Des objets ont pu être créés après la date de restauration souhaitée. Dans ce cas, il faudra faire le nécessaire pour les recréer.

SQL> SELECT OWNER, NAME, TABLESPACE_NAME,
TO_CHAR(CREATION_TIME, 'YYYY-MM-DD:HH24:MI:SS')
FROM TS_PITR_OBJECTS_TO_BE_DROPPED
WHERE TABLESPACE_NAME IN ('TABLESPACE1','TABLESPACE2','TABLESPACE3')
AND CREATION_TIME > TO_DATE('16-FEB-15:11:20:00','YY-MON-DD:HH24:MI:SS')
ORDER BY TABLESPACE_NAME, CREATION_TIME;
no rows selected

Effectuer la restauration RMAN Tablespace Point-in-time Recovery

RMAN automatise l’ensemble du processus en créant puis en supprimant une instance auxiliaire : il s’occupe de passer les tablespaces d’origine OFFLINE, de restaurer les fichiers des tablespaces concernés dans l’instance auxiliaire, de procéder à la récupération jusqu’au moment choisi, de réinjecter les fichiers dans l’instance d’origine, puis de supprimer l’instance auxiliaire. Il laisse les tablespaces récupérés en mode OFFLINE.

Paramètre d’initialisation de la base auxiliaire

L’instance auxiliaire créée automatiquement par RMAN TSPITR utilise un lot de paramètres par défaut spécifiés dans la documentation Oracle (https://docs.oracle.com/cd/E18283_01/backup.112/e10642/rcmtspit.htm#i1034656).
Si ces valeurs ne conviennent pas, il est possible de les surcharger en créant un fichier de paramètres que vous pouvez spécifier dans votre script RMAN avec :

SET AUXILIARY INSTANCE PARAMETER FILE '<destination fichier de paramètre de la base auxiliaire>';

Créer le script RMAN

Fichier : <chemin_script>/recover_tablespace.rman

RUN{
# Recover the clients tablespace
RECOVER TABLESPACE TABLESPACE2, TABLESPACE1, TABLESPACE3
UNTIL TIME "TO_DATE('2016-02-12 11:20:00','YYYY-MM-DD HH24:MI:SS')"
AUXILIARY DESTINATION '<destination de la base auxiliary>';
}

Exécuter le script RMAN

$ nohup rman target sys/xxxxxxxx@PRIMARY cmdfile=<chemin_script>/recover_tablespace.rman msglog=<chemin_script>/recover_tablespace.log &

Mettre les tablespaces ONLINE

RMAN> SQL "ALTER TABLESPACE TABLESPACE2 ONLINE";
RMAN> SQL "ALTER TABLESPACE TABLESPACE1 ONLINE";
RMAN> SQL "ALTER TABLESPACE TABLESPACE3 ONLINE";

Collecter les statistiques du schéma

SQL> EXECUTE DBMS_STATS.GATHER_SCHEMA_STATS(ownname => 'USER');

Conclusion

A la fin de l’opération, vous avez récupéré vos données supprimées. Cette procédure ne convient pas pour un schéma représentant 90% de la volumétrie de la base de données car le temps de traitement serait plus long qu’une duplication de la base.

1 réflexion sur “Restaurer un schéma Oracle avec RMAN Tablespace Point-in-time Recovery”

  1. KADDACHI Hafedh

    Bonjour,
    Merci pour cet article fort intéressant.
    Je voudrais apporter une petit plus concernant le même sujet dans un contexte de TDE.
    On suppose que le TDE est bien implémenté, et que l’on dispose du mot de passe du Keytore : exemple « mySecret ».
    Pour restaurer le tablespace MY_TBS à la date du 02/04/2020,09:43:50, pour la PDB MY_PDB dont la CDB est MY_CDB. En plus de tout ce qui a été dit dans cet article, les étapes seront :
    1. copier sqlnet.ora dans un espace temporaire : pare exemple cp $ORACLE_HOME/network/admin/sqlnet.ora /tmp/hk/net
    2. le sqlnet.ora copié doit être de la façon suivante :
    /tmp/hk/net$cat sqlnet.ora
    NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT)
    NAMES.DEFAULT_DOMAIN=dev.local

    SQLNET.EXPIRE_TIME=10
    SQLNET.INBOUND_CONNECT_TIMEOUT=600
    ENCRYPTION_WALLET_LOCATION =
    (SOURCE =
    (METHOD = FILE)
    (METHOD_DATA =
    (DIRECTORY = /home/logiciel/oracle/orabase/admin/MY_CDB/wallet/)
    )
    )
    3. export TNS_ADMIN=/tmp/hk/net
    4. lancer la commande RMAN :
    RMAN> set encryption on identified by ‘mySecret’;
    RMAN> recover tablespace MY_PDB:MY_TBS until time « to_date (’02/04/2020,09:43:50′, ‘DD/MM/YYYY,HH24:MI:SS’) »
    AUXILIARY DESTINATION ‘/tmp/hk’;
    ….

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *