Le blog d'Oracle en espagnol

Récupération d'une base de données sur le même hôte avec Rman

Aunque suele ser menos habitual tener que recuperar una base de datos en la misma máquina que en un host diferente, en esta entrada vamos a indicar los pasos necesarios para poder recuperar una base de datos en el mismo host, en este caso no estamos usando ASM como almacenamiento. La base de datos origen se llama «test» y nuestra copia se llamará «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

El primer paso es copiar el pfile de la base de datos actual, en nuestro caso «test» con el que arrancaremos nuestra base de datos, basta con los mínimos parámetros necesarios. Un fichero init con los parámetros mínimos sería algo parecido a lo que muestro aquí posteriormente.
Muy importante fijarse en los parámetros «db_create_file_dest» donde indicamos donde se guardarán nuestros datos, en este escenario es muy importante, ya que estamos recuperando la base de datos en un mismo host donde tenemos nuestra base de datos origen, también es muy importante el parámetro «db_unique_name», que diferenciará nuestra copia de la 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

Instance ORACLE démarrée.
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 :

Nos conectamos a RMAN y recuperamos el controlfile.
Nota. Podemos localizar el backup del controlfile, conectándonos a la base de datos «original», o base de datos a copiar, en nuestro caso test y ejecutar el siguiente comando.

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
archived log file 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

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

En este último punto, ya tendríamos la base de datos recuperada, en este caso puede ser interesante cambiar renombrar la base de datos, ya que el DBID y el DB_NAME de la base de datos original y la copia será el mismo. Para ello recomiendo realizarlo con la herramienta NID, mejor que de forma manual.

Mots-clés :
Oracle ACE