Bien qu'il soit moins courant de devoir récupérer une base de données sur la même machine que sur un hôte différent, nous allons indiquer dans ce billet les étapes nécessaires pour pouvoir récupérer une base de données sur le même hôte, dans ce cas nous n'utilisons pas ASM comme stockage. La base de données source est appelée "test" et notre copie sera appelée "testcopy".
Pour ce faire, nous partons d'une sauvegarde effectuée précédemment.
Dans notre cas, nous avons lancé ce qui suit :
RMAN> run {
allocate channel t1 type disk;
allocate channel t2 type disk;
allocate channel t3 type disk;
allocate channel t4 type disk;
backup format ‘/u01/backup/%U’ (base de datos);
backup format ‘/u01/backup/%U’ (archivelog all);
backup format ‘/u01/backup/%U’ current controlfile;
}
Avant de commencer, créons l'entrée dans oratab pour la nouvelle base de données.
Editez le fichier oratab et ajoutez la nouvelle base de données :
vi /etc/oratab
test:/u01/sw:N
testcopy:/u01/sw:N
La première étape consiste à copier le fichier p de la base de données actuelle, dans notre cas "test", avec lequel nous allons démarrer notre base de données, avec les paramètres minimums nécessaires. Un fichier init avec les paramètres minimums serait quelque chose de similaire à ce que je montre ici.
Il est très important de prêter attention aux paramètres "db_create_file_dest" où nous indiquons où nos données seront stockées, dans ce scénario c'est très important, puisque nous récupérons la base de données dans le même hôte où nous avons notre base de données source, il est également très important le paramètre "db_unique_name", qui va différencier notre copie de l'original.
[oracle@localhost dbs]$ cat inittestcopy.ora
*.compatible='19.0.0′
*.db_block_size=8192
*.db_create_file_dest='/data/testcopy/'
*.db_name='test'
*.db_unique_name='testcopy'
*.diagnostic_dest='/u01/app/oracle'
*.open_cursors=300
*.pga_aggregate_target=797m
*.processes=300
*.remote_login_passwordfile='EXCLUSIVE'
*.sga_target=2388m
*.undo_tablespace='UNDOTBS1′
Nous créons le fichier spfile de notre nouvelle base de données à l'aide du fichier pfile.
SQL> create spfile from pfile='inittestcopy.ora' ;
Fichier créé.
Nous vérifions que le fichier spfile a été créé correctement :
SQL> startup nomount
L'instance ORACLE a démarré.
Total System Global Area 2516581464 bytes
Fixed Size 8899672 bytes
Variable Size 536870912 bytes
Database Buffers 1962934272 bytes
Redo Buffers 7876608 bytes
SQL> show parameter pfile
NAME TYPE VALUE
---------------------
spfile string /u01/sw/dbs/spfiletestcopy.ora
Nous restaurons le fichier de contrôle :
Nous nous connectons à RMAN et récupérons le fichier de contrôle.
Note. Nous pouvons localiser la sauvegarde du fichier de contrôle en nous connectant à la base de données "originale", ou à la base de données à copier, dans notre cas test , et en exécutant la commande suivante.
RMAN> list backup of controlfile ;
Connecté à la base de données testcopy, par l'intermédiaire de rman, nous récupérons la copie du fichier de contrôle que nous avons localisé précédemment.
RMAN> restore controlfile from '/u01/backup/0e267imt_1_1' ;
Starting restore at 12-SEP-23
using target database control file instead of recovery catalog
allocated channel : ORA_DISK_1
channel ORA_DISK_1 : SID=17 device type=DISK
channel ORA_DISK_1 : restoring control file
channel ORA_DISK_1 : restore complete, elapsed time : 00:00:03
output file name=/data/testcopy/TESTCOPY/controlfile/o1_mf_lj1qob64_.ctl
Restauration terminée le 12-SEP-23
Nous avons mis en place la base de données :
RMAN> alter database mount ;
released channel : ORA_DISK_1
Déclaration traitée
Avant de lancer la récupération de la base de données, vérifions que les fichiers redo log se trouvent dans le bon chemin. Cette vérification peut être effectuée à l'aide de la requête suivante :
set lines 200
col member format a60
select a.thread#,a.group#,b.type,b.member,a.bytes/1048576
from v$log a,v$logfile b
where a.group#=b.group# order by a.group# ;
Si les redo logs pointent vers l'ancienne base de données, nous devons les changer pour l'emplacement qu'ils auront dans notre nouvelle base de données. Pour ce faire, nous lançons la commande suivante :
SQL> alter database rename file ‘<old file location and name>’ to ‘<new location and name>’;
Vous pouvez vous aider d'une requête comme la suivante pour le faire automatiquement ;
select ‘ALTER DATABASE RENAME FILE »’||member||»’ TO »<localización destino> ||substr(member,INSTR(member,’\’,-1,1),length(member)) ||»’;’ from v$logfile;
Nous renommons les fichiers de données et les comparons à la requête lancée précédemment pour nous assurer que le changement d'emplacement est correct :
ALTER DATABASE RENAME FILE '/data/test/TEST/onlinelog/o1_mf_3_hz8q3jd1_.log' TO '/data/testcopy/TESTCOPY/redolog/o1_mf_3_hz8q3jd1_.log' ;
ALTER DATABASE RENAME FILE '/u01/app/oracle/fast_recovery_area/TEST/onlinelog/o1_mf_3_hz8q4lbd_.log' TO '/data/testcopy/TESTCOPY/redolog/o1_mf_3_hz8q4lbd_.log' ;
ALTER DATABASE RENAME FILE '/data/test/TEST/onlinelog/o1_mf_2_hz8q3jcc_.log' TO '/data/testcopy/TESTCOPY/redolog/o1_mf_2_hz8q3jcc_.log' ;
ALTER DATABASE RENAME FILE '/u01/app/oracle/fast_recovery_area/TEST/onlinelog/o1_mf_2_hz8q4qgp_.log' TO '/data/testcopy/TESTCOPY/redolog/o1_mf_2_hz8q4qgp_.log' ;
ALTER DATABASE RENAME FILE '/data/test/TEST/onlinelog/o1_mf_1_hz8q3jbo_.log' TO '/data/testcopy/TESTCOPY/redolog/o1_mf_1_hz8q3jbo_.log' ;
ALTER DATABASE RENAME FILE '/u01/app/oracle/fast_recovery_area/TEST/onlinelog/o1_mf_1_hz8q4lfp_.log' TO '/data/testcopy/TESTCOPY/redolog/o1_mf_1_hz8q4lfp_.log' ;
SQL> set lines 200
col member format a60
select a.thread#,a.group#,b.type,b.member,a.bytes/1048576
from v$log a,v$logfile b
where a.group#=b.group# order by a.group#;SQL> SQL> 2 3
THREAD# GROUP# TYPE MEMBER A.BYTES/1048576
1 1 ONLINE /data/testcopy/TESTCOPY/redolog/o1_mf_1_hz8q4lfp_.log
Nous restaurons la base de données à l'aide de la sauvegarde RMAN.
La base cible (testcopy) étant montée, nous lançons la commande suivante :
run{
set newname for database to ‘/data/tescopy/TESCOPY/%U’;
RESTORE DATABASE;
SWITCH DATAFILE ALL;
RECOVER DATABASE;
}
La commande "set newname for database to" indique l'endroit où nous voulons que nos nouveaux fichiers de base de données soient stockés, ce qui peut être fait manuellement, en renommant chaque fichier de données, ou de la manière décrite dans ce document.
Si tout est correct, vous obtiendrez un résultat similaire à celui-ci :
Starting restore at 13-SEP-23
using target database control file instead of recovery catalog
allocated channel : ORA_DISK_1
channel ORA_DISK_1 : SID=237 device type=DISK
channel ORA_DISK_1 : starting datafile backup set restore
channel ORA_DISK_1 : specifying datafile(s) to restore from backup set
channel ORA_DISK_1 : restoring datafile 00004 to /data/tescopy/TESCOPY
.
.
starting media recovery
archived log for thread 1 with sequence 23 is already on disk as file /u01/app/oracle/fast_recovery_area/TEST/archivelog/2023_09_12/o1_mf_1_23_lj1pkgkj_.arc
fichier journal archivé name=/u01/app/oracle/fast_recovery_area/TEST/archivelog/2023_09_12/o1_mf_1_23_lj1pkgkj_.arc thread=1 sequence=23
unable to find archived log
archived log thread=1 sequence=24
RMAN-00571 : ===========================================================
RMAN-00569 : =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571 : ===========================================================
RMAN-03002 : failure of recover command at 09/13/2023 13:15:18
RMAN-06054 : media recovery requesting unknown archived log for thread 1 with sequence 24 and starting SCN of 313766 (Récupération de média demandant un journal archivé inconnu pour le thread 1 avec la séquence 24 et le SCN de départ de 313766).
Cette sortie indique que la base de données a été récupérée avec succès et que la dernière archive disponible a été appliquée.
Nous pouvons maintenant ouvrir notre base de données.
SQL> alter database open resetlogs ;
Base de données modifiée.
Nous vérifions que tout est correct :
SQL> select name from v$datafile ;
/data/tescopy/TESCOPY/data_D-TEST_TS-SYSTEM_FNO-1
/data/tescopy/TESCOPY/data_D-TEST_TS-SYSAUX_FNO-3
/data/tescopy/TESCOPY/data_D-TEST_TS-UNDOTBS1_FNO-4
/data/tescopy/TESCOPY/data_DEST_TS-USERS_FNO-7 /data/tescopy/TESCOPY/data_D-TEST_TS-USERS_FNO-7
SQL> Select member from v$logfile ;
/data/testcopy/TESTCOPY/onlinelog/o1_mf_3_lj37cp5g_.log
/data/testcopy/TESTCOPY/onlinelog/o1_mf_2_lj37cp4r_.log
/data/testcopy/TESTCOPY/onlinelog/o1_mf_1_lj37cp41_.log
Dans ce dernier point, nous aurions déjà la base de données récupérée, dans ce cas il peut être intéressant de renommer la base de données, puisque le DBID et le DB_NAME de la base de données originale et de la copie seront les mêmes. Pour cela, je recommande de le faire avec l'outil NID, c'est mieux que de le faire manuellement.