!
!
!
!
!
!
!
!

DBA

Sauvegarde partielle base ouverte (HOT BACKUP)

Sauvegardes avec les tablespaces et les fichiers de données en ligne. Les données ainsi sauvegardées ne sont pas cohérentes au moment de la sauvegarde. Cela ne signifie pas que la sauvegarde soit inutilisable, mais que la cohérence ne sera garantie lors de la restauration, qu'avec l'intervention des fichiers journaux. Il faut préalablement exécuter la commande ALTER TABLESPACE ... BEGIN BACKUP, pour informer ORACLE de ne plus mettre à jour les en-têtes des fichiers à sauvegarder, lors des points de validation. Toutes les modifications apportées aux données de ces fichiers sont enregistrées dans les fichiers journaux.. Lors d'une restauration, ORACLE retrouvera et appliquera TOUTES les transactions effectuées depuis le dernier point de validation, qui a eu lieu AVANT la sauvegarde.
Les sauvegardes base ouverte sont dites partielles par ce que les différents fichiers sont sauvegardés dans un état incohérent. Elles nécessitent l’utilisation des instructions “ALTER TABLESPACE nom_tablespace BEGIN BACKUP” et “ALTER TABLESPACE nom_tablespace END BACKUP” qui permettent à Oracle d’assurer la cohérence des fichiers en cas de restauration.
Les fichiers de données de chaque espace de stockage sont sauvegardés à une fréquence à déterminer en fonction du temps maximum de restauration désiré en cas d’incident. Dans le cas le plus simple, on sauvegarde tous les espaces de stockage à chaque sauvegarde. Une sauvegarde partielle se déroule de la façon suivante :
  • Pour chacun des tablespaces
ALTER TABLESPACE  nom_tablespace BEGIN BACKUP;
	Pour chaque fichier l’y constituant
