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
.
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
' vautNo 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
' vautArchive Mode
. - La section '
Automatic Archival
' indique si l’archivage automatique des redo log est activé (Disabled
ouEnabled
). 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
.