![]() |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
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 :
ALTER TABLESPACE nom_tablespace BEGIN BACKUP; Pour chaque fichier l’y constituant Le sauvegarder ALTER TABLESPACE nom_tablespace END BACKUP;
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
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||