Redirecting an Oracle Restore Using SET NEWNAME

Estamos en proceso de migracion de bases de datos a nuevas versiones, y como parte del proceso, en los clientes donde no tienen licencia para OGG, procedemos con la opcion de generar un Dataguars y luego realizar el UPGRADE.

Como las versiones de las cuales migramos hacia 12.2 son 11gR2, o 12c1, de bases que no estaban bajo la tecnologia de ASM, y si en filesystem procedemos a utilizar las opciones en el restore el set de comandos:

  • SET NEWNAME FOR DATABASE
  • SET NEWNAME FOR TABLESPACE

Con estos comandos es importante espcificar las varibles de paths de discos, para evitar problemas y que las piezas se restoreen donde es indicado:

Problema

En este caso en particular, el inconveniente que nos encontramos fue:

El TABLESPACE SYSTEM, contenia datafiles con el mismo nombre en el path /data01/datafiles y el path /data02/datafiles , provenientes del SOURCE y no teniendo habilitada la caracteristica OMF:

channel ORA_DISK_16: restoring datafile 00073 to +DATA_EXA2A/undotbs1.002.dbf
channel ORA_DISK_16: restoring datafile 00086 to +DATA_EXA2A/a_txn_data23.dbf
channel ORA_DISK_16: reading from backup piece /backup/EBSPROD/full_backup_diario_dbf_PROD_20180118_t965701613_p1_s92352.bkp
channel ORA_DISK_12: ORA-19870: error while restoring backup piece /backup/EBSPROD/full_backup_diario_dbf_PROD_20180118_t965698895_p1_s92347.bkp
ORA-19504: failed to create file "+DATA_EXA2A/system12.dbf"
ORA-17502: ksfdcre:4 Failed to create file +DATA_EXA2A/system12.dbf
ORA-15005: name "system12.dbf" is already used by an existing alias

Procedimiento

Para evitar colicionamiento de nombres, hay que especificas al menos una de las varibles, donde sustituiremos el nombre de los datafiles repetidos provenientes de diferentes filesystems.

Para ello podemos agregar al comanddo SET NEWNAME ciertas variables que podemos encontrar en la documentacion de oracle como:  %b, %f, or %U.

Pueden encontrar mas informacion de las variables soportadas en la  PARAMETERS TABLE que les deje.

Ejemplo:
run
{
set newname for database to "+DATA/PROD/DATAFILE/%U";
restore database;
switch datafile all;
recover database until scn 8377893202071;
}
exit;

Resolucion

Con los conceptos bien entendidos, procedi a obtener con un query los nuevos destinos, relacionando FILE_ID, con nuevo nombre:

run
{
set newname for datafile 13 to '+DATA_EXA2A/EBSPROD/datafile/system12.db';
set newname for datafile 104 to '+DATA_EXA2A/EBSPROD/datafile/system121.db';
restore database;
SWITCH DATAFILE 13; 
SWITCH DATAFILE 104;
} 
exit;