Dans le cadre du travail d’un administrateur de base de données, il est parfois utile de savoir cloner une base de données. En effet, cette opération peut être exécutée notamment sur des machines différentes, pour permettre notamment aux développeurs d’accéder à une base de production fonctionnelle. Le but de cet article sera donc d’expliquer une des méthodes pour effectuer un clonage rapide d’une base de données. Cette méthode peut être exécutée dans le cadre de tests de certaines instances, pour permettre la restauration d’une instance sur un autre serveur sans effectuer de renommage (une procédure d’exemple de renommage est détaillée sur la page suivante : Renommage).
Remarque :
Nous pouvons également effectuer un clonage de la base de données sur le même serveur, mais il faudrait procéder dans tous les cas à un renommage de l’instance, on parlera alors de duplication de la base de données. Cette méthode sera détaillée dans un futur article.
Pré-requis
Vérification de l’arborescence
Sur le système cible qui va servir de réception au clonage, il faut s’assurer que l’ensemble des répertoires nécessaire au bon fonctionnement de la base de données sont bien présents.
Remarque : Dans le cadre de notre exemple, nous considérerons ici l’arborescence suivante :
- $ORACLE_HOME = /logiciels/oracle/oradb/11.2.0.m/ora
- $HOME = /home/oracle
- Les fichiers de la base de données seront stockés dans l’arborescence suivante : /appli/oracle/<SID>
- Des liens seront crées depuis les fichiers init<SID>.ora, spfile<SID>.ora, etc. car ils ne seront pas situés dans $ORACLE_HOME.
1 2 3 4 5 6 7 |
<oracle@CIBLE>$ mkdir -p /home/oracle/admin/<SID> <oracle@CIBLE>$ cd /home/oracle/admin/<SID> <oracle@CIBLE>$ mkdir dbs log scripts <oracle@CIBLE>$ mkdir -p /logiciels/oracle/diag/rdbms/<sid>/<SID>/audit <oracle@CIBLE>$ mkdir -p /appli/oracle/<SID> <oracle@CIBLE>$ cd /appli/oracle/<SID> <oracle@CIBLE>$ mkdir oraarch oractl01 oractl02 oradata01 oradata02 oraredolog01 oraredolog02 |
Remarque :
Il faudra créer autant de dossiers oradataXX que sur la base source.
Copie des fichiers de configuration
Sur le système source, se connecter sur une session SQL*PLUS en tant que sysdba, et effectuer la requête suivante dans le but de créer un pfile récent se basant sur les informations contenues dans le spfile de la base de données,
1 |
SQL> create pfile='/home/oracle/admin/<SID>/dbs/init<SID>bis.ora' from spfile; |
Suite à la création de ce fichier, il faut l’éditer pour supprimer certains paramètres qui ont été rajoutés automatiquement par la base de données. Comme cela est précisé dans l’exemple ci-dessous, il faut supprimer les lignes de type <SID>.__xxxx, une fois cette suppression effectuée, copier le fichier init<SID>bis.ora vers le serveur cible.
1 2 3 4 5 6 7 8 9 |
<SID>.__db_cache_size=595591168 <SID>.__java_pool_size=12582912 <SID>.__large_pool_size=268435456 <SID>.__oracle_base='/oracle'#ORACLE_BASE set from environment <SID>.__pga_aggregate_target=1291845632 <SID>.__sga_target=1929379840 <SID>.__shared_io_pool_size=0 <SID>.__shared_pool_size=440401920 <SID>.__streams_pool_size=314572800 |
Déplacer ensuite le fichier init<SID>bis.ora dans le répertoire adéquat (ici : /home/oracle/admin/<SID>/dbs) et le renommer en init<SID>.ora. Une fois, ces opérations effectuées, copier les fichiers .profile<SID> et orapw<SID> du serveur source vers le serveur cible et les positionner également dans l’arborescence suivante : /home/oracle/admin/<SID>/dbs. Ne pas oublier de faire pointer les liens depuis $ORACLE_HOME/dbs.
Remarque : Attention, parfois la directive local_listener est renseignée, il faut alors s’assurer que le machine est bien le serveur cible et non le serveur source.
Configuration du tnsnames.ora & listener.ora
Nous devons maintenant rajouter les informations des bases de données dans le fichier tnsnames.ora de nos deux environnements. Dans notre exemple, nous nommerons la base source : SOURCE et la base cible : CIBLE. Les informations doivent être identiques dans les deux fichiers.
1 2 3 4 5 6 7 |
SOURCE_<SID> = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP) (HOST = <@IP_SOURCE>) (PORT = 1521)) (CONNECT_DATA = (SID = <SID>))) CIBLE_<SID> = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP) (HOST = <@IP_CIBLE>) (PORT = 1521)) (CONNECT_DATA = (SID = <SID>))) |
Sur le serveur cible, il faut également renseigner le fichier listener.ora avec les informations de la base que nous allons cloner.
1 2 3 4 5 6 7 8 9 |
LISTENER = (ADDRESS_LIST = (ADDRESS = (HOST = <@IP_CIBLE>)(PROTOCOL = TCP)(PORT = 1521))) SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (ORACLE_HOME = /logiciels/oracle/oradb/11.2.0.m/ora) (SID_NAME = <SID>))) STARTUP_WAIT_TIME_LISTENER = 0 CONNECT_TIMEOUT_LISTENER = 10 TRACE_LEVEL_LISTENER = OFF |
Pour terminer cette phase de pré-requis, nous devons recharger le listener sur les deux environnements :
1 2 |
<oracel@SOURCE>$ lsnrctl reload LISTENER <oracel@CIBLE>$ lsnrctl reload LISTENER |
Préparation du clonage
Maintenant que le paramétrage des fichiers de configuration de la base est effectué, nous allons vérifier les configuration RMAN de celle-ci, et préparer la base pour le clonage.
Configuration RMAN
Sous l’utilisateur oracle, effectuer les commandes suivantes, pour s’assurer que la configuration RMAN est conforme :
1 2 |
<oracle@SOURCE>$ export ORACLE_SID=<SID> <oracle@SOURCE>$ rman target / |
1 2 3 4 5 |
RMAN> show all; [...] CONFIGURE CONTROLFILE AUTOBACKUP ON; CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '/sauvebase//%F'; [...] |
Remarque : Si la commande autobackup est à OFF, il faut activer l’option via les commandes suivantes :
1 2 |
RMAN> CONFIGURE CONTROLFILE AUTOBACKUP ON; RMAN> CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '/sauvebase/<SID>/%F'; |
Effectuer une sauvegarde du fichier de contrôle, via la commande suivante :
1 |
RMAN> backup current controlfile; |
Normalisation des backups & archivelog
Sous l’utilisateur oracle, effectuer les commandes suivantes, pour supprimer les vieilles occurrences d’archivelog :
1 2 |
<oracle@SOURCE>$ export ORACLE_SID=<SID> <oracle@SOURCE>$ rman target / |
1 2 3 4 5 6 7 8 |
RMAN> crosscheck backup; RMAN> delete noprompt expired backup; RMAN> crosscheck backup of archivelog all; RMAN> delete noprompt expired backup of archivelog all; RMAN> delete noprompt archivelog all completed before 'sysdate - 1'; RMAN> crosscheck archivelog all; RMAN> delete noprompt expired archivelog all; RMAN> exit; |
Exécution du clonage
Sous l’utilisateur oracle, exécuter les commandes suivantes, une fois que toutes les étapes de pré-requis ont été respectées.
1 2 |
<oracle@CIBLE>$ export ORACLE_SID=<SID> <oracle@CIBLE>$ sqlplus "/as sysdba" |
1 2 |
SQL> startup nomount pfile='/home/oracle/admin/<SID>/dbs/init.ora'; SQL> exit; |
La base de données cible est démarrée, nous pouvons lancer le clonage de la base source.
1 |
<oracle@CIBLE>$ rman target sys/<MDP>@SOURCE_<SID> |
1 2 3 4 5 6 7 8 |
RMAN> connect auxiliary sys/<MDP>@CIBLE_<SID> RMAN> run RMAN> { RMAN> allocate channel c1 type disk ; RMAN> allocate auxiliary channel c2 type disk ; RMAN> DUPLICATE TARGET DATABASE TO FROM ACTIVE DATABASE nofilenamecheck; RMAN> } RMAN> exit; |
Contrôles
Vérification de la base de données
Le clonage ayant été effectué, nous devons maintenant vérifier que la nouvelle base de données est fonctionnelle. Pour se faire, se connecter avec l’utilisateur oracle, et effectuer les commandes suivantes :
1 2 |
<oracle@CIBLE>$ export ORACLE_SID=<SID> <oracle@CIBLE>$ sqlplus "/as sysdba" |
1 2 3 4 5 6 |
SQL> set lines 150 pages 1000 SQL> select INSTANCE_NAME, STATUS, ARCHIVER, INSTANCE_ROLE, ACTIVE_STATE from v$instance; INSTANCE_NAME STATUS ARCHIVER INSTANCE_ROLE ACTIVE_STATE ------------- ------ -------- ---------------- ------------ <SID> OPEN STARTED PRIMARY_INSTANCE NORMAL |
Résultat : La base doit être en statut ouverte, démarrée, marquée comme instance primaire.
1 2 3 4 5 |
SQL> select NAME, LOG_MODE, OPEN_MODE, DATABASE_ROLE from v$database; NAME LOG_MODE OPEN_MODE DATABASE_ROLE ----- ---------- ---------- ---------------- <SID> ARCHIVELOG READ WRITE PRIMARY |
Résultat : La base doit être en mode archivelog, en lecture/ecriture, marquée comme instance primaire.
La requête précédente, précisant que la base de données est en mode achivelog, nous allons maintenant vérifier que le mode archivelog est fonctionnel via les commandes suivantes :
1 2 3 4 5 6 7 8 |
SQL> archive log list; Database log mode Archive Mode Automatic archival Enabled Archive destination /appli/oracle/<SID>/oraarch Oldest online log sequence 1 Next log sequence to archive 1 Current log sequence 1 |
Nous forçons le changement de séquences, pour vérifier que le base effectue bien le changement.
1 2 3 4 5 6 7 8 |
SQL> alter system switch logfile; Database log mode Archive Mode Automatic archival Enabled Archive destination /appli/oracle/<SID>/oraarch Oldest online log sequence 1 Next log sequence to archive 2 Current log sequence 2 |
1 2 3 |
<oracle@CIBLE>$ ls -al /appli/oracle/<SID>/oraarch -rw-r----- 1 oracle oinstall 3945472 Sep 8 08:18 <SID>_889285581_13_1.arc -rw-r----- 1 oracle oinstall 1431040 Sep 8 08:19 <SID>_889863496_1_1.arc |
Résultat : La base a bien incrémenté ses numéros de séquences, et a bien généré des fichiers d’archive dans le répertoire de destination.
Nous vérifions maintenant que les fichiers de trace (alert<SID>.log) sont dans le bon répertoire.
1 2 3 4 5 |
SQL> show parameter background_dump_dest NAME TYPE VALUE -------------------- ------ ------------------------------ background_dump_dest string /oracle/diag/rdbms/<sid>/<SID>/trace |
Recréation des fichiers de configuration
Bien que les fichiers de configurations aient été copiés lors du clonage, pour plus de sécurité, nous recréons le spfile<SID>.ora, ainsi que les liens nécessaires depuis $ORACLE_HOME.
1 2 3 |
<oracle@CIBLE>$ ln -s /home/oracle/admin/<SID>/dbs/spfile<SID>.ora $ORACLE_HOME/dbs/spfile<SID>.ora <oracle@CIBLE>$ export ORACLE_SID=<SID> <oracle@CIBLE>$ sqlplus "/as sysdba" |
1 2 3 4 5 |
SQl> shutdown immediate SQL> startup nomount pfile='/home/oracle/admin/<SID>/dbs/init<SID>.ora'; SQL> create spfile='/home/oracle/admin/<SID>/dbs/spfile<SID>.ora' from pfile='/home/oracle/admin/<SID>/dbs/init<SID>.ora'; SQL> shutdown immediate; SQL> startup |
Vérification des fichiers de données
La dernière étape de notre clonage, consiste à vérifier que les fichiers de données, ont bien été crées. Pour se faire, se connecter avec l’utilisateur oracle, puis effectuer les commandes suivantes :
1 2 |
<oracle@CIBLE>$ export ORACLE_SID=<SID> <oracle@CIBLE>$ sqlplus "/as sysdba" |
1 2 3 4 5 6 |
SQL> set lines 150 pages 10000 SQL> col file_name for a65 SQL> col tablespace_name for a23 SQL> col status for a12 SQL> select file_name, tablespace_name, status, bytes/1024/1024 mbytes from dba_data_files order by 2,1; SQL> select file_name, tablespace_name, status, bytes/1024/1024 mbytes from dba_temp_files order by 2,1; |
Les opérations de vérifications sont terminées, la base de données cible a bien été clonée et, est dès à présent fonctionnelle.
Exécution des statistiques
Suite au clonage de la base de données, il s’avère important de passer le calcul des statistiques sur la base. Pour se faire, se connecter avec l’utilisateur oracle, puis effectuer les commandes suivantes :
1 2 |
<oracle@CIBLE>$ export ORACLE_SID=<SID> <oracle@CIBLE>$ sqlplus "/as sysdba" |
1 |
SQL> EXEC DBMS_STATS.gather_database_stats(estimate_percent => 15, cascade => TRUE); |