Oracle 8i - Sauvegarde à chaud en mode archivelog

Logo

Introduction

Cette documentation se propose de présenter techniquement la sauvegarde à chaud d’une base de données Oracle.

Pour pouvoir sauvegarder à chaud une base de données Oracle, le mode archivelog doit être activé, ce mode est un prérequis indispensable.

Dans l’exemple pratique de cette documentation, la base de données OEM de l’instance OEMD1ORA est sauvegardée à chaud et le mode archivelog est actif. L’instance OEMD1ORA contient 6 fichiers de données et 5 tablespaces : SYSTEM, RBS, TEMP, USERS et INDX.

Instance OEMD1ORA - Fichiers de données

Mode archivelog d’une instance Oracle

Ce paragraphe présente brièvement quelques informations sur le mode archivelog qui est indispensable pour pouvoir faire une sauvegarde à chaud d’une instance Oracle.

Vérification du mode archivelog d’une instance Oracle

La commande archive log list indique si une instance est en mode archivelog :

archive log list;
Database log mode              Archive Mode
Automatic archival             Enabled
Archive destination            /cgcdb/oracle/OEMD1ORA/archivelog
Oldest online log sequence     1511

Les deux sections qui nous intéressent sont les sections 'Database log mode' , 'Automatic archival'.

  • Si la section 'Database log mode' vaut No Archive Mode, la base de données n’est pas en mode archivelog et la sauvegarde à chaud ne peut être réalisée. Lorsque la base est en mode archivelog, la section 'Database log mode' vaut Archive Mode.
  • La section 'Automatic Archival' indique si l’archivage automatique des redo log est activé (Disabled ou Enabled). Lorsque l’archivage automatique est activé (LOG_ARCHIVE_START=TRUE dans le fichier d’initialisation de l’instance), lorsqu’un fichier de redo log est complet, celui-ci est archivé dans le répertoire de destination par un process Oracle ARCx.

Mise en mode archivelog d’une instance Oracle

Pour mettre une base de données en mode archivelog avec archivage automatique, la commande ALTER DATABASE ARCHIVELOG est mise en œuvre et quelques paramètres d’initialisation de l’instance sont modifiés. Dans tous les cas de figure, un redémarrage de l’instance est nécessaire.

Étape 1 : l’instance est stoppée

shutdown immediate;

Étape 2 : les paramètres d’initialisation LOG_ARCHIVE_START, LOG_ARCHIVE_DEST (et éventuellement LOG_ARCHIVE_DUPLEX_DEST) sont mis à jour.

Pour activer l’archivage automatique des fichiers de redo log :

LOG_ARCHIVE_START=TRUE

(il est possible de ne pas autoriser l’archivage automatique, mais dans ce cas lorsque tous les fichiers de redo log sont complets et non archivés, l’instance est gelée jusqu’à ce qu’un archivage manuel des fichiers de redo log soit réalisé avec la commande alter system archive log all).

Le paramètre LOG_ARCHIVE_DEST spécifie le répertoire de destination en local des archives des fichiers de redo log :

LOG_ARCHIVE_DEST=/cgcdb/oracle/OEMD1ORA/archivelog

Étape 3 : Mise en mode archivelog de la base de données, cette dernière ne devant pas être ouverte durant la mise en mode archivelog. À l’issue de la mise en mode archivelog, la base de données peut alors être ouverte.

startup mount;
alter database archivelog;
alter database open;

Sauvegarde à chaud d’une base de données

La sauvegarde d’une base de données à chaud comporte 3 étapes :

  • sauvegarde du fichier de contrôle
  • sauvegarde des fichiers de données
  • sauvegarde des redo logs archivés pour le recovery.

Les vues V$BACKUP et V$ARCHIVED_LOG seront d’une utilité toute particulière au cours de l’opération de sauvegarde.

Sauvegarde du fichier de contrôle

Dans un premier temps, le fichier de contrôle est sauvegardé avec la commande alter database backup controlfile

Syntaxe :

