Restauration partielle de base de données Oracle

Il peut arriver que vous n’ayez besoin de restaurer qu’une partie d’une base de données. Par exemple :

  • ce qui m’est arrivé récemment : récupération d’un package sur un serveur de dev après un refresh depuis la prod ;
  • test de restauration sur une faible volumétrie ;
  • test sur une partie des données.

Par défaut RMAN ne propose pas cette option mais nous allons voir comment y arriver quand même.

Je vais prendre en exemple la restauration d’un package. Il suffit dans ce cas là d’avoir les tablespaces suivants présents dans le jeu de sauvegarde :

  • system
  • sysaux
  • undo

Dans la suite de l’article, le base source s’appelle SRC et la base destination pour la restauration partielle s’appelle PART. La restauration va se faire dans une autre arborescence que la celle de la base originale.
Tout d’abord il faut commencer par se fabriquer un fichier d’init pour la base PART. Par exemple :
*.audit_file_dest='/u01/oracle/rdbms/admin/PART/adump'
*.audit_trail='true'
*.background_dump_dest='/u01/oracle/rdbms/admin/PART/bdump'
*.cluster_database=FALSE
*.compatible='10.2.0.5.0'
*.control_files='+ASMDG1/PART/01.ctl'
*.core_dump_dest='/u01/oracle/rdbms/admin/PART/cdump'
*.db_block_size=8192
*.DB_CREATE_FILE_DEST='+ASMDG1'
*.db_create_online_log_dest_1='+ASMDG1'
*.db_domain=''
*.db_file_multiblock_read_count=16
*.db_files=250
*.db_name='SRC'
*.db_recovery_file_dest_size=75161927680
*.db_recovery_file_dest='+ASMDG1'
*.db_unique_name='PART'
*.db_writer_processes=2
*.pga_aggregate_target=256M
*.processes=800
*.remote_login_passwordfile='EXCLUSIVE'
*.service_names='PART'
*.session_cached_cursors=20
*.sga_max_size=512M
*.sga_target=512M
*.undo_management='AUTO'
*.undo_retention=7200
*.undo_tablespace='UNDOTBS1'
*.user_dump_dest='/u01/oracle/rdbms/admin/PART/udump'

Il faut ensuite restaurer le fichier de contrôle à partir de la sauvegarde :
# export ORACLE_HOME=/u01/oracle/rdbms/102/h1
# export ORACLE_SID=PART
# sqlplus / as sysdba
SQL> startup nomount
SQL> restore controlefile from '/backup/data/SRC/20120821053001/cf_a5nj66vv_1_1' ;

Comme on veux restaurer à un endroit différent, il faut redefinir les fichiers de données et ne restaurer que ceux qui dont les tablespace nous interessent (system, sysaux et undo) :
# rman target /
RMAN> run {
set newname for datafile 1 to '+ASMDG1' ;
set newname for datafile 2 to '+ASMDG1' ;
set newname for datafile 3 to '+ASMDG1' ;
set newname for datafile 4 to '+ASMDG1' ;
restore datafile 1,2,3,4 ;
SWITCH DATAFILE all ;
}

Maintenant il faut restaurer les archivelog (pour chacune des instances si SRC est en RAC):
# rman target /
RMAN> restore archivelog from logseq=100 until logseq=110 thread 1 ;
RMAN> restore archivelog from logseq=520 until logseq=537 thread 2 ;

Ensuite, on recrée un fichier de contrôle avec uniquement les fichiers existants. Pour cela on utilise la commande « create controlfile » où on précise bien :
– le mode resetlogs ;
– les fichiers redos qui seront crées au moment de l’ouverture ;
– les fichiers de données que l’on vient de restaurer.
# sqlplus / as sysdba
SQL> STARTUP NOMOUNT
SQL> CREATE CONTROLFILE REUSE DATABASE "SRC" RESETLOGS FORCE LOGGING ARCHIVELOG
MAXLOGFILES 32
MAXLOGMEMBERS 3
MAXDATAFILES 1000
MAXINSTANCES 8
MAXLOGHISTORY 59597
LOGFILE
GROUP 1 (
'+ASMDG1/part/onlinelog/group_1.2363.785952643'
) SIZE 100M,
GROUP 2 (
'+ASMDG1/part/onlinelog/group_2.4245.785952645'
) SIZE 100M,
GROUP 3 (
'+ASMDG1/part/onlinelog/group_3.5409.785952649'
) SIZE 100M
-- STANDBY LOGFILE
DATAFILE
'+ASMDG1/part/datafile/UNDOTBS1.1097.792084413',
'+ASMDG1/part/datafile/SYSAUX.990.792084413',
'+ASMDG1/part/datafile/SYSTEM.259.792084413',
'+ASMDG1/part/datafile/UNDOTBS2.256.792084413',
CHARACTER SET WE8ISO8859P15
;

Ensuite on recouvre la base :
# sqlplus / as sysdba
SQL> recover database until cancel using backup controlfile;

Pour finir, on ouvre la base :
# sqlplus / as sysdba
SQL> alter database open resetlogs ;