Dataguard, déplacement et recréation de fichiers de base de données

Il peut arriver, suite à des erreurs de manipulation, de paramétrage ou simplement suite à un problème de place, que l’on soit obligé de déplacer ou de recréer des fichiers de base de données sur une base standby.
Ce sont ces différents cas de figure que l’on va aborder ici.
Dans tous les cas la manipulation reste la même. A savoir:

  • arrêt de l’application des redologs.
  • passage en mode de gestion des fichiers de base de données manuel.
  • action sur les fichiers
  • passage en mode de gestion des fichiers de base de données automatique.
  • réactivation de l’application des redologs.

Voyons le cas du déplacement d’un fichier de base de données.

Ce cas se produit généralement lorsque l’on rencontre un problème de place sur un file system ou un disk group que l’on ne peut pas étendre pour une raison ou une autre.
L’enchainement des commandes est le suivant :

  alter database recover managed standby database cancel;
  -- déplacer les fichiers a l'aide de la  commande cp system ou sous asmcmd
  alter system set standby_file_management='MANUAL';
  alter database rename file '/répertoire/origine/nom_de_fichier.dbf' to '/répertoire/destination/nom_de_fichier.dbf';
  alter system set standby_file_management='AUTO';
  alter database recover managed standby database using current logfile disconnect from session;

Une fois que l’on a bien validé que le fichier copié est bien actif dans la base de données, il faut supprimer le fichier initial à l’aide de la commande rm system ou sous asmcmd.
Assurez vous aussi que le paramètre db_file_name_convert soit bien adapté suite au renommage  de fichier effectué.

Problème de datafile avec le nom « unnamedXXXX »

Ce type d’erreur se  produit lorsque le répertoire de destination du fichier n’existe pas sur le serveur supportant la base standby.
Pour corriger le problème et créer le fichier il faut lancer la commande suivante :

  alter database create datafile '<ORACLE_HOME>/dbs/UNNAMED00052' as '/répertoire/destination/nom_de_fichier.dbf' ;

Même remarque concernant le db_file_name_convert.

Ajout de standby redolog

Cela se produit lorsque les fichiers standby_redolog ont été accidentellement supprimés ou s’ils ont été oubliés lors de la création initiale du dataguard ou si leur nombre n’est pas suffisant.
Pour les ajouter, lancer la série de commande suivante :

  alter database recover managed standby database cancel;
  alter system set standby_file_management='MANUAL';
  ALTER DATABASE ADD STANDBY LOGFILE THREAD 1 GROUP 11 ('/répertoire/localisation/redo') SIZE 200M;
  ALTER DATABASE ADD STANDBY LOGFILE THREAD 1 GROUP 12 ('/répertoire/localisation/redo') SIZE 200M;
  ALTER DATABASE ADD STANDBY LOGFILE THREAD 1 GROUP 12 ('/répertoire/localisation/redo') SIZE 200M;
  ALTER DATABASE ADD STANDBY LOGFILE THREAD 2 GROUP 21 ('/répertoire/localisation/redo') SIZE 200M;
  ALTER DATABASE ADD STANDBY LOGFILE THREAD 2 GROUP 22 ('/répertoire/localisation/redo') SIZE 200M;
  ALTER DATABASE ADD STANDBY LOGFILE THREAD 2 GROUP 22 ('/répertoire/localisation/redo') SIZE 200M;
  alter system set standby_file_management='AUTO';
  alter database recover managed standby database using current logfile disconnect from session;

Perte des redologs

Ce cas de figure se produit suite a une erreur de  manipulation qui a supprimer physiquement les redologs sur le système de fichiers.
Surtout ne pas arrêter la base de données, on serait alors contraint de recréer le dataguard.
Pour remettre la configuration d’aplomb, on lance la série de commandes suivantes:

alter database recover managed standby database cancel;
  alter system set standby_file_management='MANUAL';
  -- Ajout de nouveau groupe de redologs
  ALTER DATABASE ADD LOGFILE THREAD 1 GROUP 05 ('/répertoire/localisation/redo') SIZE 200M;
  ALTER DATABASE ADD LOGFILE THREAD 1 GROUP 06 ('/répertoire/localisation/redo') SIZE 200M;
  ALTER DATABASE ADD LOGFILE THREAD 2 GROUP 07 ('/répertoire/localisation/redo') SIZE 200M;
  ALTER DATABASE ADD LOGFILE THREAD 2 GROUP 08 ('+VLL1PRDK_REDO02') SIZE 200M;
  -- suppression des groupes inutiles, ceux qui n'ont pas le statut "current"
  ALTER DATABASE DROP LOGFILE GROUP 01 ;
  ALTER DATABASE DROP LOGFILE GROUP 03 ;
  -- sur la base primaire, switch de redologs pour libérer les redologs
  ALTER SYSTEM SWITCH LOGFILE;
  ALTER SYSTEM CHECKPOINT;
  -- Sur la base standby
  ALTER DATABASE CLEAR LOGFILE GROUP 2;
  -- suppression des derniers groupes inutiles
  ALTER DATABASE DROP LOGFILE GROUP 2 ;
  alter system set standby_file_management='AUTO';
  alter database recover managed standby database using current logfile disconnect from session;

Assurez vous aussi que le paramètre log_file_name_convert est toujours adapté suite à la création des nouveaux redologs.