Clonar una base de datos Oracle.

Seguro que a todos los que trabajais con Oracle (o con Sap y como base de datos Oracle como es mi caso), os ha surgido la necesidad de replicar una base de datos productiva (o de un entorno de pruebas), en otro sistema. En mi caso, trabajando con Sap, regularmente realizo una copia de la base de datos real en el sistema de desarrollo (integración), para que la pruebas de los cambios, desarrollos o parametrizaciones sean lo mas completas posibles (y lo mas fáciles posible de cara al usuario si dispone de los datos "reales" más actualizados).

Acabo de terminar la instalación de un nuevo entorno de desarrollo Sap (por un cambio de hardware), en el que hemos aprovechado para hacer una replica del sistema productivo a nivel de base de datos. Os voy a explicar los pasos seguidos por si alguno de vosotros tiene la misma necesidad, aunque seguro que hay otras formas de hacerlo (export de base de datos, utilizando RMAN, etc). En mi caso, he partido de un backup Online (aunque es recomendable realizarlo con uno Offline), y he copiado una base de datos que se llama MG1 en otra en una máquina distinta que se llama DE1. El procedimiento que os voy a explicar esta validado con Oracle 9i.

1) Realización del backup de la base de datos origen: como os he indicado, he realizado un backup online utilizando el software de backup Veritas Netbackup, que tiene sus herramientas especificas para trabajar con Sap y Oracle, pero podriamos igualmente haberlo realizado con un script sql para poner los tablespaces en modo backup y copiar los datafiles correspondientes a la nueva ubicación. Una vez terminada la copia, se vuelven a poner los tablespaces en modo normal. También podriamos haber realizado un backup offline con la base de datos parada (aunque esto no es siempre posible, pues podemos estar en un sistema cuya ventana de backup sea muy pequeña y no se pueda hacer de esta manera).

Los scripts sql para poner los tablespaces en modo backup(al comenzar este), asi como para ponerlos en modo normal(a la finalización del backup), los podeis generar con las sentencias SQL que os detallo a continuación:

set lines 999 pages 999
set verify off
set feedback off
set heading off

spool begin_backup.sql

select 'alter tablespace ' || tablespace_name || ' begin backup;' tsbb
from    dba_tablespaces
where   contents != 'TEMPORARY'
order by tablespace_name
/
spool off

spool end_backup.sql

select 'alter tablespace ' || tablespace_name || ' end backup;' tseb
from    dba_tablespaces
where   contents != 'TEMPORARY'
order by tablespace_name
/
spool off

Al ejecutar la sentencia se habrán generado dos ficheros: begin_backup.sql y end_backup.sql, cada uno con el cometido indicado anteriormente.

2) Preparación de la copia: en mi caso, en el sistema destino ya tengo instalado Oracle y creada toda la estructura de carpetas para las ubicaciones de los datafiles. En caso contrario, habrá que realizar la instalación de Oracle y crear las carpetas correspondientes donde se van a ubicar los ficheros de datos. Una vez preparado todo en el sistema destino, vamos a realizar un par de tareas mas de preparación.

  • Ajuste del fichero de parametros de oracle: el fichero de parametros de oracle es imprescindible para poder arrancar la base de datos en el sistema destino (fichero init<SID>.ora, donde <SID> es el nombre de la base de datos). Habremos de ajustar el contenido de este fichero para que corresponda a los directorios del nuevo sistema (destino de redologs, rollback segments en el caso de que los utilicemos, etc), pero siempre tomando como modelo el mismo fichero del sistema origen. Igualmente, puede que tengamos que ajustar parametros de este fichero conforme a las características físicas de la maquina destino (memoria, procesadores, etc).
  • Creación de la sentencia SQL para recrear los ficheros de control:  ejecutaremos la sentencia SQL en el sistema origen: alter database backup controlfile to trace as '/tmp/crea_bd.sql'; Con la ejecución de esta sentencia, hemos creado un fichero con sentencias sql, que nos van a permitir recrear los ficheros de control en el sistema destino una vez hayamos recuperado el backup. En mi ejemplo, el contenido del fichero creado es el siguiente:
STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE "MG1" RESETLOGS  ARCHIVELOG
--  SET STANDBY TO MAXIMIZE PERFORMANCE
 MAXLOGFILES 16
 MAXLOGMEMBERS 3
 MAXDATAFILES 1022
 MAXINSTANCES 50
 MAXLOGHISTORY 5445
LOGFILE
 GROUP 11 (
 '/oracle/MG1/mirrlogA/log_g11m2.dbf',
 '/oracle/MG1/origlogA/log_g11m1.dbf'
 ) SIZE 20M,
 GROUP 12 (
 '/oracle/MG1/mirrlogB/log_g12m2.dbf',
 '/oracle/MG1/origlogB/log_g12m1.dbf'
 ) SIZE 20M,
 GROUP 13 (
 '/oracle/MG1/mirrlogA/log_g13m2.dbf',
 '/oracle/MG1/origlogA/log_g13m1.dbf'
 ) SIZE 20M,
 GROUP 14 (
 '/oracle/MG1/mirrlogB/log_g14m2.dbf',
 '/oracle/MG1/origlogB/log_g14m1.dbf'
 ) SIZE 20M
-- STANDBY LOGFILE

DATAFILE
 '/oracle/MG1/sapdata1/system_1/system.data1',
 '/oracle/MG1/sapdata5/btabd_1/btabd.data1',
 '/oracle/MG1/sapdata2/btabi_1/btabi.data1',
 '/oracle/MG1/sapdata6/clud_1/clud.data1',

