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:
select name, bytes
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:
- Bajar base de datos origen
- 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
- Borrar archivos de control (si se han copiado en este traspaso) en el nuevo ambiente (no en el ambiente original)
- cambiar permisos archivos destino para que sean leidos por usuario dueño de base de datos (chown).
- Ajustar listener - tnsnames para conectarse a nueva instancia
- Traspaso de cr_
new_sid.sql a nuevo ambiente (si está en otro servidor) o ruta y del init_new_sid .ora
Este archivo contiene una serie de comentarios y elementos que no usaremos en nuestra tarea, así que eliminaremos componentes y depuraremos este archivo.
Subida de nueva base de datos:
Pasos posteriores
- 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)
- Borrar todas las líneas que comiencen con --
- Borrar todas las líneas que comiencen con #
- Borrar todas las líneas en blanco en la sección de 'CREATE CONTROLFILE'
- Borrar la linea 'RECOVER DATABASE USING BACKUP CONTROLFILE' (muy importante)
- Ir al inicio de 'CREATE CONTROLFILE' y cambiar la palabra REUSE por SET
- Cambiar el nombre de la base de datos, en caso de que el nombre de la base de datos vaya a ser cambiado.
- Cambiar las rutas por las nuevas rutas que se vayan a usar
- Editar tnsnames.ora y listener.ora
- Editar estos archivos para registrar la nueva base de datos, su ruta y puerto de acceso
- 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.
- Conectarse a la B.D. (sqlplus)
- Finalmente, iniciamos y ejecutamos nuestro script antes editado:
- startup nomountSubimos 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; |