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

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

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 :

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 :

Début de la restauration le 13 septembre 2023
à l'aide du fichier de contrôle de la base de données cible au lieu du catalogue de récupération
canal alloué : ORA_DISK_1
canal ORA_DISK_1 : SID=237 type de périphérique=DISK
canal ORA_DISK_1 : démarrage de la restauration du jeu de sauvegarde du fichier de données
canal ORA_DISK_1 : spécification du ou des fichiers de données à restaurer à partir du jeu de sauvegarde
canal ORA_DISK_1 : restauration du fichier de données 00004 vers /data/tescopy/TESCOPY
.
.
démarrage de la récupération des supports
le journal archivé pour le thread 1 avec la séquence 23 se trouve déjà sur le disque sous la forme du fichier /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 : échec de la commande de récupération le 13/09/2023 à 13:15:18
RMAN-06054 : récupération des supports demandant un journal archivé inconnu pour le thread 1 avec la séquence 24 et le SCN de départ 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.

Oracle ACE Associate