Restaurar o Duplicar una Base de Datos Oracle con un Respaldo Offline

Introducción

Una tarea común para un DBA es restaurar una base de datos desde un respaldo del pasado, ya sea para pruebas o para investigación, y para ello normalmente tienes que encontrar ese backup y restaurarlo en otra máquina. Aquí vamos a realizar esa tarea usando un Respaldo Offline o sea que se realiza con la base parada con el fin de evitar la parte del RECOVER y por lo tanto el uso de archive logs.

Prerrequisitos

Recientemente creamos una instancia multitenant patodb en Oracle 19c con una base de datos pluggable taller corriendo en una Virtual Machine Instance en Google Cloud Platform que vamos a usar como nuestro origen.

También necesitamos otra Virtual Machine Instance con el mismo sistema operativo y la misma versión instalada de Oracle software, la cual será nuestro destino de restauración.

RMAN Respaldo Offline

Ya que requerimos que no haya actividad para este respaldo, primero tenemos que parar la instancia.
Para eso nos conectamos a nuestra base target (local) usando RMAN para detener y luego montar la instancia (mount) para poder acceder a los archivos de datos y al respaldo:

[oracle@patoracle ~]$ rman target /

Recovery Manager: Release 19.0.0.0.0 - Production on Fri Jun 5 15:32:10 2020
Version 19.3.0.0.0

Copyright (c) 1982, 2019, Oracle and/or its affiliates.  All rights reserved.

connected to target database: PATODB (DBID=1820073908)

RMAN> shutdown immediate

using target database control file instead of recovery catalog
database closed
database dismounted
Oracle instance shut down

RMAN> startup mount

Oracle instance started
database mounted

Respaldo de la Base de Datos

Ahora podemos proceder con el respaldo de nuestra base datos con el comando backup database:

RMAN> backup database ;

Starting backup at 05-JUN-20
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=259 device type=DISK
channel ORA_DISK_1: starting compressed full datafile backup set
channel ORA_DISK_1: specifying datafile(s) in backup set
input datafile file number=00001 name=/oradata/cdbs/PATODB/system01.dbf
input datafile file number=00003 name=/oradata/cdbs/PATODB/sysaux01.dbf
input datafile file number=00013 name=/oradata/cdbs/PATODB/undotbs.dbf
input datafile file number=00007 name=/oradata/cdbs/PATODB/users01.dbf
channel ORA_DISK_1: starting piece 1 at 05-JUN-20
channel ORA_DISK_1: finished piece 1 at 05-JUN-20
piece handle=/rman/respaldo/PATODB_20200605_0rv232un.bkp tag=TAG20200605T153759 comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:35
channel ORA_DISK_1: starting compressed full datafile backup set
channel ORA_DISK_1: specifying datafile(s) in backup set
input datafile file number=00006 name=/oradata/cdbs/PATODB/pdbseed/sysaux01.dbf
input datafile file number=00005 name=/oradata/cdbs/PATODB/pdbseed/system01.dbf
input datafile file number=00008 name=/oradata/cdbs/PATODB/pdbseed/undotbs01.dbf
channel ORA_DISK_1: starting piece 1 at 05-JUN-20
channel ORA_DISK_1: finished piece 1 at 05-JUN-20
piece handle=/rman/respaldo/PATODB_20200605_0sv232vr.bkp tag=TAG20200605T153759 comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:15
channel ORA_DISK_1: starting compressed full datafile backup set
channel ORA_DISK_1: specifying datafile(s) in backup set
input datafile file number=00010 name=/oradata/pdbs/taller/sysaux01.dbf
input datafile file number=00009 name=/oradata/pdbs/taller/system01.dbf
input datafile file number=00012 name=/oradata/pdbs/taller/datos.dbf
channel ORA_DISK_1: starting piece 1 at 05-JUN-20
channel ORA_DISK_1: finished piece 1 at 05-JUN-20
piece handle=/rman/respaldo/PATODB_20200605_0tv2330a.bkp tag=TAG20200605T153759 comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:15
Finished backup at 05-JUN-20

Starting Control File and SPFILE Autobackup at 05-JUN-20
piece handle=/rman/controlfile/c-1820073908-20200605-06.bkp comment=NONE
Finished Control File and SPFILE Autobackup at 05-JUN-20

RMAN>

