Oracle Database 12c: Active Duplication con RMAN + 10 casos practicos

Por Joel Perez , Mahir M. Quluzade (OCE) & Sebastián D'Alessandro (OCE)
Publicado en Mayo 2015

Índice:

Reciban estimados tecnólogos Oracle un cordial saludo. A través del presente artículo y los sub-siguientes, tendremos la oportunidad de visualizar y adentrarnos un poco en el tema de duplicaciones de base de datos a través de “RMAN Duplicate”.

Antes de entrar en materia practica, hablemos un poco de lo “RMAN Duplicate”, sus modos, características y mas.

“Oracle Recovery Manager” “RMAN”  soporta dos tipos de duplicación: “active database duplication” y  “backup-based duplication”. “Active database duplication” fue introducida en la versión 11g de Oracle Database. “RMAN” realiza la copia de la base de datos a una instancia auxiliar a través de la red, por tal motivo no es necesario ningún “Backup” de la base de datos original para la duplicación en modo activo (“active database duplication”).   En Oracle Database 11g, “RMAN” utiliza “image copies”  para realizar una “active database duplication”. Este método es conocido como  “push-based” de “active database duplication”.

De esta manera cuando se realiza una  “active database duplication” usando el método “push-based” de “RMAN”, la base de datos original  transfiere las “image copies” necesarias a la base de datos auxiliar. La salida de “active database duplication”  en Oracle Database 11g Release 2 (11.2.0.3) sería similar a la siguiente (se han omitido las líneas irrelevantes):