alter database backup controlfile to '<path_to_filename>'

Exemple :

alter database backup controlfile to '/cgcdb/oracle/OEMD1ORA/export/control.ctl'

Sauvegarde des tablespaces et fichiers de données

Avant de démarrer la sauvegarde des fichiers de données, aucune sauvegarde ne doit être en cours et c’est la vue V$BACKUP qui donne cette information.

desc V$BACKUP;

FILE#    NUMBER
STATUS   VARCHAR2(18)
CHANGE#  NUMBER
TIME     DATE

FILE# est le numéro de fichier de données, information à recouper avec la vue V$DATAFILE.

Pour être sur que tous les fichiers de données ne sont pas en mode sauvegarde, la colonne STATUS doit avoir la valeur NOT ACTIVE pour tous les fichiers de données.

select a.file#, a.status, a.change#, to_char(a.time,'dd/mm/yyyy hh24:mi:ss'), b.name
 from V$backup a, v$datafile b
 where a.file# = b.file#;
1     NOT ACTIVE      764264      11/02/2005 13:20:19      /cgcdb/oracle/OEMD1ORA/SYSTEM_01.DBF
2     NOT ACTIVE      764265      11/02/2005 13:20:25      /cgcdb/oracle/OEMD1ORA/RBS_01.DBF
3     NOT ACTIVE      764267      11/02/2005 13:20:35      /cgcdb/oracle/OEMD1ORA/USERS_01.DBF
4     NOT ACTIVE      764266      11/02/2005 13:20:29      /cgcdb/oracle/OEMD1ORA/TEMP_01.DBF
5     NOT ACTIVE      764267      11/02/2005 13:20:35      /cgcdb/oracle/OEMD1ORA/USERS_02.DBF
6     NOT ACTIVE      764268      11/02/2005 13:20:41      /cgcdb/oracle/OEMD1ORA/INDX_01.DBF

Mise en mode begin backup des tablespaces

Pour démarrer la sauvegarde des fichiers de données, les tablespaces doivent être mis en mode begin backup:

Syntaxe :

alter tablespace <tablespace_name> begin backup ;

Pour générer dynamiquement les syntaxes begin backup :

set heading off ;
set feedback off;
set linesize 1000;
set pagesize 200;

spool begin_backup.sql

select 'alter tablespace '||tablespace_name||' begin backup;'
from dba_tablespaces;

Le fichier begin_backup.sql généré contient alors les commandes ci-dessous :

begin_backup.sql
alter tablespace SYSTEM begin backup;
alter tablespace RBS begin backup;
alter tablespace TEMP begin backup;
alter tablespace USERS begin backup;
alter tablespace INDX begin backup;

et il ne reste plus qu’à exécuter le script begin_backup.sql en question :

sqlplus "/ as sysdba"

@begin_backup.sql;
exit

À l’issue de la mise en mode begin backup des tablespaces, la colonne STATUS de la vue V$BACKUP passe à l’état ACTIVE pour tous les fichiers de données et il est nécessaire de s’en assurer :

select a.file#, a.status, a.change#, to_char(a.time,'dd/mm/yyyy hh24:mi:ss'), b.name
  from V$backup a, v$datafile b
  where a.file# = b.file#;
1      ACTIVE      764326      11/02/2005 15:01:13      /cgcdb/oracle/OEMD1ORA/SYSTEM_01.DBF
2      ACTIVE      764327      11/02/2005 15:01:19      /cgcdb/oracle/OEMD1ORA/RBS_01.DBF
3      ACTIVE      764329      11/02/2005 15:01:27      /cgcdb/oracle/OEMD1ORA/USERS_01.DBF
4      ACTIVE      764328      11/02/2005 15:01:22      /cgcdb/oracle/OEMD1ORA/TEMP_01.DBF
5      ACTIVE      764329      11/02/2005 15:01:27      /cgcdb/oracle/OEMD1ORA/USERS_02.DBF
6      ACTIVE      764330      11/02/2005 15:01:35      /cgcdb/oracle/OEMD1ORA/INDX_01.DBF