Podemos ver que RMAN respaldó la CDB raíz, la base de datos semilla y nuestra base pluggable taller.
Una vez terminado el respaldo procedemos a levantar la instancia:

RMAN> alter database open;

Statement processed

RMAN> exit

Recovery Manager complete.

y finalmente validamos que nuestros respaldos estén dentro de nuestro disco de RMAN.

[oracle@patoracle ~]$ ls /rman/controlfile
c-1820073908-20200605-06.bkp

[oracle@patoracle ~]$ ls /rman/respaldo
PATODB_20200605_0rv232un.bkp  PATODB_20200605_0sv232vr.bkp  PATODB_20200605_0tv2330a.bkp

Preparar la Máquina Virtual Destino

Para poder recuperar nuestra base de datos dentro de la nueva Virtual Machine necesitamos proveer:

  • El archivo de parámetros de base de datos init.ora de la base origen.
  • La misma estructura de directorios (de otra forma necesitaríamos pedirle a RMAN que hiciera conversión de nombres)
  • El respaldo offline disponible para leerse desde la nueva máquina.
  • Configurar la variable ORACLE_SID con el nombre de nuestra instancia.

Copiar el archivo init del origen

[oracle@patorestore ~]$ cd $ORACLE_HOME/dbs

[oracle@patorestore dbs]$ gcloud compute scp patoracle:$ORACLE_HOME/dbs/initpatodb.ora .
initpatodb.ora                                                100% 1350   776.7KB/s   00:00

Crear la estructura de directorios

Crea los mismos directorios donde se guardan los archivos de datos en el origen, así como los directorios referidos por el archivo init.ora:

[oracle@patorestore ~]$ sudo mkdir /oradata
[oracle@patorestore ~]$ sudo chown oracle:oinstall /oradata

[oracle@patorestore ~]$ mkdir /oradata/cdbs
[oracle@patorestore ~]$ mkdir /oradata/pdbs
[oracle@patorestore ~]$ mkdir /oradata/recovery
[oracle@patorestore ~]$ mkdir /oradata/cdbs/PATODB
[oracle@patorestore ~]$ mkdir /oradata/recovery/PATODB

[oracle@patorestore ~]$ mkdir -p /opt/oracle/admin/patodb/adump

Montar el disco RMAN

Agregar nuestro disco de RMAN a la nueva Virtual Machine y entonces montarlo en el directorio /rman:

[oracle@patorestore ~]$ sudo mkdir /rman
[oracle@patorestore ~]$ sudo chown oracle:oinstall /rman

[oracle@patorestore ~]$ sudo mount -o discard,defaults /dev/sdb /rman

[oracle@patorestore ~]$ cd /rman
[oracle@patorestore rman]$ ls
controlfile  lost+found  respaldo

Para más información sobre el disco de RMAN que estamos usando favor de revisar Usar un Disco de Google Compute Engine para respaldos de RMAN

Configurar las Variables de Oracle

Exporta las siguientes variables de Oracle; para que persistan inclúyelas en el .bash_profile:

[oracle@patorestore ~]$ vi .bash_profile

# Database Variables
export ORACLE_BASE=/opt/oracle
export ORACLE_HOME=/opt/oracle/product/19c/dbhome_1
export PATH=$ORACLE_HOME/bin:$PATH
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$LD_LIBRARY_PATH
export ORACLE_SID=patodb

y valida que hayan quedado configuradas en las variables de ambiente:

[oracle@patorestore ~]$ env | grep ORA
ORACLE_SID=patodb
ORACLE_BASE=/opt/oracle
ORACLE_HOME=/opt/oracle/product/19c/dbhome_1

Restauración con RMAN

Ahora que nuestro ambiente está preparado necesitamos conectarnos a RMAN para realizar nuestra restauración.

Restaurar el ControlFile

Como ésta nueva instalación está vacía primero necesitamos restaurar el archivo de control para que podamos acceder a la información de los respaldos y los archivos de datos.
Para ello iniciamos la base con la opción nomount:

[oracle@patorestore ~]$ rman target /

Recovery Manager: Release 19.0.0.0.0 - Production on Fri Jun 5 17:48:11 2020
Version 19.3.0.0.0

Copyright (c) 1982, 2019, Oracle and/or its affiliates.  All rights reserved.

connected to target database (not started)

RMAN> startup nomount

Oracle instance started