RMAN>run
2> {
3> allocate channel c1 device type disk;
4> allocate channel c2 device type disk;
Starting backup at 08-APR-14
channel c1: starting datafile copy
input datafile file number=00003 name=/u01/app/oracle/oradata/prmdb/sysaux01.dbf
channel c2: starting datafile copy
input datafile file number=00001 name=/u01/app/oracle/oradata/prmdb/sysaux01.dbf
output file name=/u01/app/oracle/oradata/dupdb/sysaux01.dbf tag=TAG20140408T125110
channel c1: datafile copy complete, elapsed time: 00:02:15
channel c2: datafile copy complete, elapsed time: 00:02:15
Finished backup at 08-APR-14
datafile 1 switched to datafile copy
input datafile copy RECID=3 STAMP=844347476 file name=/u01/app/oracle/oradata/dupdb/system01.dbf


Como puede verse en la salida, RMAN utiliza los “target channels” (c1, c2) para transferir las copias imagen de los datafiles. El uso de copias imagen por parte de “active database duplication” puede requerir recursos adicionales de la base de datos origen.  Para superar este problema, en Oracle Database 12c (12.1) se incorporó un nuevo método: “pull-based active database duplication” en el cual RMAN realiza  “active database duplication” utilizando “backup sets” en lugar de “images copies”. Cuando RMAN realiza la duplicación de la base activa usando “backup sets”, se establece una conexión con la base de datos origen y una con la auxiliar. La base de datos auxiliar  entonces,  se conecta a la base de datos de origen por medio de “Oracle Net Services” y recupera los archivos de datos necesarios desde la base de datos origen.


El uso de “backup sets” para “active database duplication” proporciona ciertas ventajas. “RMAN” utiliza los recursos del host destino y puede emplear compresión de los bloques no utilizados mientras genera los “backups”, reduciendo de esta manera el tamaño de las piezas, que son transportadas a través del/de los canal(es) auxiliar(es). Los “backup sets” creados en la base de datos origen pueden ser generados con paralelismo utilizando “multi section backups” y también pueden ser encriptados.
“RMAN” usa “backup sets” para realizar “active database duplication” cuando la conexión a la base  de datos target se establece usando un “net service name” y  además se cumple con cualquiera de las siguientes condiciones: se utiliza con el comando DUPLICATE...FROM ACTIVE DATABASE  con alguna de las siguientes clausulas:

  • USING BACKUPSET
  • USING COMPRESSED BACKUPSET
  • SECTION SIZE
  • o el número de canales auxiliares asignados es igual o mayor que el número de canales target.

Nota: “RMAN” solo utiliza “image copies” en Oracle Database 12c para realizar “active database duplication con el método (push-based)” cuando el número de canales auxiliares asignados es menor que el número de canales destino.

Cuando se realiza la duplicación de una base de datos, “RMAN” genera los nombres para los archivos de la base de datos duplicada. Si el host destino utiliza la misma estructura de directorios que el host origen, entonces es posible utilizar los mismos nombres que se han utilizado en la base de datos origen para los archivos de la base duplicada. En este caso, no es necesario renombrar los archivos duplicados, pero se debe especificar la opción NOFILENAMECHECK en el comando DUPLICATE.

Si los hosts utilizan diferentes estructuras de directorios (como lo hacemos en esta serie de artículos), o si se utiliza la misma estructura pero se quiere nombrar los archivos duplicados de manera diferente, entonces se debe decidir la forma de generar los nombres para los archivos de la base de datos duplicada. Puntualmente, debe decidirse cómo nombrar  los “Controlfiles”, “Datafiles”, “Online redo logs”  & “Tempfiles”.
“RMAN” soporta  las siguientes estrategias para generar nombres de archivos duplicados:

  • Especifique la claúsula SPFILE en el comando DUPLICATE para configurar todos los parámetros necesarios relacionados con nombres de archivos, a excepción de DB_FILE_NAME_CONVERT y LOG_FILE_NAME_CONVERT.

Oracle recomienda esta estrategia porque es la más simple. Cuando se ejecuta DUPLICATE ... SPFILE, RMAN  restaura  el archivo de parámetros del servidor (spfile) desde un “Backup” o directamente lo copia desde la base de datos activa,  actualiza los valores de los parámetros de inicialización en el spfile copiado basándose  en los valores de PARAMETER_VALUE_CONVERT and SPFILE SET  (en este orden) y luego reinicia la instancia auxiliar con este archivo de parámetros.

  • SPFILE ... PARAMETER_VALUE_CONVERT 'string_pattern'

Especifique la cadenas de conversión para los parámetros  cuyos valores definan  nombres de rutas, con excepción de los parámetros DB_FILE_NAME_CONVERT  y LOG_FILE_NAME_CONVERT. El propósito principal de PARAMETER_VALUE_CONVERT es poder definir un conjunto de parámetros de inicialización y evitar definirlos de forma explícita uno por uno.

Nota
: PARAMETER_VALUE_CONVERT puede actualizar todos los valores de cadenas y no sólo los que contienen los nombres de ruta. Los valores distinguen entre mayúsculas y minúsculas.

  • SPFILE ... SET 'string_pattern'

    Establezca los parámetros de inicialización  para los valores especificados. se puede utilizar SET para definir el parámetro LOG_FILE_NAME_CONVERT para los “Online redo logs”.
  • DB_FILE_NAME_CONVERT 'string_pattern'

Especifique una regla para crear los nombres de archivo de “Datafiles” y “Tempfiles” duplicados. Tenga en cuenta que  cuando DB_FILE_NAME_CONVERT  se especifica en el comando DUPLICATE sobrescribe  el parámetro de inicialización DB_FILE_NAME_CONVERT  si es que este está definido en el archivo de inicio.

  • NOFILENAMECHECK

Evita que “RMAN” compruebe si los “Datafiles” y “Online redo logs files” de la base de datos origen comparten los mismos nombres que los archivos duplicados. Esta opción es necesaria cuando se está creando una base de datos duplicada en un “host” diferente que tiene la misma configuración de disco, estructura de directorios y nombres de archivos que el “host” de la base de datos de origen. Si el duplicado de una base de datos se está realizando en el mismo host de la base de datos origen, asegúrese que la clausula NOFILENAMECHECK no esté especificada.

En esta serie de artículos evaluamos diez escenarios distintos de “Pull-Based Active Database Duplication”. Utilizamos  una “Database Multitenant Container” como base de datos origen para todos ellos.  A continuación detallamos la estructura de las bases de datos que serán utilizadas:
prmcdb  es nuestra base de datos origen (source database) ejecutandose en el host  host oel62-ora12c-prm, es una “Multitenant Container Database (CDB)” que contiene dos  “Pluggable Databases (PDBs)”: prmpdb01 and prmpdb02,  . Mostramos esto a continuación: 

[oracle@oel62-ora12c-prm ~]$ uname -snmo
Linux oel62-ora12c-prm.localdomain x86_64 GNU/Linux
[oracle@oel62-ora12c-prm ~]$ export ORACLE_SID=prmcdb
[oracle@oel62-ora12c-prm ~]$ sqlplus / as sysdba
 
SQL*Plus: Release 12.1.0.1.0 Production on Tue Apr 8 15:19:56 2014
 
Copyright (c) 1982, 2013, Oracle.  All rights reserved.
 
Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options
 
SQL> select banner from v$version; 
 
BANNER
--------------------------------------------------------------------------------
Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production
PL/SQL Release 12.1.0.1.0 - Production
CORE  12.1.0.1.0       Production
TNS for Linux: Version 12.1.0.1.0 - Production
NLSRTL Version 12.1.0.1.0 - Production
 
SQL> select cdb, name, open_mode, log_mode from v$database;
 
CDB NAME      OPEN_MODE            LOG_MODE
--- --------- -------------------- ------------
YES PRMCDB    READ WRITE           ARCHIVELOG
 
SQL> select con_id, name, open_mode from v$pdbs;
 
    CON_ID NAME                           OPEN_MODE
---------- ------------------------------ ----------
       2   PDB$SEED                       READ ONLY
       3   PRMPDB01                       READ WRITE
       4   PRMPDB02                       READ WRITE


Instalamos también la misma versión de Oracle Database 12c Release 1 (12.1.0.1.0) en nuestro host destino, en este caso llamado oel62-ora12c-dup. Utilizamos solamente estos dos hosts para todos los escenarios de esta serie de artículos.

dupcdb
será nuestra base de datos duplicada en el host destino y también será una “Multitenant Container Database (CDB)”.  Antes de realizar la duplicación de la base de datos origen utilizando “RMAN”, debemos  preparar en el host destino siguiendo los siguientes pasos:

  • Crear un archivo de parámetros de inicialización para la base de datos duplicada.
[oracle@oel62-ora12c-dup ~]$ cd $ORACLE_HOME/dbs
[oracle@oel62-ora12c-dup dbs]$ cat initdupcdb.ora 
*.db_name=dupcdb

  • Agregar un servicio estático al  “Listener” 
[oracle@oel62-ora12c-dup admin]$ cd $ORACLE_HOME/network/admin
[oracle@oel62-ora12c-dup admin]$ cat listener.ora
# listener.ora Network Configuration File: 
/u01/app/oracle/product/12.1.0/dbhome/network/admin/listener.ora
# Generated by Oracle configuration tools. 
SID_LIST_LISTENER  =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = dupcdb)
      (ORACLE_HOME = /u01/app/oracle/product/12.1.0/dbhome)
      (SID_NAME = dupcdb)
    )
  )
 
LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = oel62-ora12c-dup.localdomain)(PORT = 1521))
    )
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
  )
 
ADR_BASE_LISTENER = /u01/app/oracle
 
[oracle@oel62-ora12c-dup admin]$ lsnrctl status
 
LSNRCTL for Linux: Version 12.1.0.1.0 - Production on 08-APR-2014 15:37:59
 
Copyright (c) 1991, 2013, Oracle.  All rights reserved.
 
Connecting to 
(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=oel62-ora12c-dup.localdomain)(PORT=1521)))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 12.1.0.1.0 - Production
Start Date                31-MAR-2014 09:55:57
Uptime                    8 days 5 hr. 42 min. 2 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   
/u01/app/oracle/product/12.1.0/dbhome/network/admin/listener.ora
Listener Log File         
/u01/app/oracle/diag/tnslsnr/oel62-ora12c-dup/listener/alert/log.xml
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=oel62-ora12c-dup.localdomain)(PORT=1521)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
Services Summary...
Service "dupcdb" has 1 instance(s).
  Instance "dupcdb", status UNKNOWN, has 1 handler(s) for this service...
The command completed successfully

  • Crear un “Password File” para la base de datos duplicada
[oracle@oel62-ora12c-dup ~]$ cd $ORACLE_HOME/dbs
[oracle@oel62-ora12c-dup dbs]$ orapwd file=orapwdupcdb entries=5
 
Enter password for SYS: 
[oracle@oel62-ora12c-dup dbs]$ ls -ltr orapwdupcdb 
-rw-r----- 1 oracle oinstall 5120 Apr  8 15:40 orapwdupcdb

  • Crear los directorios necesarios para la base de datos duplicada. No hay que olvidar la creación de los directorios correspondientes para todas las PDBs:
[oracle@oel62-ora12c-dup ~]$ cd $ORACLE_BASE
[oracle@oel62-ora12c-dup oracle]$ mkdir -p oradata/dupcdb
[oracle@oel62-ora12c-dup oracle]$ mkdir -p fra/dupcdb
[oracle@oel62-ora12c-dup oracle]$ cd oradata/dupcdb
[oracle@oel62-ora12c-dup dupcdb]$ mkdir pdbseed
[oracle@oel62-ora12c-dup dupcdb]$ mkdir prmpdb01
[oracle@oel62-ora12c-dup dupcdb]$ mkdir prmpdb02  
[oracle@oel62-ora12c-dup ~]$ cd $ORACLE_BASE/admin
[oracle@oel62-ora12c-dup admin]$ mkdir -p dupcdb/adump
[oracle@oel62-ora12c-dup admin]$ ls -l
total 4
drwxr-xr-x 3 oracle oinstall 4096 Apr  8 17:18 dupcd

  • Agregar los servicios de red ”Net Services” tanto para la base origen como para la duplicada en ambos servidores.
[oracle@oel62-ora12c-prm ~]$ cd $ORACLE_HOME/network/admin
[oracle@oel62-ora12c-prm admin]$ cat tnsnames.ora
# tnsnames.ora Network Configuration File: /u01/app/oracle/product/12.1.0/dbhome/network/admin/tnsnames.ora
# Generated by Oracle configuration tools.
 
DUPCDB =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = oel62-ora12c-dup)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = dupcdb)
    )
  )
 
PRMCDB =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = oel62-ora12c-prm.localdomain)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = prmcdb)
    )
  )

  • Establecer la base de datos duplicada en modo “no mount”:
[oracle@oel62-ora12c-dup ~]$ export ORACLE_SID=dupcdb
[oracle@oel62-ora12c-dup ~]$ sqlplus / as sysdba
 
SQL*Plus: Release 12.1.0.1.0 Production on Tue Apr 8 15:49:16 2014
 
Copyright (c) 1982, 2013, Oracle.  All rights reserved.
 
Connected to an idle instance.
 
SQL> startup nomount;
ORACLE instance started.
 
Total System Global Area   217157632 bytes
Fixed Size                 2286656 bytes
Variable Size              159386560 bytes
Database Buffers           50331648 bytes
Redo Buffers               5152768 bytes
  
  • Ejecutar el comando duplicate en la “target” y “auxiliary” por medio de “RMAN”:

Se pueden observar todas las salidas correspondientes a los comandos “Duplicate” para cada uno de los siguientes casos en las demás partes de esta serie de artículos. Esta serie cubre los siguientes casos de duplicación de base de datos:

 


Cuando se utilice el comando “RMAN DUPLICATE”, la base de datos duplicada es creada y luego se abre en modo RESETLOGS.  Puede ser que en ciertas situaciones no quiera abrir la base inmediatamente después de la duplicación, estos casos podrían ser los siguientes:

  • La necesidad de modificar los parámetros de inicio de la base de datos duplicada.

Por ejemplo, es necesario modificar la configuración de “flashback database”, configurar “fast incremental backups” o modificar el “block change tracking”.

  • Creación de una nueva base de datos como parte de procedimiento de “Upgrade”.

Durante un “Upgrade” la base de datos no puede ser abierta con la opción “RESETLOGS”. La cláusula NOOPEN  permite duplicar la base de datos y luego la deja en condiciones de ser abierta en modo “Upgrade”  para la posterior ejecución de los scripts de actualización.
Se  puede especificar que la base de datos duplicada no sea abierta inmediatamente, utilizando la clausula NOOPEN en el comando DUPLICATE como se muestra a continuación:

