Clonage d’une base de données

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.

<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,

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.

<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.

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.

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 :

<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 :

<oracle@SOURCE>$ export ORACLE_SID=<SID>
<oracle@SOURCE>$ rman target /

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 :

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 :

RMAN> backup current controlfile;

Normalisation des backups & archivelog

Sous l’utilisateur oracle, effectuer les commandes suivantes, pour supprimer les vieilles occurrences d’archivelog :
<oracle@SOURCE>$ export ORACLE_SID=<SID>
<oracle@SOURCE>$ rman target /

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.
<oracle@CIBLE>$ export ORACLE_SID=<SID>
<oracle@CIBLE>$ sqlplus "/as sysdba"

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.

<oracle@CIBLE>$ rman target sys/<MDP>@SOURCE_<SID>
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 :

<oracle@CIBLE>$ export ORACLE_SID=<SID>
<oracle@CIBLE>$ sqlplus "/as sysdba"

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.

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 :

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.
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

<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.
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.

<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"

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 :

<oracle@CIBLE>$ export ORACLE_SID=<SID>
<oracle@CIBLE>$ sqlplus "/as sysdba"


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 :

<oracle@CIBLE>$ export ORACLE_SID=<SID>
<oracle@CIBLE>$ sqlplus "/as sysdba"

SQL> EXEC DBMS_STATS.gather_database_stats(estimate_percent => 15, cascade => TRUE);

Lien pour marque-pages : Permaliens.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *