viernes, 28 de octubre de 2011

Clonar bases de datos Oracle

Este procedimiento te permitirá clonar bases de datos oracle. Por ejemplo, clonar la base de datos en el mismo servidor, o en otro servidor, para ser usada para pruebas, modificaciones, desarrollo, etc.
A continuación resumo los pasos que uso personalmente para realizar una clonación de base de datos.



Información de archivos y espacios usados por los archivos
Con esto obtenemos una lista de que archivos vamos a copiar para clonar nuestra base de datos.
En sqlplus (u otra aplicación cliente oracle), ejecutar:


set lines 100 pages 999
col name format a50

select    name, bytes
from    (select    name, bytes
    from    v$datafile
    union    all
    select    name, bytes
    from     v$tempfile
    union     all
    select     lf.member "name", l.bytes
    from    v$logfile lf
    ,    v$log l
    where    lf.group# = l.group#) used
,    (select sum(bytes) as poo
    from dba_free_space) free;


Crear nuevo pfile:
En sqlplus ejecutar:
create pfile='init.ora' from spfile;

este será el nuevo archivo de inicio para nuestra nueva base de datos.


Crear clon de controlfile desde b.d. origen:
alter database backup controlfile to trace as '/home/oracle/cr_new_sid.sql';

Donde es el nombre de la nueva instancia está representado por new_sid. Desde acá en adelante new_sid lo reemplazas por tu nuevo nombre de instancia. Si no vas a cambiar el nombre a la instancia, entonces simplemente no lo cambies.


Traspaso de archivos:

  1. Bajar base de datos origen
  2. Transferir archivos a nuevo destino / servidor. Para esto ocuparemos la lista de archivos generada en el archivo cr_new_sid.sql:
    • cp origen destino
    • ftp origen - destino
  3. Borrar archivos de control (si se han copiado en este traspaso) en el nuevo ambiente (no en el ambiente original)
  4. cambiar permisos archivos destino para que sean leidos por usuario dueño de base de datos (chown).
  5. Ajustar listener - tnsnames para conectarse a nueva instancia
  6. Traspaso de cr_new_sid.sql a nuevo ambiente (si está en otro servidor) o ruta y del init_new_sid.ora


Edición del cr_new_sid.sql
Este archivo contiene una serie de comentarios y elementos que no usaremos en nuestra tarea, así que eliminaremos componentes y depuraremos este archivo.
  1. Borrar todas las líneas del inicio del archivo, incluyendo la segunda instancia de 'STARTUP MOUNT' (debiese ser más allá de la mitad del archivo)
  2. Borrar todas las líneas que comiencen con --
  3. Borrar todas las líneas que comiencen con #
  4. Borrar todas las líneas en blanco en la sección de 'CREATE CONTROLFILE'
  5. Borrar la linea 'RECOVER DATABASE USING BACKUP CONTROLFILE' (muy importante)
  6. Ir al inicio de 'CREATE CONTROLFILE' y cambiar la palabra REUSE por SET
  7. Cambiar el nombre de la base de datos, en caso de que el nombre de la base de datos vaya a ser cambiado.
  8. Cambiar las rutas por las nuevas rutas que se vayan a usar

Subida de nueva base de datos:
  1. Editar tnsnames.ora y listener.ora
    • Editar estos archivos para registrar la nueva base de datos, su ruta y puerto de acceso
  2. Bajar la base de datos original:
    • Cuando subamos la nueva colisionará con esta base de datos. No subirla hasta que se cambie el nombre a la base de datos nueva. No es necesario bajarla, evidentemente, si la estamos subiendo en otro servidor.
  3. Conectarse a la B.D. (sqlplus) 
  4. Finalmente, iniciamos y ejecutamos nuestro script antes editado:
  5. startup nomount
    Subimos la base de datos pero sin abrirla
    @cr_new_sid.sql
    Ejecutamos el archivo antes editado para :
    • crear el nuevo control file
    • abrir la b.d. y reiniciar logs
    • añadir los tablespaces / datafiles temporales



Pasos posteriores
  • Configurar las variables de ambiente para esta base de datos en el $HOME/.profile del usuario. Incluir ORACLE_HOME, ORACLE_SID, TNS_ADMIN, entre otras
  • Cambiar el database id: (para el caso de uso de RMAN, es requerido cambiar el ID de la B.D.)
    • via sqlplus:
    • shutdown immediate
    • startup mount
    • exit
    • via unix:
nid target=/
solicitará cambiar el id, se acepta y procede el cambio

    • via sqlplus
    • shutdown immediate
    • startup mount
    • alter database open resetlogs

Confirmar funcionamiento de B.D.
Si queremos confirmar los resultados (aunque cualquier error debiese haber aparecido al iniciar la base de datos), podemos:
verificar estatus de B.D.
select status from v$instance;
verificar datafiles
select distinct status from v$datafile;