Dans cet article nous allons voir comment créer un catalogue pour l'utilitaire RMAN. Ce catalogue va héberger les références des fichiers sauvegardés, leurs significations et dates. Ces informations seront également stockées dans le control file de la base de données mais seront très utiles en cas de crash complet ou de corruption de ce control file, il est donc prudent et recommandé d'héberger ce catalogue sur une autre machine (si les bases sont sur des VM, il faudra trouver une autre VM allouée sur un host physique différent).
Les sauvegardes L0 et L1 sont respectivement des sauvegardes complètes et incrémentales, toutes les deux sont des sauvegardes à chaud (base ouverte) elles ne sont possibles que si la base de données est en mode ARCHIVELOG. L'unique sauvegarde à chaud possible en mode NOARCHIVELOG est l'export (datapump de préférence).
Allons-y !
Préparation du Catalogue RMAN
Il faut soit créer une base spécifique pour héberger le catalogue RMAN soit en utiliser une déja existante et créer un utilisateur/schéma pour abriter les objets du catalogue. Cette base devra être sauvegardée autrement que via RMAN (via un export datapump par exemple)
SQL> connect SYSTEM @RMAN Enter password: Connected. SQL> CREATE TABLESPACE RMAN DATAFILE 'RMAN.dbf' SIZE 128M AUTOEXTEND ON NEXT 16M MAXSIZE 1024M LOGGING EXTENT MANAGEMENT LOCAL AUTOALLOCATE SEGMENT SPACE MANAGEMENT AUTO FLASHBACK ON; Tablespace created. SQL> CREATE USER RMAN IDENTIFIED BY RMAN TEMPORARY TABLESPACE TEMP DEFAULT TABLESPACE RMAN QUOTA UNLIMITED ON RMAN; User created. SQL> GRANT RECOVERY_CATALOG_OWNER TO RMAN; Grant succeeded.
On va ensuite initialiser le catalogue en lançant l’utilitaire RMAN en ligne de commande :
[oracle]$ rman catalog RMAN/RMAN@RMAN Recovery Manager: Release 10.2.0.5.0 - Production on Tue Mar 25 11:39:43 2014 Copyright (c) 1982, 2007, Oracle. All rights reserved. connected to recovery catalog database RMAN> CREATE CATALOG; recovery catalog created RMAN>EXIT
On enregistre ensuite la base à sauvegarder dans le catalogue RMAN.
Si la base est une base située sur le serveur (on aura préalablement lancer un oraenv ou positionner les variables ORACLE_HOME et ORACLE_SID)
[oracle]$ rman target=/ catalog RMAN/RMAN@RMAN RMAN> REGISTER DATABASE; database registered in recovery catalog starting full resync of recovery catalog full resync complete
On peut lister les schemas de la base source :
RMAN> REPORT SCHEMA; Report of database schema List of Permanent Datafiles =========================== File Size(MB) Tablespace RB segs Datafile Name ---- -------- -------------------- ------- ------------------------ 1 960 SYSTEM YES /gnx/system/system01.dbf 2 7560 UNDOTBS1 YES /gnx/rbs/undotbs01.dbf 3 4688 SYSAUX NO /gnx/system/sysaux01.dbf 4 8960 DATA_EVE NO /gnx/data/DATA_EVE02.dbf 5 16384 DATA_EVL NO /gnx/data/DATA_EVL2.dbf 6 18512 DATA_EVP NO /gnx/data/DATA_EVP02.dbf 7 10240 DATA_EVR NO /gnx/data/DATA_EVR02.dbf 8 12000 DATA_EVT NO /gnx/data/DATA_EVT02.dbf 9 1500 DATA_EVYD NO /gnx/data/DATA_EVYD02.dbf 10 1500 DATA_EVYE NO /gnx/data/DATA_EVYE02.dbf 11 12388 DATA_GNX NO /gnx/data/DATA_GNX01.dbf 12 1900 DATA_MSK NO /gnx/data/DATA_MSK02.dbf 13 2200 DATA_P_ECR NO /gnx/data/DATA_P_ECR02.dbf 14 1000 DATA_P_LCH NO /gnx/data/DATA_P_LCH02.dbf 15 8448 DATA_PMV NO /gnx/data/DATA_PMV02.dbf 16 5120 IDX_EVE NO /gnx/index/IDX_EVE02.dbf 17 14336 IDX_EVL NO /gnx/index/IDX_EVL02.dbf 18 16748 IDX_EVP NO /gnx/data/IDX_EVP02.dbf 19 8048 IDX_EVR NO /gnx/index/IDX_EVR02.dbf 20 9280 IDX_EVT NO /gnx/index/IDX_EVT02.dbf 21 2432 IDX_EVYD NO /gnx/index/IDX_EVYD02.dbf 22 2048 IDX_EVYE NO /gnx/index/IDX_EVYE02.dbf 23 12364 IDX_GNX NO /gnx/index/IDX_GNX01.dbf 24 3632 IDX_MSK NO /gnx/index/IDX_MSK02.dbf 25 1580 IDX_P_ECR NO /gnx/index/IDX_P_ECR02.dbf 26 1520 IDX_P_LCH NO /gnx/index/IDX_P_LCH02.dbf 27 6700 IDX_PMV NO /gnx/index/IDX_PMV02.dbf List of Temporary Files ======================= File Size(MB) Tablespace Maxsize(MB) Tempfile Name ---- -------- -------------------- ----------- -------------------- 1 16384 TEMP 16384 /gnx/temp/temp01.dbf
On regarde la configuration de RMAN et on ajuste en fonction des besoins :
RMAN> show all; RMAN configuration parameters are: CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 14 DAYS; CONFIGURE BACKUP OPTIMIZATION ON; CONFIGURE DEFAULT DEVICE TYPE TO DISK; CONFIGURE CONTROLFILE AUTOBACKUP ON; CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '/rman/AUTOBKP_CONTROL_%F'; CONFIGURE DEVICE TYPE DISK PARALLELISM 1 BACKUP TYPE TO BACKUPSET; # default CONFIGURE DATAFILE BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default CONFIGURE ARCHIVELOG BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default CONFIGURE MAXSETSIZE TO UNLIMITED; # default CONFIGURE ENCRYPTION FOR DATABASE OFF; # default CONFIGURE ENCRYPTION ALGORITHM 'AES128'; # default CONFIGURE ARCHIVELOG DELETION POLICY TO NONE; # default CONFIGURE SNAPSHOT CONTROLFILE NAME TO '/oracle/10.2.0/dbs/snapcf_GNX.f'; # default
RMAN> CONFIGURE DEVICE TYPE DISK BACKUP TYPE TO COMPRESSED BACKUPSET PARALLELISM 4; new RMAN configuration parameters: CONFIGURE DEVICE TYPE DISK BACKUP TYPE TO COMPRESSED BACKUPSET PARALLELISM 4; new RMAN configuration parameters are successfully stored starting full resync of recovery catalog full resync complete RMAN> CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '/backup/rman/GNX_AUTOBKP_CONTROL_%F'; old RMAN configuration parameters: CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '/rman/AUTOBKP_CONTROL_%F'; new RMAN configuration parameters: CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '/backup/rman/GNX_AUTOBKP_CONTROL_%F'; new RMAN configuration parameters are successfully stored starting full resync of recovery catalog full resync complete RMAN> CONFIGURE SNAPSHOT CONTROLFILE NAME TO '/backup/rman/GNX_SNAPSHOT_CONTROL.ORA'; snapshot control file name set to: /backup/rman/GNX_SNAPSHOT_CONTROL.ORA new RMAN configuration parameters are successfully stored RMAN> CONFIGURE CHANNEL DEVICE TYPE DISK FORMAT '/backup/rman/%U'; new RMAN configuration parameters: CONFIGURE CHANNEL DEVICE TYPE DISK FORMAT '/backup/rman/%U'; new RMAN configuration parameters are successfully stored starting full resync of recovery catalog full resync complete RMAN> show all; RMAN configuration parameters are: CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 14 DAYS; CONFIGURE BACKUP OPTIMIZATION ON; CONFIGURE DEFAULT DEVICE TYPE TO DISK; CONFIGURE CONTROLFILE AUTOBACKUP ON; CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '/backup/rman/GNX_AUTOBKP_CONTROL_%F'; CONFIGURE DEVICE TYPE DISK BACKUP TYPE TO COMPRESSED BACKUPSET PARALLELISM 4; CONFIGURE DATAFILE BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default CONFIGURE ARCHIVELOG BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default CONFIGURE CHANNEL DEVICE TYPE DISK FORMAT '/backup/rman/%U'; CONFIGURE MAXSETSIZE TO UNLIMITED; # default CONFIGURE ENCRYPTION FOR DATABASE OFF; # default CONFIGURE ENCRYPTION ALGORITHM 'AES128'; # default CONFIGURE ARCHIVELOG DELETION POLICY TO NONE; # default CONFIGURE SNAPSHOT CONTROLFILE NAME TO '/backup/rman/GNX_SNAPSHOT_CONTROL.ORA';
Scripts de sauvegarde
Sauvegarde de Niveau L0
On va créer un script de sauvegarde socle pour les sauvegardes incrémentales de niveau supérieur. La sauvegarde L0 sera lancée chaque semaine le dimanche à 22h. Il effectuera la sauvegarde L0 ainsi qu’une purge des anciennes sauvegardes obsolètes (selon la configuration de la rétention de RMAN).
Pour cette purge, il faut bien comprendre la notion de rétention. Lorsqu’on dit à RMAN d’avoir une rétention de 14 jours, cela ne signifie pas qu’il ne va conserver que les fichiers plus récents que 14 jours mais qu’il pourra revenir à J-14. Ainsi il pourra conserver des sauvegardes L0 et L1 nécessaires pour revenir à cette date. D’où l’importance de faire des L0 à intervalle régulier car sans cela RMAN ne pourra pas purger les sauvegardes de niveau L1.
Le script /oracle/admin/scripts/rman/RMAN_BCK_L0_GNX.sh
#!/bin/bash export SHELL=/bin/bash; export PATH=/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/usr/NX/bin:/oracle/11.2.0/db_home1/bin; export ORACLE_SID=GNX export ORACLE_HOME=/oracle/11.2.0/db_home1 echo "======================================================" echo "- Starting RMAN_HB_L0_backup.sh -" echo "======================================================" echo . echo "==== Archiving current redolog" date echo . rman TARGET=/ CATALOG RMAN/RMAN@RMAN<<EOF run { SQL 'ALTER SYSTEM ARCHIVE LOG CURRENT'; } EXIT; EOF echo . echo "==== Starting Level 0 Backup" date echo . rman TARGET=/ CATALOG RMAN/RMAN@RMAN<<EOF run { ALLOCATE CHANNEL D1 TYPE DISK FORMAT '/backup/rman/GNX_RMAN_BCK_L0_%d_%u_%s_%p'; BACKUP INCREMENTAL LEVEL 0 DATABASE PLUS ARCHIVELOG TAG 'GNX_DB_ARC_INC_L0'; #report obsolete; DELETE NOPROMPT OBSOLETE; DELETE NOPROMPT EXPIRED BACKUP; } EXIT; EOF echo . echo "==== End of Level 0 Database Backup tag GNX_INC_L0" date echo .
Sauvegarde de niveau L1
Le sauvegardes de niveau L1 vont sauvegarder uniquement les données ayant été modifiées depuis la dernière sauvegarde de niveau égal ou inférieur (L1 ou L0 donc)
Le script suivant effectue une sauvegarde de niveau L1 et des archivelog suivi d’une purge des archive et des sauvegardes obsolètes
script /oracle/admin/scripts/rman/RMAN_BCK_L1_GNX.sh
#!/bin/bash export SHELL=/bin/bash; export PATH=/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/usr/NX/bin:/oracle/11.2.0/db_home1/bin; export ORACLE_SID=GNX export ORACLE_HOME=/oracle/11.2.0/db_home1 echo "======================================================" echo "- Starting RMAN_HB_L1_backup.sh -" echo "======================================================" echo . echo "==== Archiving current redolog" date echo . rman TARGET=/ CATALOG RMAN/RMAN@RMAN<<EOF run { SQL 'ALTER SYSTEM ARCHIVE LOG CURRENT'; } EXIT; EOF echo . echo "==== Starting Level 1 Backup" date echo . rman TARGET=/ CATALOG RMAN/RMAN@RMAN<<EOF run { ALLOCATE CHANNEL D1 TYPE DISK FORMAT '/backup/rman/GNX_RMAN_BCK_L1_%d_%u_%s_%p'; BACKUP INCREMENTAL LEVEL 1 DATABASE TAG 'GNX_DB_INC_L1'; BACKUP ARCHIVELOG ALL DELETE ALL INPUT; #REPORT OBSOLETE; DELETE NOPROMPT OBSOLETE; DELETE NOPROMPT EXPIRED BACKUP; #RELEASE CHANNEL D1; } EXIT; EOF echo . echo "==== End of Level 1 Database Backup tag GNX_DB_INC_L1" date echo .
Automatisation des sauvegardes
Il faut ensuite automatiser le lancement de ces scripts. Le cron est une solution simple, une autre solution serait de lancer ces scripts avec Nagios par exemple. La surveillance des backups peut être fait avec Nagios et un plugin SQL en interrogeant les tables V_$RMAN_xxx
La crontab
45 23 * * 7 /oracle/11.2.0/admin/scripts/rman/RMAN_BCK_L0_GNX.sh 1>> /oracle/11.2.0/admin/log/rman/RMAN_BCK_L0_GNX.res 2>> /oracle/11.2.0/admin/log/rman/RMAN_BCK_L0_GNX.err 0 0-21/4 * * 1-6 /oracle/11.2.0/admin/scripts/rman/RMAN_BCK_L1_GNX.sh 1>> /oracle/11.2.0/admin/log/rman/RMAN_BCK_L1_GNX.res 2>> /oracle/11.2.0/admin/log/rman/RMAN_BCK_L1_GNX.err
Activation du BCT (Block Change Tracking) pour accélérer les sauvegardes L1
Oracle est capable de suivre les blocs de données ayant changer entre deux sauvegardes évitant à RMAN le balayage de toutes les données lors des sauvegardes L1 ou supérieur.
Pour cela lancer la commande suivante en tant que DBA :
ALTER DATABASE ENABLE BLOCK CHANGE TRACKING USING FILE '/oracle/bct/bctf01.log';