Configuration et Gestion du Mode ARCHIVELOG pour Oracle Database

Introduction au Mode ARCHIVELOG

Le mode ARCHIVELOG est essentiel pour la stratégie de sauvegarde et de récupération d'une base de données Oracle. Il permet de conserver une copie des journaux de rétablissement (redo logs) après qu'ils aient été remplis et réutilisés. Ces journaux d'archive sont cruciaux pour la récupération après sinistre, la récupération à un instant précis, et les opérations de Data Guard.

1. Vérification du Statut ARCHIVELOG

Avant d'activer le mode ARCHIVELOG, il est important de vérifier l'état actuel de votre base de données. Utilisez la commande SQL suivante depuis SQL*Plus :

SQL> archive log list;

Un résultat typique en mode NOARCHIVELOG est le suivant :

Database log mode           No Archive Mode
Automatic archival           Disabled
Archive destination           USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence     244
Current log sequence           246

Si la base de données est en "No Archive Mode", elle n'archive pas les journaux de rétablissement.

2. Configuration des Destinations d'Archive

Par défaut, Oracle utilise la zone de récupération rapide (Fast Recovery Area - FRA) définie par le paramètre DB_RECOVERY_FILE_DEST comme destination pour les journaux d'archive. Il est crucial de surveiller l'espace disponible dans la FRA, car une zone saturée peut entraîner un blocage de la base de données.

SQL> show parameter DB_RECOVERY_FILE_DEST;

NAME                     TYPE     VALUE
------------------------------------ ----------- ------------------------------
db_recovery_file_dest             string     /u01/app/oracle/flash_recovery_area
db_recovery_file_dest_size         big integer 3882M

Pour une flexibilité accrue ou pour éviter la saturation de la FRA, vous pouvez définir une destination d'archive explicite via le paramètre LOG_ARCHIVE_DEST_1. À partir d'Oracle 10g, il est possible de spécifier plusieurs destintaions d'archive pour une meilleure résilience. La destination principale est généralement configurée via LOG_ARCHIVE_DEST_1.

SQL> show parameter log_archive_dest_1;

NAME                     TYPE     VALUE
------------------------------------ ----------- ------------------------------
log_archive_dest_1             string
... (autres destinations)

Pour définir un chemin d'archive spécifique (par exemple, /u02/app/oracle/archive_logs), exécutez la commande suivante. Notez que l'utilisation de scope=spfile nécessite un redémarrage de l'instance.

SQL> alter system set log_archive_dest_1='LOCATION=/u02/app/oracle/archive_logs' scope=spfile;

System altered.

3. Définition du Format des Journaux d'Archive

Il est recommandé de configurer un format clair et cohérent pour les noms de fichiers des journaux d'archive. Ceci facilite leur gestion et leur identification.

SQL> alter system set log_archive_format='ARC%S_%R.%T_%D.dbf' scope=spfile;

System altered.

Les placeholders courants incluent :

  • %S : Numéro de séquence du journal.
  • %R : Numéro d'ID d'instance (pour RAC).
  • %T : Numéro de thread du journal (pour RAC).
  • %D : ID de la base de données.

N'oubliez pas que cette modification aussi prendra effet après un redémarrage de l'instance.

4. Activation du Mode ARCHIVELOG

L'activation du mode ARCHIVELOG doit s'effectuer lorsque la base de données est en état MOUNT (montée) et non ouverte.

  1. Arrêtez la base de données :
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
  1. Démarrez la base de données en mode MOUNT :
SQL> startup mount;
ORACLE instance started.

Total System Global Area 1603411968 bytes
Fixed Size            2213776 bytes
Variable Size          989857904 bytes
Database Buffers      603979776 bytes
Redo Buffers            7360512 bytes
Database mounted.
  1. Activez le mode ARCHIVELOG :
SQL> alter database archivelog;

Database altered.
  1. Il est également judicieux d'activer le mode FORCE LOGGING pour garantir que toutes les opérations de la base de données génèrent des redo logs et, par conséquent, des journaux d'archive :
SQL> ALTER DATABASE FORCE LOGGING;

Database altered.
  1. Ouvrez la base de données :
SQL> alter database open;

Database altered.

5. Vérification Finale

Confirmez que la base de données est bien en mode ARCHIVELOG et que le processus d'archivage est démarré :

SQL> archive log list;
Database log mode           Archive Mode
Automatic archival           Enabled
Archive destination           /u02/app/oracle/archive_logs
Oldest online log sequence     244
Next log sequence to archive   246
Current log sequence           246

SQL> select log_mode from v$database;

LOG_MODE
------------
ARCHIVELOG

SQL> select archiver from v$instance;

ARCHIVE
-------
STARTED

6. Test de Génération d'Archive Log

Pour vérifier que les journaux d'archive sont générés, forcez un switch de log et observez la création d'un nouveau fichier d'archive.

SQL> select name from v$archived_log;
-- Initialement, peut afficher 'no rows selected' ou les journaux existants.

SQL> alter system switch logfile;

System altered.

SQL> select name from v$archived_log;
-- Devrait maintenant montrer un nouveau journal d'archive.

