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
- Arrêter les applications qui utilisent la base cible.
- Se connecter au serveur cible et arrêter la base cible.
- Copier les fichiers de sauvegarde du serveur source au serveur cible.
- 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
-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
- 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/
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.