Le sauvegarder
ALTER TABLESPACE nom_tablespace END BACKUP;
  • Sous Oracle, avec un compte ayant le privilège ALTER DATABASE, sauvegarder le fichier de contrôle :
  • ALTER DATABASE BACKUP CONTROLFILE TO ‘nom_du_fichier’;
    ou
    ALTER DATABASE BACKUP CONTROLFILE TO TRACE NORESETLOGS;
    
    Figure 1 Étapes du backup à chaud
    Quand on a choisi l’archivage, il faut s’occuper avec le même soin que la base des fichiers redo archivés, ll faut les sauvegarder. Si ceux-ci sont dirigés sur un disque, ce dernier ne doit comprendre aucun fichier de données ni aucun fichier journal en ligne (sauf s’ils sont multiplexés). Dans ce cas, la probabilité de perdre à la fois un fichier de données et les fichiers journaux archivés nécessaires à sa restauration deviennent très minces.
    Dans le cas où on choisit de diriger l’archivage sur bande, il faut prévoir de dupliquer les bandes. Au cours du processus de duplication, si on s’aperçoit qu’une bande est en partie ou totalement illisible, il est prudent de procéder à une nouvelle sauvegarde de l’ensemble des espaces de stockage.

    Quand le tablespace est en BEGIN BACKUP, la première modification d’une ligne dans bloc déterminera l’écriture de tout son contenu dans le redo log (et non une information concernant les modifications uniquement). Les mises à jours ultérieures provoquent des écritures standard. Et ceci jusqu'à l’écriture du bloc modifié sur disque (checkpoint, end backup, etc.). Dans cet état, il est souhaitable qu’il n’y ait pas une activité débordante du tablespace considéré. Ceci induit aussi la nécessité de ne pas démarrer un hot backup avec tous les tablespaces en mode BEGIN BACKUP, mais faire les copies une après l’autre en ayant un seul tablespace en BEGIN BACKUP à la fois.
    Au début d’un hot backup, les SCN mis lors du checkpoint provoqué par BEGIN BACKUP est conservé et les en-têtes des fichiers constituant le tablespace contient une information de hot backup. (A partir de 8i, cette information est trouvable dans v$backup).

    Pourquoi écrire des blocs entiers dans les redo logs ? Pour calibrer une éventuelle image floue d’un bloc. Lors de la copie du fichier, l’OS lira les données en unités de blocs OS dont les blocs Oracle sont des multiples. Pendant la restauration, la manière dont les blocs sont lues risque de ne pas être celle qu’Oracle attend. Pour éviter ce genre de confusion, Oracle répertorie des blocs entiers dans les redo logs. Le paramètre (non documenté) _LOG_BLOCKS_DURING_BACKUP = TRUE permet de ne pas répertorier des blocs entiers dans les redo dans le cas d’égalité entre la taille du bloc Oracle et le bloc OS.
    Pour faire un backup à chaud d’un fichier READ ONLY, le copier simplement; nous ne pouvons pas débuter un begin backup, nous obtiendrons l’erreur: ORA-1642 signalled during: ALTER TABLESPACE .. BEGIN BACKUP..
    Les tablespaces temporaires de type ‘locally managed’ ne sont pas inclues dans les hot backups. Veillons à les appliquer un autre traitement de sauvegarde, à moins qu’on ne préfère les récréer.

    Il est essentiel de vérifier la non apparition d’un nouveau tablespace pendant le processus de backup. Supposons le scénario suivant : à 12 :00 nous prenons la liste des fichiers à sauvegarder en ligne et nous commençons le processus de copie qui devrait finir vers 17 :00. A 15 :00 nous ajoutons un tablespace ou même nous allouons un fichier à un autre . Si la catastrophe intervient à 16 :00, les opérations de RECOVERY sont alourdies par le fait que une copie du fichier n’existe pas pour être recouverte. Voir cas ??? dans le chapitre restauration. Script générateur des commandes pour le hot backup
    /*
    || hotback_cre.sql
    || Creation des scripts SQL pour le hot backup, et du .cmd utilisé pour 
    || récuperer les fichiers. La procedure renomme les fichiers copies pour éviter
    || les conflits de noms (2 fichiers, même nom, différents répertoires. 
    || Radu, 2000)
    /*
    set serveroutput on
    set line 1000
    spool lis/hotbackup_lance.sql
    DECLARE 
      /* 
      || les fichiers qui constituent un tablespace 
      || l'embelir pour chercher uniquement les fichiers  
      || qui ne sont pas offline
      */
      CURSOR filespertablespace (le_tablespace VARCHAR2) IS
      select file_name from sys.dba_data_files 
      where tablespace_name = le_tablespace;
      /* 
      || les tablespaces du systeme
      || l'embellir pour chercher uniquement les tablespaces 
      || qui ne sont pas en read only (c.a.d. read write
      */
      CURSOR les_tablespaces IS
        select tablespace_name from sys.dba_tablespaces;
      commande_copie varchar2(1000):= ' copy ';
      destination varchar2(1000):= ' h:\hot_bck_idba\';
      
    BEGIN
      /* boucle pour chaque tablespace */
      FOR un_tablespace IN les_tablespaces LOOP
         /* boucle pour chaque datafile */
         dbms_output.put_line( 'ALTER TABLESPACE '|| 
         		un_tablespace.tablespace_name || ' BEGIN BACKUP;' );
         FOR unfichier In filespertablespace(un_tablespace.tablespace_name) LOOP
          	dbms_output.put_line( commande_copie || ltrim(unfichier.file_name)
          		|| destination || translate(unfichier.file_name,':/\','@[]'));
         END LOOP;  /* fichiers per tablespace */
         dbms_output.put_line( 'ALTER TABLESPACE '|| 
         		un_tablespace.tablespace_name || ' END BACKUP;' );
       END LOOP; /* tablespaces per systeme */
    END;
    /
    spool off
                           
    spool lis/hotbackup_recover.cmd
    DECLARE 
      CURSOR filespertablespace (le_tablespace VARCHAR2) IS
      select file_name from sys.dba_data_files 
      where tablespace_name = le_tablespace;
      CURSOR les_tablespaces IS
        select tablespace_name from sys.dba_tablespaces;
      commande_copie varchar2(1000):= ' copy ';
      destination varchar2(1000):= ' h:\hot_bck_idba\';
    BEGIN
      /* boucle pour chaque tablespace */
      FOR un_tablespace IN les_tablespaces LOOP
         dbms_output.put_line( ':: Tablespace ' || un_tablespace.tablespace_name); 
         /* boucle pour chaque datafile */
         FOR unfichier In filespertablespace(un_tablespace.tablespace_name) LOOP
          	dbms_output.put_line( '-- ' || commande_copie || destination || 
          	       translate(unfichier.file_name,':/\','@[]')   || ' ' || 
          	       unfichier.file_name);
         END LOOP;  /* fichiers per tablespace */
       END LOOP; /* tablespaces per systeme */
    END;
    /
    exit;
    
    Code 1 Script générateur des fichiers de commande pour le Hot Backup
    Le script de création du fichier de commandes qui recopie les fichiers est à lancer immédiatement après celui qui génère le hot backup !

    Est-il nécessaire de faire un backup full (à froid) d’une base en ARCHIVELOG chaque semaine ?
    Le seul réel avantage d’un full backup réside dans le fait qu’en faisant un SHUTDOWN de l’instance, nous libérons la mémoire, nous tuons les procès fantômes, etc. Certaines versions d’Oracle nécessitaient un cold backup pour RECOVERY. En réalité, la fréquence des backups à froid est dictée par les besoins de la boite. En fait, de mon point de vue, un cold backup limite les possibilités de restauration et nécessite une attention particulière lors de celle-ci : une restauration à froid effectuée d’une manière incorrecte peut n’en être pas une. Les fichiers copiés d’un backup d’hier n’ont pas besoin de restauration : ils sont en bon état !
    Le hot backup – toute une stratégie
    Une stratégie pour les hot backups est nécessaire. De notre point de vue, il constitue la seule réelle option de sauvegarde, même en environnement gigantesque, qui permet de sauvegarder en ligne, donc nécessaire en environnement 24/7. La figure ci-contre montre la stratégie de sauvegarde cyclique des fichiers qui constituent la base de données.
    Dans notre cas, quatre fichiers constituent la base. Pour sa tranquillité le DBA a effectué avant t0 un backup a froid. N’oublions pas qu’il emploie l’archivage (automatique, bien sur). Ce moment peut bien avoir eu lieu il y a un an. Le DBA sauvegarde pendant une période préétablie (dT) la totalité de ses fichiers. Ce processus se réitérera régulièrement. A la fin de chaque période tn, il disposera de plusieurs jeux de copies des fichiers (celles effectués à tn-2,tn-1, etc.) Pourquoi cyclique ? Bien évidement, lors d’une catastrophe, le DBA remplacera le fichier (ou les fichiers) endommagé par leurs plus récentes copies et il va rejouer les archives. Si les copies ne sont pas très récentes, il devra rejouer TROP d’archives, donc la restauration risque de durer longtemps. Comment calculer l’intervalle idéal de répétition de sauvegarde des fichiers ? Le DBA s’est imposé un delta T maximal de restauration. Nous pouvons aisément estimer le nombre maximum de redologs à lire dans l’intervalle spécifie. Bien sur, dans les estimations nous allons prendre en compte les périodes chargées de la journée. En fonction du nombre de redologs ainsi obtenus, nous connaîtrons l’intervalle de temps de répétition de sauvegarde en déterminant le nombre maximum d’archives lisibles dans l’intervalle spécifie. (en faisant des exercices, bien sur). Une fois cette stratégie déterminée, il devra s’affranchir des copies inutiles (trop vétustes). Un élément à prendre en considération, le nombre minimal mais suffisant de copies et archives à garder sur les disques. Lors d’une restauration qui nécessite des restaurations des fichiers sur bandes, le temps de restauration s’allonge. Lors du choix du backup full à froid, la complexité de gestion des cartouches s’accroît, les options de restauration risquent de s’alourdir.
    http://www.tafora.fr/bin/img/hotbackup.gif

    Création du script de copie des fichiers utilisable lors du recover

    Copyright © 1998-2002 Radu Caulea, TAFORA MAJ 06/11/2006 !
    Commentaires et suggestions radu[CHEZ]tafora.fr