DUPLICATE TARGET DATABASE TO dupcdb 
FROM ACTIVE DATABASE

NOOPEN;

RMAN Duplicate para PDBs
Es importante destacar que RMAN permite duplicar no sólo la CBD, sino que también puede hacerlo con una  o múltiples PDBs  utilizando el comando DUPLICATE. También puede duplicar un conjunto de “Tablespaces” dentro de una PDB. Para esto debe estar conectado en el root de la CDB con un usuario que tenga  privilegios de SYSDBA o SYSBACKUP. De aquí en adelante podrá ver ejemplos de duplicación de de “Pluggable Databases” (PDBs).  La siguiente tabla muestra las opciones para duplicación de PDBs.

Opciones de DUPLICATE

Explicación

PLUGGABLE DATABASE pdb_name

Duplica las PDBs especificadas en la CDB. Use una coma como delimitadora para duplicar múltiples PDBs.

SKIP PLUGGABLE DATABASE pdb_name

Duplica todas las PDBs en la CDB, exceptuando las PDBs especificadas por pdb_name. Use una coma como delimitadora para especificar múltiples PDBs que deben ser excluidas.

TABLESPACE pdb_name:tablespace_name

Duplica los “Tablespaces” especificados dentro de una PDB. El nombre del “Tablespace” debe ser especificado con el nombre de la PDB que lo contiene como prefijo. Si usted omite el nombre de la PDB, el root es tomado como default.

SKIP TABLESPACE pdb_name:tablespace_name

Duplica todos los “Tablespaces” en la CDB exceptuando aquellos especificados  en la PDB indicada.


Esperamos que este artículo les haya resultado de utilidad y los invitamos a seguir leyendo las siguientes partes de esta serie de artículos:




Joel Pérez es un experto DBA (Oracle ACE Director, OCM Cloud Admin. & OCM11g) con más de 15 años de experiencia real en el mundo de tecnología Oracle, especializado en diseño e implementación de soluciones de: Cloud, Alta disponibilidad, Recuperación contra desastres, Upgrades, Replicación y toda área relacionada con bases de datos Oracle. Consultor Internacional con trabajos, conferencias y actividades relacionadas en más de 50 países alrededor del mundo. Habitual Orador en eventos Oracle alrededor del mundo como: OTN LAD, OTN MENA, OTN APAC y más. Joel se ha caracterizado siempre por ser un pionero en materia de tecnología Oracle desde los inicios de su carrera siendo el primer latinoamericano en ser nombrado "OTN Expert" en el año 2003, uno de los primeros Oracle ACE en el programa ACE en el año 2004, unos de los primeros OCP Cloud en el mercado global en el año 2013 y como uno de los mayores logros de su carrera, recientemente en el 2014 fue honorificado como uno de los primeros "OCM Database Cloud Administrator" del mundo. En la actualidad Joel Pérez esta radicado en el continente de Asia con base en Beijing, China llevando a cabo operaciones profesionales como “Chief Technologist & MAA, HA Arquitect” para Yunhe Enmo (Beijing) Technology Co. Ltd.
http://education.oracle.com/education/otn/JoelPerez.htm 

Mahir M. Quluzade es un Senior DBA con mas de 10 anos de experiencia en bases de datos Oracle con especial foco en "High Availability" & "Disaster Recovery Solutions (RAC, Data Guard, RMAN,…)". Mahir actualmente trabaja en el "Central Bank of the Republic of Azerbaijan". El es OCP DBA. Mahir es frecuente orador en el "Azerbaijan Oracle User Group (AZEROUG)".

Sebastián D'Alessandro es un Senior DBA con más de 12 años de experiencia en tecnología Oracle, focalizado principalmente en seguridad de base de datos, soluciones de alta disponibilidad, disaster recovery y virtualización. Actualmente desarrolla su actividad como consultor e instructor de manera independiente.

Este artículo ha sido revisado por el equipo de productos Oracle y se encuentra en cumplimiento de las normas y prácticas para el uso de los productos Oracle.