Restaurar base de datos de Oracle con el mismo nombre en otra máquina con RMAN
Es una tarea común tener que restaurar una base de datos de Oracle 11g con el mismo nombre con RMAN en una máquina local de desarrollo para hacer pruebas o tener un respaldo reciente disponible de la información.
Algunas consideraciones antes de continuar leyendo este post es que este procedimiento fue realizado con las siguientes condiciones:
- Base de datos de Oracle 11g orígen en modo archivelog
- Base de datos de Oracle 11g destino en modo archivelog
- Backup completo desde RMAN (backup database plus archivelog)
- La base de datos destino es una instalación reciente
- El nombre de ambas bases de datos es el mismo, tanto de la máquina de donde se tomó el backup como el de la máquina donde se va a restaurar.
Además por lo que vi estoy muy seguro de que este procedimiento funciona también para una base de datos destino que no esté en modo archivelog.
En este ejemplo mi base de datos orígen se encuentra en la unidad D mientras que la base de datos destino se encuentra en la unidad C.
Acerca del backup:
1. Desde la máquina orígen realizar un backup de la base de datos completa incluyendo los archivelogs
RMAN>BACKUP DATABASE PLUS ARCHIVELOG;
Esta instruccion te generará archivos con la fecha actual sobre las carpetas flash_recovery_area/[instancia]/BACKUPSET y flash_recovery_area/[instancia]/AUTOBACKUP
Ejemplo:
D:\app\instancia\flash_recovery_area\INSTANCIA\AUTOBACKUP\2015_10_17
D:\app\instancia\flash_recovery_area\INSTANCIA\BACKUPSET\2015_10_17
2. Crear un pfile en la maquina orígen desde sqlplus:
SQL>CREATE PFILE='C:\TEMP\pfileINSTANCIA.ora' FROM SPFILE;
3. Copiar las carpetas anteriores en el recovery area de tu base de datos destino la cual puede ser una ruta diferente de unidad o directorio.
Ejemplo:
C:\app\administrator\flash_recovery_area\INSTANCIA
4. Copiar el PFILE a cualquier dirección temporal en tu máquina destino y modificar las rutas necesarias de acuerdo a las rutas en la máquina destino.
C:\TEMP\pfileINSTANCIA.ora
instancia.__db_cache_size=285212672
instancia.__java_pool_size=16777216
instancia.__large_pool_size=16777216
instancia.__oracle_base='C:\app\administrator'#ORACLE_BASE set from environment
instancia.__pga_aggregate_target=587202560
instancia.__sga_target=1090519040
instancia.__shared_io_pool_size=0
instancia.__shared_pool_size=738197504
instancia.__streams_pool_size=16777216
*.audit_file_dest='C:\app\administrator\admin\INSTANCIA\adump'
*.audit_trail='db'
*.compatible='11.2.0.0.0'
*.control_files='C:\app\administrator\oradata\INSTANCIA\CONTROL01.CTL'
*.db_block_size=8192
*.db_domain=''
*.db_flashback_retention_target=60
*.db_name='INSTANCIA'
*.db_recovery_file_dest='C:\app\administrator\flash_recovery_area'
*.db_recovery_file_dest_size=53687091200
*.diagnostic_dest='C:\app\administrator'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=INSTANCIAXDB)'
*.memory_target=1674575872
*.open_cursors=300
*.processes=150
*.remote_login_passwordfile='EXCLUSIVE'
*.undo_tablespace='UNDOTBS1'
Procedimiento restaurar base de datos de Oracle 11g en otra máquina con RMAN en la máquina destino:
*Recomiendo siempre abrir RMAN con la consola de windows como administrador para evitar otros problemas con los que me he topado.
Una cosa importante a mencionar es que tengo inicialmente el enterprise manager configurado en la base de datos destino pero al momento de restaurar este se corrompe y ya no puedo accederlo.
Estoy tratando de averiguar como levantarlo después de restaurar la base de datos pero eso será digno de otro post.
Van a necesitar el dbid de la base de datos orígen, esto lo consiguen con una consulta:
SQL>SELECT DBID FROM V$DATABASE;
Aquí los comandos RMAN y SQL con letras chicas para que puedan leerlo por líneas.
Desde RMAN:
RMAN TARGET /
SHUTDOWN IMMEDIATE;
SET DBID 4042975402; --dbid de la base de datos orígen
STARTUP NOMOUNT PFILE='C:\TEMP\pfileINSTANCIA.ORA'; --PFILE creado en la máquina orígen y colocado en la máquina destino
RESTORE CONTROLFILE FROM 'C:\app\administrator\flash_recovery_area\INSTANCIA\AUTOBACKUP\2015_10_17\O1_MF_S_893351462_C25KVQ6D_.BKP'; --el controlfile se encuentra en el backup en la carpeta AUTOBACKUP copiada anteriormente
ALTER DATABASE MOUNT;
CROSSCHECK BACKUP; --Identificar el backup disponible en el directorio de flash recovery area
DELETE NOPROMPT EXPIRED BACKUP;
CROSSCHECK ARCHIVELOG ALL;
DELETE NOPROMPT EXPIRED ARCHIVELOG ALL;
LIST BACKUP OF DATABASE; --consulta de backups disponibles y su contenido
LIST ARCHIVELOG ALL;
LIST BACKUP; --obtener el ultimo sequence number de los archivelog en el backup. *Sumar uno para la instrucción SET UNTIL abajo
RUN
{
SET NEWNAME FOR DATAFILE 'D:\APP\INSTANCIA\ORADATA\INSTANCIA\SYSTEM01.DBF' TO 'C:\app\administrator\oradata\INSTANCIA\SYSTEM01.DBF';
SET NEWNAME FOR DATAFILE 'D:\APP\INSTANCIA\ORADATA\INSTANCIA\SYSAUX01.DBF' TO 'C:\app\administrator\oradata\INSTANCIA\SYSAUX01.DBF';
SET NEWNAME FOR DATAFILE 'D:\APP\INSTANCIA\ORADATA\INSTANCIA\UNDOTBS01.DBF' TO 'C:\app\administrator\oradata\INSTANCIA\UNDOTBS01.DBF';
SET NEWNAME FOR DATAFILE 'D:\APP\INSTANCIA\ORADATA\INSTANCIA\USERS01.DBF' TO 'C:\app\administrator\oradata\INSTANCIA\USERS01.DBF';
SET NEWNAME FOR DATAFILE 'D:\APP\INSTANCIA\ORADATA\INSTANCIA\INSTANCIA_IDX01.DBF' TO 'C:\app\administrator\oradata\INSTANCIA\INSTANCIA_IDX01.DBF';
SET NEWNAME FOR DATAFILE 'D:\APP\INSTANCIA\ORADATA\INSTANCIA\INSTANCIA_IDX02.DBF' TO 'C:\app\administrator\oradata\INSTANCIA\INSTANCIA_IDX02.DBF';
SET NEWNAME FOR DATAFILE 'D:\APP\INSTANCIA\ORADATA\INSTANCIA\INSTANCIA_DAT01.DBF' TO 'C:\app\administrator\oradata\INSTANCIA\INSTANCIA_DAT01.DBF';
SET NEWNAME FOR DATAFILE 'D:\APP\INSTANCIA\ORADATA\INSTANCIA\INSTANCIA_DAT02.DBF' TO 'C:\app\administrator\oradata\INSTANCIA\INSTANCIA_DAT02.DBF';
SET UNTIL SEQUENCE 6921 THREAD 1;
RESTORE DATABASE;
SWITCH DATAFILE ALL;
RECOVER DATABASE;
}
SQL "ALTER DATABASE RENAME FILE ''D:\app\instancia\oradata\INSTANCIA\REDO03.LOG'' TO ''C:\app\administrator\oradata\INSTANCIA\REDO03.LOG''";
SQL "ALTER DATABASE RENAME FILE ''D:\app\instancia\oradata\INSTANCIA\REDO02.LOG'' TO ''C:\app\administrator\oradata\INSTANCIA\REDO02.LOG''";
SQL "ALTER DATABASE RENAME FILE ''D:\app\instancia\oradata\INSTANCIA\REDO01.LOG'' TO ''C:\app\administrator\oradata\INSTANCIA\REDO01.LOG''";
ALTER DATABASE OPEN RESETLOGS;
Ahora desde SQLPLUS: Crear un SPFILE desde el PFILE y reemplazar el tablespace temporal.
SQL> CREATE SPFILE FROM PFILE='C:\TEMP\pfileINSTANCIA.ORA';
SQL> SHUTDOWN IMMEDIATE;
SQL> STARTUP;
SQL> CREATE TEMPORARY TABLESPACE TEMP01 TEMPFILE 'C:\app\administrator\oradata\INSTANCIA\TEMP0101.dbf' SIZE 200M AUTOEXTEND ON;
SQL> ALTER DATABASE DEFAULT TEMPORARY TABLESPACE TEMP01;
SQL> DROP TABLESPACE TEMP INCLUDING CONTENTS AND DATAFILES;
SQL> SHUTDOWN IMMEDIATE;
SQL> STARTUP NOMOUNT;
SQL> ALTER DATABASE MOUNT;
SQL> ALTER DATABASE OPEN;
Espero les sirva.
Recientemente he escrito un nuevo artículo más completo sobre cómo restaurar backup de RMAN en otro servidor windows con las mismas rutas.