y enviamos el comando restore controlfile from apuntando al respaldo de controlfile dentro de nuestro disco de RMAN:


RMAN> restore controlfile from "/rman/controlfile/c-1820073908-20200605-06.bkp";

Starting restore at 05-JUN-20
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=253 device type=DISK

channel ORA_DISK_1: restoring control file
channel ORA_DISK_1: restore complete, elapsed time: 00:00:01
output file name=/oradata/cdbs/PATODB/control01.ctl
output file name=/oradata/recovery/PATODB/control02.ctl
Finished restore at 05-JUN-20

podemos ver que el controlfile fue restaurado en los lugares indicados por el init.ora

Revisar la Disponibilidad del Respaldo

Con acceso al controlfile podemos revisar los respaldos que están registrados y así validar que nuestro respaldo offline está en la lista. Necesitamos montar la base y ver el respaldo del día de hoy con el comando list backup:

RMAN> alter database mount;

released channel: ORA_DISK_1
Statement processed

RMAN> LIST BACKUP OF DATABASE COMPLETED AFTER '(SYSDATE-1)';

List of Backup Sets
===================

BS Key  Type LV Size       Device Type Elapsed Time Completion Time
------- ---- -- ---------- ----------- ------------ ---------------
24      Full    288.94M    DISK        00:00:29     05-JUN-20
        BP Key: 24   Status: AVAILABLE  Compressed: YES  Tag: TAG20200605T153759
        Piece Name: /rman/respaldo/PATODB_20200605_0rv232un.bkp
  List of Datafiles in backup set 24
  File LV Type Ckp SCN    Ckp Time  Abs Fuz SCN Sparse Name
  ---- -- ---- ---------- --------- ----------- ------ ----
  1       Full 2183244    05-JUN-20              NO    /oradata/cdbs/PATODB/system01.dbf
  3       Full 2183244    05-JUN-20              NO    /oradata/cdbs/PATODB/sysaux01.dbf
  7       Full 2183244    05-JUN-20              NO    /oradata/cdbs/PATODB/users01.dbf
  13      Full 2183244    05-JUN-20              NO    /oradata/cdbs/PATODB/undotbs.dbf

BS Key  Type LV Size       Device Type Elapsed Time Completion Time
------- ---- -- ---------- ----------- ------------ ---------------
25      Full    119.47M    DISK        00:00:12     05-JUN-20
        BP Key: 25   Status: AVAILABLE  Compressed: YES  Tag: TAG20200605T153759
        Piece Name: /rman/respaldo/PATODB_20200605_0sv232vr.bkp
  List of Datafiles in backup set 25
  Container ID: 2, PDB Name: PDB$SEED
  File LV Type Ckp SCN    Ckp Time  Abs Fuz SCN Sparse Name
  ---- -- ---- ---------- --------- ----------- ------ ----
  5       Full 2165760    05-JUN-20              NO    /oradata/cdbs/PATODB/pdbseed/system01.dbf
  6       Full 2165760    05-JUN-20              NO    /oradata/cdbs/PATODB/pdbseed/sysaux01.dbf
  8       Full 2165760    05-JUN-20              NO    /oradata/cdbs/PATODB/pdbseed/undotbs01.dbf

BS Key  Type LV Size       Device Type Elapsed Time Completion Time
------- ---- -- ---------- ----------- ------------ ---------------
26      Full    101.73M    DISK        00:00:11     05-JUN-20
        BP Key: 26   Status: AVAILABLE  Compressed: YES  Tag: TAG20200605T153759
        Piece Name: /rman/respaldo/PATODB_20200605_0tv2330a.bkp
  List of Datafiles in backup set 26
  Container ID: 3, PDB Name: TALLER
  File LV Type Ckp SCN    Ckp Time  Abs Fuz SCN Sparse Name
  ---- -- ---- ---------- --------- ----------- ------ ----
  9       Full 2182707    05-JUN-20              NO    /oradata/pdbs/taller/system01.dbf
  10      Full 2182707    05-JUN-20              NO    /oradata/pdbs/taller/sysaux01.dbf
  12      Full 2182707    05-JUN-20              NO    /oradata/pdbs/taller/datos.dbf

Podemos ver que éste es nuestro respaldo Full con el tag TAG20200605T153759.
Entonces tenemos que validar que esos backupset listados en el campo Piece Name están presentes en nuestro disco de RMAN:

