################################################################ # Backup_RMAN_script.txt - 21.05.2003 - S.Koller # Oracle9i R2 # Doc. officielle d'Oracle $ORACLE_HOME/rdbms/demo/case1.rcv # # IMPORTANT: Pour chaque base, prendre le DBID et l'incorporer # dans le fichier 'rman_restore_recovery' # >select dbid, name from v$database; # Il faut également modifier le paramètre # d'initialisation CONTROL_FILE_RECORD_KEEP_TIME. # Ce paramètre spécifie combien de temps on veut # garder les backups des controlfiles: # >alter system set CONTROL_FILE_RECORD_KEEP_TIME=21 scope=both; # -------------------------------------------------------------- # Infos: le signe '?' représente l'ORACLE_HOME et le '@' # représente l'ORACLE_SID ################################################################# Liste des fichiers (à configurer pour chaque base): Nom fichier Exécution ----------- --------- - rman_conf (1x) - rman_bck_onceday (1x par semaine) - rman_bck_everyday (6x par semaine) - rman_valid_restore (1x par semaine) - rman_maintenance (1x par semaine) - rman_restore_recovery (seulement si crash) Pour exécuter l'un des fichiers ci-dessus (SAUF rman_restore_recovery !), procéder avec la commande (il faut setter les variables avant!): >rman target / cmdfile nom_script ou mieux... utiliser le script 'rman_connect.sh' (variables inclusent): >./rman_connect SID nom_script !!Si il y a un crash, voir Restore_checklist_RMAN.txt!! -------------------------------------------------------------------- RMAN>SHOW ALL -> permet de voir la configuration courrante de RMAN -------------------------------------------------------------------- ======================== Description des fichiers ======================== rman_conf ========= C'est un fichier de configuration. Permet entre autre: - de configurer le nombre de backup pour chaque datafile. - le nombre de processus serveur qui s'occupe des opérations de backup/restore en parallèle. - le répertoire de destination du backup. Une fois le script exécuté, les paramètres sont stockés de manière permanente pour tous les backup/restore/recovery/maintenance. # Indique que les backups seront écrit sur disque. CONFIGURE DEFAULT DEVICE TYPE TO DISK; # Indique qu'il faut garder au moins 5 backups de chaque datafile. # Si on désire garder certain backups plus longtemps que # "retention policy" (voir plus bas), il faut utiliser l'option KEEP avec # la commande BACKUP lors de la création des backups. #CONFIGURE RETENTION POLICY TO REDUNDANCY 5; # Configure RMAN pour utiliser 2 "disk channel" pour les opérations de # backup, restore, recovery, et maintenance . CONFIGURE DEVICE TYPE DISK PARALLELISM 2; # Configure RMAN pour écrire les backups sur disque dans le répertoire /backup. # The format specifier %t is replaced with a 4-byte timestamp, %s with the # backup set number, and %p with the backup piece number. CONFIGURE CHANNEL DEVICE TYPE DISK FORMAT '/RAID0/orasauve/@/ora_df%t_s%s_s%p'; # Indique à RMAN de backuper le control file et le spfile après chaque backup. CONFIGURE CONTROLFILE AUTOBACKUP ON; # Configure RMAN pour qu'il écrive le backup du controlfile dans un répertoire. CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '/RAID0/orasauve/@/ora_cf%F'; # Permet d'exclure certains tablespaces du backup (pas utilisé dans notre cas). # L'instruction NOEXCLUDE permet d'écraser cette configuration. #CONFIGURE EXCLUDE FOR TABLESPACE tbl_exclude; rman_bck_onceweek ================= C'est un fichier qui est exécuté une fois par semaine (le même jour). Comme la base de données est en mode NOARCHIVELOG, on peut seulement faire un backup: - quand la base de données est fermée correctement (immediate) et qu'elle soit ensuite montée (mount). - quand les tablespaces qui sont offline ou en read only. Dans notre cas, nous désirons un full backup chaque semaine, avec un backup incrémentale chaque jour. Le cycle démarre par exemple le mercredi (à mettre dans le crontab). Le paramètre REDUNDANCY (voir rman_conf) indique à RMAN de faire 5 backups full (non pas incrémentale). Ceci permet de revenir en arrière de 5 semaines. STARTUP FORCE DBA; SHUTDOWN IMMEDIATE; STARTUP MOUNT; BACKUP INCREMENTAL LEVEL 0 DATABASE; ALTER DATABASE OPEN; Si le backup ci-dessus échoue pour une raison ou une autre, on peut utiliser l'option NOT BACKED UP SINCE avec la commande BACKUP pour continuer à partir de ce point. # Pour re-démarrer à partir du point d'échec, exécuter la commande: #BACKUP INCREMENTAL LEVEL 0 DATABASE FILESPERSET 4 # NOT BACKED UP SINCE TIME 'SYSDATE-1'; #ALTER DATABASE OPEN; ================= rman_bck_everyday ================= Ce script peut être exécuté le reste de la semaine afin d'avoir les backups incrémentaux. C'est la même commande qu'auparavant, sauf qu'il faut spécifier LEVEL 1 CUMULATIVE. Ceci indique que seulement les blocks qui ont été modifiés à partir du dernier backup (level 0) seront backupés. Si l'option CUMULATIVE était pas spécifiée, alors seulement les blocks modifiés à partir du dernier backup (level 1) seraient backupés. L'avantage d'un backup "CUMULATIVE", c'est qu'il faut seulement UN backup incrémentale durant le recovery. STARTUP FORCE DBA; SHUTDOWN IMMEDIATE; STARTUP MOUNT; BACKUP INCREMENTAL LEVEL 1 CUMULATIVE DATABASE; ALTER DATABASE OPEN; # Backups de tablespaces en readonly (pas utilisé) # ---------------------------------------------------- # La base de données n'a pas besoin d'être arrêtée (closed) pour backuper # des tablespace en read only. On peut utiliser la commande suivante: #BACKUP TABLESPACE read_only_tablespace_name; rman_valid_restore ================== Ce script peut être exécuté n'importe quand afin de contrôler si RMAN est capable de faire un restore de la base de données/tablespace en utilisant un backup existant. RESTORE DATABASE VALIDATE; #RESTORE TABLESPACE read_only_tablespace_name VALIDATE; rman_maintenance ================ C'est un script de maintenance. Par exemple: # Vérifier que tous les backups sur les médias sont bons. CROSSCHECK BACKUP OF DATABASE; # Affiche une liste des fichiers qui ont besoin d'être backupés par rapport # au paramètre RETENTION POLICY TO REDUNDANCY 5. Ce qui signifie que les # fichiers qui n'ont pas au moins 5 backups seront affichés. REPORT NEED BACKUP; # Supprime les backups qui ne sont pas nécessaires. Cette commande est basée # sur le paramètre RETENTION POLICY TO REDUNDANCY 5, c'est-à-dire que les # backups vieux de plus de 5 semaines seront supprimés. DELETE OBSOLETE; # Pour supprimer un backup spécifique, faire un #LIST BACKUP; #DELETE BACKUPPIECE numero_BP; # Pour avoir la liste complète des backups existant LIST BACKUP SUMMARY; rman_restore_recovery ===================== C'est un script permettant de faire un complete recovery. Néanmoins, avec l'option SET UNTIL, il est possible de faire un recovery jusqu'à un certain point dans le temps grâce aux backups incrémentaux. Comme la base de données n'est pas en mode ARCHIVELOG, on peut seulement faire un recover à partir d'un backup full ou incrémentale. Pour cela il faut impérativement tous les fichiers de configurations: spfile, tnsnames.ora, et listener.ora à leurs places respectives. Ensuite on peut démarrer la base de données en NOMOUNT et se connecter avec RMAN sur la cible (target). Lors de backup en mode NOCATALOG, il faut impérativement sauvegarder le DBID de la base de données. Pour cela, on peut se connecter avec RMAN comme ceci: >connect target / RMAN>connected to target database: INVENTORY (DBID=1670954628) ou: >sqlplus "/ as sysdba" SQL>select dbid, name from v$database; Si on utilise pas de recovery catalog, il faut démarrer RMAN sans l'option TARGET et 'seter' le DBID avant de restorer le controlfile de l'autobackup. SET DBID ; CONNECT TARGET /; STARTUP NOMOUNT; RUN { SET CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '/RAID0/orasauve/@/ora_cf%F'; RESTORE CONTROLFILE FROM '/RAID0/orasauve/@/nom_backup_controlfile'; ALTER DATABASE MOUNT; # SET UNTIL TIME 'SYSDATE-3'; RESTORE DATABASE CHECK READONLY; RECOVER DATABASE NOREDO; ALTER DATABASE OPEN RESETLOGS; } ---------------------------rman_connect.sh--------------------------- #! /bin/bash # ----------------------------------------------------- # exécute une commande RMAN avec deux paramètres # ($1=ORACLE_SID et $2=script) # S.Koller 29.04.2003 # # ----------------------------------------------------- # Déclaration variables OS export MAILX="/usr/bin/mailx" export MAIL_LIST="sebastien.koller@cpln.ch" # Pour leto #MAILTO=sebastien.koller@cpln.ch # Déclaration des variables d'environnement Oracle ORACLE_SID=$1; export ORACLE_SID ORACLE_BASE=/RAID0/app/oracle; export ORACLE_BASE ORACLE_HOME=$ORACLE_BASE/product/EE920; export ORACLE_HOME PATH=$ORACLE_HOME/bin:/usr/bin:/bin:/usr/local/bin:$PATH; export PATH TNS_ADMIN=$ORACLE_HOME/network/admin; export TNS_ADMIN NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P15; export NLS_LANG NLS_DATE_FORMAT='DD-MM-YYYY:HH24:MI:SS'; export NLS_DATE_FORMAT echo "**********************************" echo "ORACLE_HOME="$ORACLE_HOME echo "ORACLE_SID="$ORACLE_SID echo "Script="$2 echo "*********************************" rman nocatalog log=/tmp/connect$1.log target / cmdfile $2 #rman nocatalog target / cmdfile $2 # Test for success RMAN opreration if [ $? -ne 0 ]; then $MAILX -s "Probleme avec RMAN sur l'instance $ORACLE_SID" \ $MAIL_LIST <