Dans le cadre du travail d’un administrateur de base de données, il est parfois utile de savoir cloner/renommer une base de données. En effet, cette opération peut être exécutée dans le cadre de tests de certaines instances, notamment sur la même machine sans pour autant arrêter la base déjà présente, pour permettre notamment aux développeurs d’accéder à une base de production fonctionnelle. Cette méthode peut s’apparenter à un clonage rapide de la base de données sans passer par l’outil RMAN. Nous verrons la méthode de clonage via RMAN au cours d’un autre article.
Principe de fonctionnement
Cette procédure de clonage rapide peut être utilisée pour migrer une base de données d’un serveur UNIX à un autre. En effet, le fait d’utiliser cette méthode est la méthode la plus rapide pour copier une base de données Oracle. Dans le cas présent, nous considérerons que nous effectuons le renommage sur la même machine.
Détail des étapes
Sur notre 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 fichier sql de génération de la base de données, lisible et interprétable pour un être humain.
1 |
SQL> ALTER DATABASE BACKUP CONTROLFILE TO TRACE AS '/tmp/backup_controlfile.sql' REUSE; |
Remarque :
Dans ce cas précis, la clause REUSE n’a de sens que si le fichier existe déjà et n’est absolument pas obligatoire. Toutefois, si effectivement, le fichier est présent, alors la directive de création sortira en erreur, et le fichier ne sera pas généré.
Remarque bis:
Si la commande AS ‘/tmp/backup_controlfile.sql’ n’est pas précisée, ce sera le chemin renseigné dans le paramètre user_dump_dest du fichier init<SID>.ora qui sera utilisé.
Le fichier généré doit ressembler à ceci :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
STARTUP NOMOUNT CREATE CONTROLFILE REUSE DATABASE "OLDLSQ" NORESETLOGS NOARCHIVELOG MAXLOGFILES 16 MAXLOGMEMBERS 2 MAXDATAFILES 240 MAXINSTANCES 1 MAXLOGHISTORY 113 LOGFILE GROUP 1 ( '/u03/oradata/oldlsq/log1a.dbf', '/u03/oradata/olslsq/log1b.dbf' ) SIZE 30M, GROUP 2 ( '/u04/oradata/oldlsq/log2a.dbf', '/u04/oradata/oldlsq/log2b.dbf' ) SIZE 30M DATAFILE '/u01/oradata/oldlsq/system01.dbf', '/u01/oradata/oldlsq/mydatabase.dbf' CHARACTER SET WE8ISO8859P15 ; # Recovery is required if any of the datafiles are restored # backups, or if the last shutdown was not normal or immediate. RECOVER DATABASE # Database can now be opened normally. ALTER DATABASE OPEN; |
Remarque :
Il est important de noter que le fichier généré, propose deux méthodes de création, avec RESETLOGS et sans RESETLOGS. Dans le cas présent, nous utiliserons le cas RESETLOGS.
- ETAPE 2
Pour cette étape, rappelons que nous sommes sur la même machine, d’où l’arrêt de la base de données. Si vous êtes sur une machine différente, alors vous n’avez pas besoin d’arrêter la base de données source. Se connecter sur une session SQL*PLUS en tant que sysdba, et arrêter la base de données.
1 |
SQL> SHUTDOWN IMMEDIATE |
- ETAPE 3
Cette étape consiste au déplacement des fichiers vers les nouveaux répertoires du serveur; vous pouvez également effectuer un renommage des fichiers si vous le souhaitez.
1 2 3 4 |
<oracle@TEST>$ rcp /u01/oradata/oldlsq/* newhost:/u01/oradata/newlsq <oracle@TEST>$ rcp /u01/oradata/oldlsq/* newhost:/u01/oradata/newlsq <oracle@TEST>$ rcp /u03/oradata/oldlsq/* newhost:/u03/oradata/newlsq <oracle@TEST>$ rcp /u04/oradata/oldlsq/* newhost:/u04/oradata/newlsq |
Remarque :
Lors de la copie des fichiers, les controlfiles ne doivent pas l’être. En effet, le script SQL généré gère automatiquement la recréation de ces fichiers.
- ETAPE 4
Le déplacement des fichiers physique est maintenant terminé, nous devons mettre à jour le fichier généré lors de l’étape 1. Editez donc le fichier et changez le nom de l’ancienne base, par le nouveau nom d’instance dans toutes les occurrences du fichier.
1 2 3 4 |
Ancienne version : CREATE CONTROLFILE REUSE DATABASE "<ANCIEN_SID>" NORESETLOGS</span> Nouvelle version : CREATE CONTROLFILE SET DATABASE "<NOUVEAU_SID>" RESETLOGS |
1 2 3 4 5 6 |
Ancienne version : '/u01/oradata/<ANCIEN_SID>/system01.dbf', '/u01/oradata/<ANCIEN_SID>/mydatabase.dbf' Nouvelle version : '/u01/oradata/<NOUVEAU_SID>/system01.dbf', '/u01/oradata/<NOUVEAU_SID>/mydatabase.dbf' |
- ETAPE 5
Supprimer ensuite les instructions suivantes RECOVER DATABASE et ALTER DATABASE OPEN du fichier, et remplacer ALTER DATABASE OPEN par ALTER DATABASE OPEN RESETLOGS
1 2 3 4 5 |
# Recovery is required if any of the datafiles are restored # backups, or if the last shutdown was not normal or immediate. # RECOVER DATABASE # Database can now be opened normally. ALTER DATABASE OPEN RESETLOGS; |
- ETAPE 6
Créer les répertoires nécessaires à la nouvelle base de données : bdump, cdump, udump.
1 2 |
<oracle@TEST>$ cd $DBA/admin <oracle@TEST>$ mkdir bdump cdump udump |
- ETAPE 7
Réaliser la copie de l’ancien fichier init
1 |
<oracle@TEST>$ rcp $DBA/admin/olslsq/pfile/*.ora newhost:/u01/oracle/admin/newlsq/pfile |
- ETAPE 8
Exécuter le script que nous avons modifié tout au long des différentes étape, ce qui aura pour effet de démarrer la base de données, puis de créer les controlfiles associés et ensuite démarrer la base de données.
1 |
SQL> @/tmp/backup_controlfile.sql |
N’oubliez pas de basculer la base de données en mode archivelog à la fin de la restauration (si cela est nécessaire).
1 2 3 4 |
SQL> SHUTDOWN IMMEDIATE SQL> STARTUP MOUNT EXCLUSIVE SQL> ALTER DATABASE ARCHIVELOG; SQL> ALTER DATABASE OPEN; |
Conclusion
Nous avons vu lors de cet article, la méthode la plus facile pour créer / cloner une base de données. Le clonage peut être réalisé de différentes manières, mais celle-ci constitue la plus rapide et la moins fastidieuse. Nous verrons lors de prochains articles comment cloner une base de données via l’outil RMAN. Ce qui nécessite moins d’opérations en termes de copies de fichiers et de manipulations de fichier, mais qui oblige à configurer les plateformes pour effectuer la copie.