Vous êtes nouveau sur Developpez.com ? Créez votre compte ou connectez-vous afin de pouvoir participer !

Vous devez avoir un compte Developpez.com et être connecté pour pouvoir participer aux discussions.

Vous n'avez pas encore de compte Developpez.com ? Créez-en un en quelques instants, c'est entièrement gratuit !

Si vous disposez déjà d'un compte et qu'il est bien activé, connectez-vous à l'aide du formulaire ci-dessous.

Identifiez-vous
Identifiant
Mot de passe
Mot de passe oublié ?
Créer un compte

L'inscription est gratuite et ne vous prendra que quelques instants !

Je m'inscris !

Découvrez une méthode pour copier une base de données Oracle vers un autre serveur avec la commande RMAN
Un billet blog de Cinephil

Le , par CinePhil

0PARTAGES

À partir de la sauvegarde à chaud d'une base Oracle, présentée récemment, je vous propose ici une méthode pour transporter cette sauvegarde sur un autre serveur afin de remplacer une base existante par la sauvegarde.
Le cas typique est la copie d'une base de production vers une base de test.
Tout ce qui suit utilise Rman de Oracle Database 12, sur des serveurs Oracle Linux.
Merci à Farouk Mansouri, de Capdata, qui m'a donné la grosse commande Rman de chargement des données.

1. Scénario de copie
Le scénario ci-après réalise la copie de la sauvegarde de la base de production nommée "prod" du serveur "oracleprod" vers la base de test nommée "test" du serveur "oracletest". Pour réaliser la même opération vers une autre base, il suffit de remplacer "test" par le nom de la base cible.

On peut s'en inspirer pour restaurer la base de production à partir d'une sauvegarde, en ayant bien à l'esprit que toutes les données saisies depuis la sauvegarde seront perdues ! Il y a d'autres manipulations à faire pour récupérer au moins une partie des données saisies depuis la dernière sauvegarde, grâce aux archivelogs et redologs, que je ne présente pas ici.

1.1 Déroulement du scénario
  1. Arrêter les applications qui utilisent la base cible.
  2. Se connecter au serveur cible et arrêter la base cible.
  3. Copier les fichiers de sauvegarde du serveur source au serveur cible.
  4. Remplacer la base cible par la sauvegarde de la base source.


2. Instructions détaillées
2.1 Arrêter les applications qui utilisent la base cible.
Durant l'opération, la base de données cible sera inaccessible. Si vous ne voulez pas avoir des coups de fil d'utilisateurs paniqués , prévenez-les et arrêtez les applications qui utilisent la base de données cible.
Ceci dépend de votre configuration (arrêt des services Tomcat ou Webobject, par exemple), je ne m'étends donc pas davantage.

2.2 Se connecter au serveur cible et arrêter la base cible.
Sur le serveur de test, une fois connecté avec un user reconnu par Oracle :
Code bash : Sélectionner tout
1
2
3
4
5
set ORACLE_SID=test 
sqlplus / "sys/[mot de passe]" as sysdba 
shutdown immediate; 
startup nomount; 
quit;

2.3 Copier les fichiers de sauvegarde du serveur source au serveur cible.
Sur le serveur de test, j'ai un répertoire où enregistrer les fichiers de sauvegarde transférés depuis le serveur de production. La première chose à faire est de supprimer les fichiers éventuels d'une précédente copie de base :
Code bash : Sélectionner tout
1
2
cd /chemin/vers/rep/de/transfert 
rm -f *

Dans une autre console de commande, se connecter au serveur source et aller dans le répertoire des sauvegardes et afficher les fichiers :
Code bash : Sélectionner tout
1
2
3
ssh user@oracleprod.domaine 
cd /chemin/vers/rep/de/sauvegarde 
ll

Exemple d'affichage obtenu par la commande ll :
total 2300244
-rw-rw---- 1 oracle oracle 218624 4 sept. 03:32 arch_bckp_4ouasr2t_1_1
-rw-rw---- 1 oracle oracle 116795904 5 sept. 03:30 arch_bckp_4quavf9s_1_1
-rw-rw---- 1 oracle oracle 208384 5 sept. 03:32 arch_bckp_4suavfej_1_1

