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.
- Para cómo crear una bases de datos ver Crear una Base de Datos Oracle Multitenant en Modo Silencioso.
- Para cómo configurar
RMAN
ir a Respaldar Bases de Datos Oracle con RMAN hacia un Disco Local.
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.