[oracle@patorestore ~]$ ls /rman/respaldo/PATO*
/rman/respaldo/PATODB_20200605_0rv232un.bkp  /rman/respaldo/PATODB_20200605_0tv2330a.bkp
/rman/respaldo/PATODB_20200605_0sv232vr.bkp

Restaurar la Base de Datos

Finalmente restauramos nuestra base de datos usando el TAG de nuestro respaldo offline:


RMAN> restore database from tag 'TAG20200605T153759';

Starting restore at 05-JUN-20
using channel ORA_DISK_1

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 00001 to /oradata/cdbs/PATODB/system01.dbf
channel ORA_DISK_1: restoring datafile 00003 to /oradata/cdbs/PATODB/sysaux01.dbf
channel ORA_DISK_1: restoring datafile 00007 to /oradata/cdbs/PATODB/users01.dbf
channel ORA_DISK_1: restoring datafile 00013 to /oradata/cdbs/PATODB/undotbs.dbf
channel ORA_DISK_1: reading from backup piece /rman/respaldo/PATODB_20200605_0rv232un.bkp
channel ORA_DISK_1: piece handle=/rman/respaldo/PATODB_20200605_0rv232un.bkp tag=TAG20200605T153759
channel ORA_DISK_1: restored backup piece 1
channel ORA_DISK_1: restore complete, elapsed time: 00:00:55
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 00005 to /oradata/cdbs/PATODB/pdbseed/system01.dbf
channel ORA_DISK_1: restoring datafile 00006 to /oradata/cdbs/PATODB/pdbseed/sysaux01.dbf
channel ORA_DISK_1: restoring datafile 00008 to /oradata/cdbs/PATODB/pdbseed/undotbs01.dbf
channel ORA_DISK_1: reading from backup piece /rman/respaldo/PATODB_20200605_0sv232vr.bkp
channel ORA_DISK_1: piece handle=/rman/respaldo/PATODB_20200605_0sv232vr.bkp tag=TAG20200605T153759
channel ORA_DISK_1: restored backup piece 1
channel ORA_DISK_1: restore complete, elapsed time: 00:00:25
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 00009 to /oradata/pdbs/taller/system01.dbf
channel ORA_DISK_1: restoring datafile 00010 to /oradata/pdbs/taller/sysaux01.dbf
channel ORA_DISK_1: restoring datafile 00012 to /oradata/pdbs/taller/datos.dbf
channel ORA_DISK_1: reading from backup piece /rman/respaldo/PATODB_20200605_0tv2330a.bkp
channel ORA_DISK_1: piece handle=/rman/respaldo/PATODB_20200605_0tv2330a.bkp tag=TAG20200605T153759
channel ORA_DISK_1: restored backup piece 1
channel ORA_DISK_1: restore complete, elapsed time: 00:00:25
Finished restore at 05-JUN-20

RMAN> exit

Recovery Manager complete.

Abrir la Base de Datos con Resetlogs

Una vez finalizada exitosamente la restauración nos conectamos a nuestra instancia usando sqlplus / as sysdba y abrimos la base de datos con la opción resetlogs:

[oracle@patodgprmy dbs]$ sqlplus / as sysdba

SQL*Plus: Release 19.0.0.0.0 - Production on Fri Jun 5 18:16:04 2020
Version 19.3.0.0.0

Copyright (c) 1982, 2019, Oracle.  All rights reserved.


Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0

SQL> alter database open resetlogs;

Database altered.

SQL> create spfile from pfile ;

File created.

Y eso es todo, hemos restaurado exitosamente la base de datos.

Validar la Base de Datos Pluggable

Adicionalmente podemos acceder a nuestra base de datos pluggable taller para validar que todo está correcto:

SQL> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 TALLER                         READ WRITE NO

SQL> alter session set container = taller;

Session altered.

SQL> select count(*) from pato.t1 ;

  COUNT(*)
----------
         5

Nuestra base de datos ha sido restaurada y esta funcionando!

Conclusión

Fuimos capaces de restaurar nuestra base de datos multitenant Oracle 19c en una Virtual Machine diferente usando las funcionalidades de RMAN y de Google Cloud Platform.
Usar un respaldo offline es una manera fácil y consistente para restaurar o duplicar nuestra base de datos en una instalación diferente.