Copie des fichiers de données

Une fois que tous les fichiers physiques sont en mode backup, ces derniers peuvent être sauvegardés.

Pour générer dynamiquement en shell la copie des fichiers physiques en supposant dans cette documentation que $DMP est une variable définissant le répertoire de sauvegarde :

sqlplus "/ as sysdba"<<-EOF > /tmp/liste_datafiles.txt

set heading off ;
set feedback off;
set linesize 2000;
set pagesize 200;

select name from v$datafile;
EOF

datafiles=`cat /tmp/liste_datafiles.txt`
for fl in $datafiles
do
    cp -f $fl ${DMP}
done

Mise en mode end backup des tablespaces

Après la sauvegarde des fichiers physiques, les tablespaces doivent être mis en mode end backup :

Syntaxe :

alter tablespace <tablespace_name> end backup ;

Pour générer dynamiquement les syntaxes end backup :

set heading off ;
set feedback off;
set linesize 1000;
set pagesize 200;

spool end_backup.sql

select 'alter tablespace '||tablespace_name||' end backup;'
from dba_tablespaces;

Le fichier end_backup.sql généré contient alors les commandes ci-dessous :

end_backup.sql
alter tablespace SYSTEM end backup;
alter tablespace RBS end backup;
alter tablespace TEMP end backup;
alter tablespace USERS end backup;
alter tablespace INDX end backup;

et il ne reste plus qu’à exécuter le script end_backup.sql en question :

sqlplus "/ as sysdba"@end_backup.sql;
exit

Après la mise en mode end backup des tablespaces, la colonne STATUS de la vue V$BACKUP passe à l’état NOT ACTIVE pour tous les fichiers de données et il est nécessaire de le vérifier :

select a.file#, a.status, a.change#, to_char(a.time,'dd/mm/yyyy hh24:mi:ss'), b.name
  from V$backup a, v$datafile b
  where a.file# = b.file#;
1      NOT ACTIVE      764326      11/02/2005 15:08:01      /cgcdb/oracle/OEMD1ORA/SYSTEM_01.DBF
2      NOT ACTIVE      764327      11/02/2005 15:08:09      /cgcdb/oracle/OEMD1ORA/RBS_01.DBF
3      NOT ACTIVE      764329      11/02/2005 15:08:17      /cgcdb/oracle/OEMD1ORA/USERS_01.DBF
4      NOT ACTIVE      764328      11/02/2005 15:08:22      /cgcdb/oracle/OEMD1ORA/TEMP_01.DBF
5      NOT ACTIVE      764329      11/02/2005 15:08:29      /cgcdb/oracle/OEMD1ORA/USERS_02.DBF
6      NOT ACTIVE      764330      11/02/2005 15:08:43      /cgcdb/oracle/OEMD1ORA/INDX_01.DBF

Sauvegarde des redo logs archivés

L’archivage des redo logs est un process continu et pour une sauvegarde cohérente, il faut archiver le redo log courant pour ultérieurement sauvegarder dans le répertoire $DMP toutes les archives générées pendant le backup :

alter system archive log current;

Ne sauvegarder que les fichiers de redo log archivés à partir premier numéro de changement (change#) dans la vue V$BACKUP, car en cas de recovery / restore c’est ce numéro de changement qui est pris en compte :

sqlplus "/ as sysdba"<<-EOF > /tmp/liste_arcfiles.txt

set heading off ;
set feedback off;
set linesize 1000;
set pagesize 200;
select name from v$archived_log
where next_change# > (select min(change#) from v$backup);
EOF

arcfiles=`cat /tmp/liste_arcfiles.txt`
for fl in $datafiles
do
   cp -f $fl ${DMP}
done

name
-----------------------------------------------------
/cgcdb/oracle/OEMD1ORA/archivelog/001S01512.ARC

Le fichier /cgcdb/oracle/OEMD1ORA/archivelog/001S01512.ARC est sauvegardé dans le répertoire $DMP.