NAME
--------------------------------------------------------------------------------
/u02/app/oracle/archive_logs/ARC0000000246_0963417259.0001_6833bc69.dbf

Vous pouvez également vérifier la présence physique des fichiers dans le répertoire configuré :

[oracle@hostname archive_logs]$ ls -l

Gestion et Nettoyage des Journaux d'Archive

La gestion des journaux d'archive est cruciale pour éviter la saturation de l'espace disque. Le nettoyage doit être effectué correctement pour ne pas compromettre la capacité de récupération.

1. Nettoyage Manuel (Déconseillé sans RMAN)

Supprimer manuellement les fichiers d'archive du système de fichiers sans en informer Oracle RMAN (Recovery Manager) peut entraîner des incohérences. Si vous supprimez physiquement les fichiers, RMAN les considérera toujours comme existants dans son catalogue jusqu'à ce que vous effectuiez un CROSSCHECK.

Exemple de recherche de fichiers d'archive de plus de 3 jours :

[oracle@localhost archive_logs]$ find . -type f -mtime +3 -print | xargs ls -l

Pour supprimer ces fichiers (à utiliser avec prudence !) :

[oracle@localhost archive_logs]$ find . -type f -mtime +3 -print | xargs rm -f

Après une suppression physique manuelle, vous devez synchroniser le catalogue RMAN :

  1. Connectez-vous à RMAN :
RMAN> connect target /
  1. Vérifiez les journaux d'archive expirés (qui n'existent plus physiquement) :
RMAN> list expired archivelog all;
-- Initialement, peut ne rien retourner car RMAN n'a pas encore vérifié leur statut.
  1. Effectuez un CROSSCHECK pour vérifier l'existence physique des fichiers :
RMAN> crosscheck archivelog all;
...
archived log file name=/u02/app/oracle/archive_logs/ARC0000002400_0977259429.0001_fb0ffee2.dbf RECID=1795 STAMP=978255518
validation succeeded for archived log
...
Crosschecked 1797 objects
  1. Après le CROSSCHECK, les fichiers supprimés manuellement seront marqués comme EXPIRED :
RMAN> list expired archivelog all;

List of Archived Log Copies for database with db_unique_name ORCL
=====================================================================
Key     Thrd Seq     S Low Time
------- ---- ------- - ---------
1       1    606     X 04-JUN-18
       Name: /u02/app/oracle/archive_logs/ARC0000000606_0977259429.0001_fb0ffee2.dbf
... (autres journaux expirés)
  1. Supprimez les entrées des journaux expirés du catalogue RMAN :
RMAN> delete expired archivelog all;

Do you really want to delete the above objects (enter YES or NO)? yes
deleted archived log
...
Deleted 3 EXPIRED objects

2. Nettoyage des Journaux d'Archive avec RMAN (Méthode Recommandée)

La méthode la plus sûre et recommandée pour nettoyer les journaux d'archive est d'utiliser RMAN, qui gère la suppression physique des fichiers et met à jour son catalogue simultanément.

Voici des commandes RMAN courantes pour le nettoyage :

  • Vérifier la validité de tous les journaux d'archive :
RMAN> crosscheck archivelog all;
  1. Supprimer tous les journaux d'archive qui ont été marqués comme expirés (non trouvés physiquement) :
RMAN> delete expired archivelog all;
  1. Supprimer les journaux d'archive plus anciens qu'une certaine période (par exemple, 7 jours) :
RMAN> DELETE ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-7';

3. Script Shell pour le Nettoyage Automatisé

Pour automatiser le nettoyage, vous pouvez créer un script shell qui exécute les commandes RMAN nécessaires. Ce script peut ensuite être programmé via Cron.

#!/bin/bash

# Configuration de l'environnement Oracle
export ORACLE_BASE=/home/oracle/app/oracle
export ORACLE_HOME=/home/oracle/app/oracle/product/11.2.0/dbhome_1
export ORACLE_SID=ORCL

# Chemin du fichier de log pour les opérations RMAN
LOG_DIR="/home/oracle/scripts/logs"
mkdir -p $LOG_DIR
LOG_FILE="${LOG_DIR}/rman_clean_archivelog_$(date +%Y%m%d_%H%M%S).log"

echo "Démarrage du nettoyage des journaux d'archive Oracle à $(date)" >> $LOG_FILE

# Exécution des commandes RMAN
${ORACLE_HOME}/bin/rman nocatalog log=$LOG_FILE << EOF
connect target /
# Valide tous les journaux d'archive et marque les fichiers manquants comme expirés
crosscheck archivelog all;
# Supprime tous les journaux d'archive qui sont marqués comme expirés
delete noprompt expired archivelog all;
# Supprime les journaux d'archive complétés il y a plus de 2 jours
DELETE noprompt ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-2';
exit;
EOF

echo "Fin du nettoyage des journaux d'archive Oracle à $(date)" >> $LOG_FILE
echo "Consulter le fichier de log : $LOG_FILE"

Étiquettes: Oracle ARCHIVELOG RMAN database administration Data Recovery

Publié le 24 juillet à 10h48