.............................

CHARACTER SET WE8DEC
;

Habremos de realizar algunos cambios en el scritpt SQL contenido en este fichero para poder utilizarlo de forma correcta en el sistema destino:

  • Nombre de la base de datos: el nuevo nombre de la base de datos va a ser DE1. Para ello, cambiaremos la parte inicial del script, sustituyendo MG1 por DE1. Igualmente, cambiaremos el valor REUSE por SET. La sintaxis quedaría como sigue:
CREATE CONTROLFILE SET DATABASE "DE1" RESETLOGS  ARCHIVELOG..........
  • Ubicación de ficheros de logs y de datafiles: todas las rutas de los logs y de los datafiles que aparecen en el fichero han de ser modificadas para que correspondan con las ubicaciones reales que van a tener en el sistema destino. En mi caso, voy a cambiar la carpeta /oracle/MG1 por /oracle/DE1, que es la ubicación en mi sistema de todos esos elementos.
  • Resto de sentencias SQL en el fichero: todas las sentencias SQL que hay a partir del valor CHARACTER SET ... las borramos, pues las lanzaremos manualmente una vez recreados los controlfile (borrar RECOVER DATABASE.... y ALTER DATABASE OPEN RESETLOGS).

3) Restauración de ficheros de datos en el sistema destino: realizamos una recuperación de la copia de seguridad en las ubicaciones correspondientes del sistema destino. Las localizaciones de los datafiles deberan de coincidir con las que hayamos descrito en el script crea_bd.sql (tal y como hemos visto en el punto anterior), pues al lanzarlo, debera de encontrar todos los ficheros para poder realizar correctamente el proceso. En el caso de que hayamos realizado un backup offline, no hará falta traerse los ficheros de redologs del sistema origen, pero si en el caso de un backup online. Esto es necesario para dejar la base de datos en un punto consistente, pues durante el backup, todos los cambios que se producen en los tablespaces se van quedando registrados en los redologs. Es una forma de asegurar la consistencia de la base de datos tras el proceso  de recuperación.

4) Proceso final: recreación de control file y arranque de la base de datos. Una vez ha terminada la recuperación, vamos a realizar la parte final del proceso, y las más crítica. Para ello, ya ubicados en el sistema destino, arrancaremos el listener (puede que también haya que realizar algun ajuste en el para adaptarlo al nombre de la nueva base de datos), y nos conectaremos a la base de datos con sqlplus. La base de datos no esta arrancada, y ejecutaremos el script crea_bd.sql que hemos creado y ajustado anteriormente:

tm-des:orade1 1> sqlplus

SQL*Plus: Release 9.2.0.8.0 - Production on Tue Jun 22 16:00:10 2010

Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.

Enter user-name: / as sysdba

Connected to:
Oracle9i Enterprise Edition Release 9.2.0.8.0 - 64bit Production
With the Partitioning option
JServer Release 9.2.0.8.0 - Production

SQL> @/tmp/crea_bd.sql

La sentencia arranca la base de datos en modo NOMOUNT y realiza la recreación de los ficheros de control (las ubicaciones de estos ficheros estan definidas en el fichero init<SID>.ora, en el parametro control_files). Durante este proceso, se verifica que todos los ficheros existan fisicamente. En el caso de presentarse algun error y se pare el proceso (no existe alguna carpeta o los ficheros estan en una ubicación distinta), corregiremos los errores y volveremos a lanzar el proceso.

Una vez concluida la creación de los ficheros de control, arrancaremos la base de datos. La forma variara según si partimos de un backup offline o online. Por ejemplo, para el backup online, que es un backup consistente pues se ha parado toda la actividad de la base de datos cuando se realizo, ejecutaremos la siguiente sentencia sql:

ALTER DATABASE OPEN RESETLOGS;

En el caso de haber realizado un backup online, pueden variar las sentencias a ejecutar. En mi caso, quiero dejar la base de datos consistente en un determinado momento del tiempo. Para ello, ejecutare las siguientes sentencias:

RECOVER DATABASE UNTIL TIME '2010-06-10:01:00:00' USING BACKUP CONTROLFILE;
ALTER DATABASE OPEN RESETLOGS;

He recuperado la base de datos a un momento determinado del tiempo (la 1 de la madrugada del 10 de junio de 2010). Para el proceso, ha sido necesario tener en el directorio de redologs los logs archivados necesarios (provenientes del sistema origen), para que su contenido sea aplicado sobre los tablespaces y llegar de forma coherente al punto del tiempo indicado.

En este momento, la base de datos ya esta recuperada y abierta. Como paso final, ejecutaremos la siguiente sentencia para cambiar el global database name (podemos ver el valor actual ejecutando la sentencia select * from global_name;):

ALTER DATABASE RENAME GLOBAL_NAME TO DE1.world

En mi caso, arranco además Sap y realizo una serie de acciones para dejar el sistema preparado para trabajar con el. En el caso de que estemos solo con una base de datos de pruebas en cualquier otro tipo de instalación, ya tendriamos los datos del sistema origen online y disponibles para poder realizar cualquier operativa sobre ellos. También puede ser una forma útil de replicar un sistema de Business Intelligence para sistema de test o de formación.

Os dejo algunos links donde podeis ampliar información de la forma de realizar todos los procesos descritos, pues mi explicación ha sido bastante resumida y según la forma de realizar el proceso, puede que tengaís que tener muchas mas cosas en cuenta:

Oracle Dba Quick Guide.

Sap System Copy: para el caso de que esteis trabajando con Sap (se explican aspectos adicionales en la copia homogenea de un sistema a otro).