viernes, 30 de octubre de 2015

Cómo restaurar base de datos de Oracle 11g con el mismo nombre en otra máquina con RMAN

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:
  1. Base de datos de Oracle 11g orígen en modo archivelog
  2. Base de datos de Oracle 11g destino en modo archivelog
  3. Backup completo desde RMAN (backup database plus archivelog)
  4. La base de datos destino es una instalación reciente
  5. 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.
He querido mencionar esto de manera rápida ya que cada ambiente tiene sus propias características y es probable que quien lea este post cuente con algunas variaciones de estas condiciones.
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.




6 comentarios:

  1. James, una consulta si me puedes ayudar o perder las esperanzas. Se me daño la instalacion que tenia de oracle en mi computador y no estaba en modo archivelog. Solo saque copia al archivo users01d.dbf porque todos los esquemas estaban grabando a ese archivo; volvi a instalar el oracle pensando que ya tenia los respaldos, pero no era asi. Puedo recuperar los datos del archivo users01.dbf ?

    ResponderBorrar
    Respuestas
    1. Hola VAM. Te recomendaría realizar una instalación nueva lo más parecida a como la tenías antes de perderlaÑ tablespaces, usuarios, permisos, etc. Una vez con esto intentar colocar tu dbf pero con comandos de oracle en donde indicas que quieres usar el antigu dbf. No copy paste. Hay algunos otros tutoriales en internet sobre como mover un dbf.
      Veo mucho riesgo de no poder recuperar la información pero es lo que yo intentaría.
      Saludos.

      Borrar
  2. James.. he realizado todos los pasos, pero al finalizar el "recover database", sale el siguiente error :
    ORA-01547: warning: RECOVER succeeded but OPEN RESETLOGS would get error below
    ORA-01152: file 1 was not restored from a sufficiently old backup
    ORA-01110: data file 1: '/fsdom3/instancia/sys/sys01.dbf'
    y no puedo continuar.-. Gracias;

    ResponderBorrar
    Respuestas
    1. Hola Nat, tu base está en modo archive log? tus archivos a recuperar pertenecen al mismo backup?
      Me funcionó en una ocasión borrar los tres REDO logs fisicamente antes de ejecutar el script de recover.

      Saludos.

      Borrar
  3. Hola, gracias por el post, una consulta. tenia una base de datos Oracle11, no tengo ni idea de como estaba instalada pero tengo todos los archivos de esa carpeta con extensión .ORA. los puedo abrir o restaurar la base de datos de alguna manera?

    ResponderBorrar
    Respuestas
    1. Hola Gabriel.

      Con los archivos mencionados en el post debe ser posible la restauración, los .dbf son muy importantes también. Y al parecer que la version es 11 entonces el procedimiento puede tener éxito.

      Borrar