jeudi 10 janvier 2013

Sauvegarde et restauration d'une base

Cette tâche ne doit jamais être négligée. En effet, une erreur matérielle ou humaine est si vite arrivée ! Pour ce faire, vous pouvez utiliser l'outil fourni par Oracle, RMAN. Pour l'apprivoiser, je vous conseille la lecture de cet ouvrage: Recipes for Oracle Database 11g ( D.Kuhn, S.Alapati, A.Nanda ). Il vous aidera à configurer RMAN et à déterminer la méthode de restauration à employer suivant le crash rencontré .

La syntaxe des commandes RMAN est très verbeuse, d'où ce guide en cas d'oubli.

Il y a quelques années, arkzoyd a écrit un tutoriel intéressant sur le sujet.

Voici une configuration initiale pour une sauvegarde d'une base sur disque:
- configure controlfile autobackup on; -> sauvegarde du fichier du contrôle et du SPFILE pour un backup mais aussi en cas d'un changement de structure de la base, par exemple un ajout d'un tablespace.
- configure controlfile autobackup format for device type disk to '/apps/orafra/autobackup/controlfile_%F' -> DBID dans le nom du fichier de sauvegarde.
- configure device type disk backup type to compressed backupset parallelism n; -> compression des fichiers de sauvegarde fortement recommandée et parallélisation du traitement via l'ouverture de n canaux.
 
La commande show all permet de vérifier la configuration RMAN. Par défaut, elle se trouve dans le fichier de contrôle. Mais il est possible de la placer dans un catalogue.

Pour compléter cette configuration, on modifie les paramètres suivants:
- alter system set db_recovery_size = n G;
- alter system set db_recovery_dest = '/apps/orafra'; -> création de la flash recovery area.

La sauvegarde d'une base en mode NOARCHIVELOG ( bases de développement, de recette, ... ) se fait de la manière suivante:
run {
shutdown immediate; => au préalable, fermer toutes les sessions utilisatrices
startup mount;
backup full database tag = 'xxxxx';
alter database open;
}

Bien entendu, vous pouvez le scripter via une commande de ce type : rman cmdfile=xxx.rman log=yyy.log. Si vous avez un catalogue, vous pouvez créer une bibliothèque de scripts.

Pour la restauration, considérons cette erreur ORA : ORA-01103: database name 'A' in control file is not 'B'.

On peut la traiter de la manière suivante:
RMAN> startup nomount;
RMAN> set dbid DBID
RMAN> restore controlfile from autobackup maxdays 20;

Starting restore at 21-JAN-13
using channel ORA_DISK_1

recovery area destination: /apps/orafra/
database name (or database unique name) used for search: B
channel ORA_DISK_1: no AUTOBACKUPS found in the recovery area
channel ORA_DISK_1: looking for AUTOBACKUP on day: 20130121
channel ORA_DISK_1: looking for AUTOBACKUP on day: 20130120
channel ORA_DISK_1: looking for AUTOBACKUP on day: 20130119
channel ORA_DISK_1: looking for AUTOBACKUP on day: 20130118
channel ORA_DISK_1: looking for AUTOBACKUP on day: 20130117
channel ORA_DISK_1: looking for AUTOBACKUP on day: 20130116
channel ORA_DISK_1: looking for AUTOBACKUP on day: 20130115
channel ORA_DISK_1: looking for AUTOBACKUP on day: 20130114
channel ORA_DISK_1: looking for AUTOBACKUP on day: 20130113
channel ORA_DISK_1: looking for AUTOBACKUP on day: 20130112
channel ORA_DISK_1: looking for AUTOBACKUP on day: 20130111
channel ORA_DISK_1: looking for AUTOBACKUP on day: 20130110
channel ORA_DISK_1: looking for AUTOBACKUP on day: 20130109
channel ORA_DISK_1: looking for AUTOBACKUP on day: 20130108
channel ORA_DISK_1: AUTOBACKUP found: c-DBID-20130108-00
channel ORA_DISK_1: restoring control file from AUTOBACKUP c-DBID-00 => fichier déplacé dans le répertoire $ORACLE_HOME/dbs
channel ORA_DISK_1: control file restore from AUTOBACKUP complete
output file name=/apps/oradata01/B/onlinelog/ctl01.ctl
output file name=/apps/oradata02/B/onlinelog/ctl02.ctl
Finished restore at 21-JAN-13
RMAN>alter database mount;
RMAN>restore database;
RMAN>alter database open resetlogs;

On peut aussi avoir besoin de remplacer le SPFILE:
restore spfile to pfile '/xxx/initB.ora' from autobackup maxdays 20;