-rw-rw---- 1 oracle oracle 10518528 4 sept. 03:32 cf_c-3503333691-20190904-00
-rw-rw---- 1 oracle oracle 10518528 5 sept. 03:32 cf_c-3503333691-20190905-00
-rw-rw---- 1 oracle oracle 1108770816 4 sept. 03:32 db_bckp_4nuasquc_1_1
-rw-rw---- 1 oracle oracle 1108402176 5 sept. 03:32 db_bckp_4ruavfac_1_1

Je conserve sur le serveur de prod les deux dernières sauvegardes. Il faut transférer vers le serveur de test les fichiers de la dernière sauvegarde : ceux du 5 septembre que j'ai colorié en bleu. Il y a :
  • la sauvegarde des fichiers des archivelogs, commençant par "arch_bckp_"
  • la sauvegarde du fichier de contrôle, commençant par "cf_"
  • la sauvegarde des données, commençant par "db_bckp_"


Transfert des fichiers du serveur de prod vers le serveur de test avec scp :
Code : Sélectionner tout
scp arch_bckp_4quavf9s_1_1 arch_bckp_4suavfej_1_1 cf_c-3503333691-20190905-00 db_bckp_4ruavfac_1_1 user@oracletest.domaine:/chemin/vers/rep/de/transfert/
La commande scp va vous demander le mot de passe du user qui se connecte. Une fois la copie terminée, vous pouvez quitter le serveur source (prod, dans notre cas). Ça évite de faire des manipulations hasardeuses dessus en se trompant de console !

2.4 Remplacer la base cible par la sauvegarde de la base source.
Revenir sur la console du serveur de test. Je suppose ici que vous ne l'avez pas quittée et que ORACLE_SID est toujours bien valorisé à "test".

Comme on a utilisé Rman pour la sauvegarde, on va aussi l'utiliser pour charger celle-ci sur la base de test.
Code bash : Sélectionner tout
1
2
rman auxiliary / 
duplicate database to test backup location '/chemin/vers/rep/de/transfert' DB_FILE_NAME_CONVERT 'chemin/vers/rep/donnees/base/source','chemin/vers/rep/donnees/base/cible' LOGFILE GROUP 1('/chemin/vers/rep/redofiles/base/cible/redo01a.log') SIZE 16m, GROUP 2('/chemin/vers/rep/redofiles/base/cible/redo02a.log') SIZE 16m, GROUP 3('/chemin/vers/rep/redofiles/base/cible/redo03a.log') SIZE 16m, GROUP 4('/chemin/vers/rep/redofiles/base/cible/redo04a.log') SIZE 16m;

Quelques explications sur la commande exécutée dans Rman...
On dupplique la source (prod) sur la cible (test). Le paramètre DB_FILE_NAME_CONVERT demande à Rman de convertir le nom de la base source en nom de la base cible. En effet, ceci est enregistré dans le controlfile... qui vient de la prod. Mais comme on ne souhaite pas renommer la base test en prod mais lui conserver son nom de "test", il faut indiquer quoi remplacer dans le fichier de contrôle : 'chemin/vers/rep/donnees/base/source' qu'on transforme en 'chemin/vers/rep/donnees/base/cible'.
Ensuite, avec LOGFILE, on reconstruit des fichiers de redologs vides pour la base de données test. Il ne faut en effet pas que la base de test redémarre avec ses anciens fichiers de redologs qui sont incohérents avec ce qui provient de la base de prod. Cette partie de la commande est à adapter au nombre de redofiles que vous avez et à leur taille.

Rman se débrouille tout seul pour remplacer les données actuelles de la base de test par celles de la base de prod, reconstituer le controlfile, nettoyer son catalogue de sauvegarde, si vous avez une sauvegarde de données aussi sur la base de test, puis redémarrer la base de test.

Si tout s'est bien passé, vous pouvez vous déconnecter de Rman avec quit et réutiliser la base de test, redémarrer les applications qui l'utilisent...

Il est sans doute possible de faire un script bash global pour automatiser tout ça mais ça ne fait que quelques fois que j'utilise cette procédure et je ne me suis pas encore penché sur le sujet.

Une erreur dans cette actualité ? Signalez-le nous !