Lorsque vous êtes face à un problème de serveur et que votre serveur existant a suffisamment de ressources pour faire fonctionner une autre base de données, le clone et sa source peuvent tourner sur le même serveur.

Cloner une base de données sur le même serveur est plus complexe que la cloner sur un serveur différent. Pour isoler le clone de sa source il faudra savoir quels fichiers éditer et comment le faire. Autrement, une seule erreur pourrait détruire au corrompre la base source.

Cet article vous expliquera comment isoler une base clonée de la source sur le même serveur. La méthode que nous proposons ici vous permet de cloner votre base de données avec moins d’effort que si vous utiliser Oracle RMAN ou l’outil Export/Import. Dans notre cas, la base de données source réside sur un serveur Unix HOST1 et se nomme srcdb et utilise le point de montage /u01. La base de données clone s’appellera dstdb et utilisera le point de montage /u02 sur le serveur.

A. Copie des fichiers

Cette première étape consiste à copier tous les fichiers de la base de données vers l’environnement de la base clone.

1- Mettre la base de données srcdb en mode quiesce (mode silencieux qui permet de suspendre les actions sur les fichiers de données) en préparation de la copie. Entrer les commandes suivantes :

SQL> alter system switch logfile; 
SQL> alter database begin backup;
SQL> alter system quiesce restricted; 

SQL> select active_state from v$instance;

La réponse suivante apparaît.

ACTIVE_STATE 
-- 
QUIESCED

2- Copier l’arborescence du répertoire source /u01 vers /u02 en utilisation la méthode qui vous convient : commandes OS, Flashcopy/Volumecopy si vous utilisez un système de stockage (IBM DS, SUN, …). Dans notre nous avons utiliser Flashcopy car nous avons un système de stockage IBM DS4000.

3- Remettre la base source en mode de fonctionnement normal. Entrer les commandes suivantes :

SQL> alter system unquiesce 
SQL> alter database end backup; 
SQL> alter system switch logfile;

NOTE : Vous aurez peut-être besoin de ce dernier log pour faire un « complete recovery » de votre base clone.

B. Clonage de la base de données

Pour cloner la base de données, vous devez préparer les environnements des bases de données source et clone. Vous devez commencer par la base source.

ATTENTION : Corruption de base de données possible si vous essayez de démarrer la base de données clone sans changer les références : • Datafiles • Logfiles • Localisation des binaires

Préparation de la base de données Source

1-Cloner la base de données source et changer son nom Reconstruire le controlfile en utilisant les nouveaux chemins vers les fichiers de données sur /u02. Première chose il faut sauvegarder le controlfile sous forme de scripts et modifier ce scripts.




SQL> alter database backup controlfile to trace as '/home/oracle/ 
srcdbctrlfile.ora' reuse;

2-Trouver le localisation des objets de données.

SQL>  spool ‘/home/oracle/gathersrcdb_info.txt’ 
SQL> col name format a30 
SQL> col value format a60 
SQL> select name, value from v$parameter where value like '%/ 
u01%';
SQL> show parameter dispatchers 
SQL> col name format a60 
SQL> select name from v$datafile; 
SQL> col member format a80 
SQL> select member from v$logfile;

3-créer un nouveau pfile pour la nouvelle base de données

SQL> create pfile='/home/oracle/initdstdbTemp.ora' from 
 spfile;  
SQL> spool off 
SQL> exit

4- supprimer les controlfiles de l’environnement de la de données clone (si vous les avez copié dans l’étape de départ) : /u02 Vérifier le chemin vers ces fichiers grâce au fichier d’information gathersrcdb_info.txt que vous avez créé.

5- rassembler les informations que vous devez modifier au niveau OS pour rendre fichiers et répertoires unique.

cd /u02 
find . –name *srcdb* 
find . –name *SRCDB*

6- Vous devez éditer le résultant des deux commandes find ci-dessus :

  • Modifier les noms des répertoires pour référencer la nouvelle base de données dstdb.
  • Editer le contenu des fichiers. Ignorer les fichiers trc files, logfiles, et autres.

7-dans notre cas nous avons changé les noms en utilisant la commande suivante : mv /u02/oradata/srcdb /u02/oradata/dstdb

8-Edition des fichiers trouver.

  • Renommer ces fichiers avec le nouveau nom d’intsance.
  • Changer le contenu pour référencer le nouveau point de montage /u02

IMPORTANT : Assurez-vous qu’il n ya aucune référence à la base srcdb dans le nom et le contenu de ces fichiers sur le point de montage /u02

9- Changer les variables d’environnement pour pointer sur la nouvelle instance dstdb :

ORACLE_HOME (vous pouvez garder les même binaires (oracle home) pour les deux base de données cependant il est conseillé de créer un nouveau oracle home pour la nouvelle base de sort a pouvoir faire des mises à jour des environnement indépendamment), ORACLE_SID

10- Edition du fichier pfile.

  • Copier le pfile que nous avons créé précédemment dans initdstdbTemp.ora à partir de celui de la base source vers le nouveau $ORACLE_HOME/dbs en le renommant en initdstdb.ora.
  • Editez ce pfile pour changer les références à l’ancien point de montage /u01 par le nouveau point montage /u02 et aussi les référence srcdb en dstdb

11-Editer le script de controlfile créé au début pou apporter les modifications suivantes:

  • Editez ce fichier pour changer les références à l’ancien point de montage /u01 par le nouveau point montage /u02 et aussi les référence srcdb en dstdb
  • Ajouter l’option pfile après la commande STARTUP NOMOUNT pour pointer vers le nouveau fichier pfile dans $ORACLE_HOME/dbs.
  • Changer l’instruction après « create controlfile » en « set database » au lieu de « use database ».
  • s’assurer que l’instruction « Create Controlfile » spécifie RESETLOGS.
  • Supprimer toutes les lignes du début du script jusqu'à la ligne avec l’instruction « Startup Nomount » avec la specification RESETLOGS.

Préparation de la base de données

1-Créer un conrolfile pour la nouvelle base

Executez le script de controlfile créé dans les étapes précédentes(vous pouvez ouvrir le script, copier le contenu et coller dans SQLPLUS comme le cas ici).

oracle@HOST1$ sqlplus 
oracle@HOST1$ sqlplus 
SQL>  conn / as sysdba 
SQL>  STARTUP NOMOUNT pfile=’/u02/app/oracle/admin/dstdb/ scripts/initdstdbTemp.ora’ 
SQL>  CREATE CONTROLFILE set DATABASE "dstdb" RESETLOGS  
ARCHIVELOG 
    MAXLOGFILES 16 
    MAXLOGMEMBERS 3 
    MAXDATAFILES 100 
    MAXINSTANCES 8 
    MAXLOGHISTORY 292
LOGFILE 
  GROUP 1 '/u02/oradata/dstdb/redo01.log'  SIZE 50M, 
  GROUP 2 '/u02/oradata/dstdb/redo02.log'  SIZE 50M, 
  GROUP 3 '/u02/oradata/dstdb/redo03.log'  SIZE 50M 
-- STANDBY LOGFILE 
DATAFILE 
  '/u02/oradata/dstdb/system01.dbf', 
  '/u02/oradata/dstdb/undotbs01.dbf', 
  '/u02/oradata/dstdb/sysaux01.dbf', 
  '/u02/oradata/dstdb/users01.dbf', 
  '/u02/oradata/dstdb/example01.dbf', 
  '/u02/oradata/dstdb/test_tts.dbf' 
CHARACTER SET WE8ISO8859P1 
;

2- Interrogez la nouvelle base pour voir si tous les paramètres pointent vers le bon point de montage.

SQL> col name format a30 
SQL> col value format a60 
SQL> select name, value from v$parameter where value like '%/ 
u01%';

3- Créer un nouveau spfile pour la nouvelle base données.




SQL> create spfile from pfile=’/u02/app/oracle/admin/dstdb/ 
scripts/initdstdbTemp.ora’;

4-Arrêtez la base pour vous assurer que vous pouvez la redémarrer sans problème.




SQL>  Shutdown immediate; 
SQL>  STARTUP MOUNT

5-Editez le paramètres service_names et dispatchers

SQL>  Alter system set service_names =’dstdb’ scope=both; 
SQL>  Alter system set dispatchers=’(PROTOCOL=TCP) 
(SERVICE=dstdbXDB)’ scope=both;

6 Ouvrez votre nouvelle base de données.




SQL>  ALTER DATABASE OPEN resetlogs;

Si la base n’arrive pas s’ouvrir parce qu’elle a besoin d’un « recovery », faites ce qui suit :

  • Localiser le fichier log qui avait été créé par le « switch logfile » après la copie des fichier (rappelez vous que j’avais prévenu qu’il serait peut-être nécessaire)
  • Exécuter la l’instruction : recover database using backup controlfile.
  • Specifiez le chemin vers le fichier log en question.
  • attendez de recevoir le message « media recovery complete » et ensuite ouvrez votre base.
SQL>alter database open resetlogs

7- Ajoutez la définition du tablespace temporaire :

SQL>  ALTER TABLESPACE TEMP ADD TEMPFILE '/u02/oradata/dstdb/temp01.dbf'  SIZE 20971520  REUSE AUTOEXTEND ON NEXT 655360 MAXSIZE 32767M;

Les spécifications du TEMPFILE dans votre cas seront différentes. Referez-vous au premier script de controlfile pour la bonne syntaxe.

8-Verifier

SQL> select instance_name, host_name, database_status from 
v$instance;

et vous devez avoir comme resultat :

INSTANCE_NAME  HOST_NAME  DATABASE_STATUS 
 - --- 
dstdb                    HOST1          ACTIVE

C. Conclusion

Après avoir exécuté ces procédures vous avez une base de données opérationnelle représentation une image de la base source a un instant donné sur le même serveur. Vous pourriez ensuite utiliser cette base clone pour les test d’application, les migrations, les mises à jour et autre manipulation.