Script que genera Script de reubicación de datafiles y redolog files

Frecuentemente el dba oracle debe cambiar la ubicación de la base de datos, ya sea por mantención, o por una migración a una nueva plataforma. La técnica para realizar esto es montar la base de datos con el archivo de control ya ubicado en su posición final, e informarle al archivo de control sobre la nueva ubicación que tienen los datafiles (V$DATAFILE) y redolog files (V$LOGFILE). Se debe recordar que el archivo de control es el que guarda la metadata de estructura física de la base de datos. Esto se hace con el siguiente comando:

SQL> ALTER DATABASE RENAME FILE ‘/u01/app/oracle/oradata/sirio/system01.dbf’ TO ‘/u02/oradata/sirio/system01.dbf’ ;

Donde ‘/u01/app/oracle/oradata/sirio/system01.dbf’ es el nombre original del archivo y ‘/u02/oradata/sirio/system01.dbf’ es el nuevo nombre y ubicación del archivo.

Lo anterior se debe hacer para cada uno de los datafiles y redolog files que existan en la base de datos. Si son muchos la tarea de generar el script puede ser titánica, y la posibilidad de errores aumenta.

Con la instancia abajo previamente se mueven todos los archivos desde la ubicación original a la nueva ubicación. En el caso del ejemplo, suponiendo que toda la base de datos original se encuentra en /u01/app/oracle/oradata/sirio/ y la nueva ubicación es /u02/oracle/oradata/sirio, entonces a nivel de Sistema Operativo (Linux) se hace lo siguiente:

$ mv /u01/app/oracle/oradata/sirio/*   /u02/oradata/sirio/

A continuación se presenta un ejemplo de una consulta que genera el script que permite ejecutar la reubicación en forma mucho más fácil. Primero se conecta a la consola de administración:

$sqlplus / as sysdba

SQL> startup mount

set pagesize 0
set linesize 2000
set feedback off
set echo off
spool mueve.sql
Rem
Rem    Crea Comandos SQL para alterar el nombre y la ruta de los archivos de la base de datos
Rem    El destino está en duro ( /u02/oradata/sirio/ ), los usuarios pueden alterar este destino a su necesidad
Rem
Rem    AUTOR: FELIPE MANRIQUEZ (www.neuronet.cl)
Rem
Rem    Permitida su reproducción referenciando al autor
Rem
Rem
SELECT columna1 FROM
(select ‘ ALTER DATABASE RENAME FILE ‘||””||name||””||’ TO ‘||””|| ‘/u02/oradata/sirio/’||
substr(name, instr(name, ‘/’,-1,1) +1, length(name) )||””||’ ;’||chr(10) columna1,
1 columna2
from v$datafile
UNION
select ‘ ALTER DATABASE RENAME FILE ‘||””||member||””||’ TO ‘||””|| ‘/u02/oradata/sirio/’||
substr(member, instr(member, ‘/’,-1,1) +1, length(member) )||””||’ ;’||chr(10) , 2
from v$logfile)
ORDER BY columna2
/
spool off

SQL> REM ver versión ASCII del comando anterior haciendo click en  genera_mueve

SQL> spool off

finalmente se revisa el script, y se ejecuta .

SQL> @mueve.sql

Se comprueba que todo esté OK pasando dela base montada a base de datos abierta

SQL> ALTER DATABASE OPEN;

Si no hay errores, significa que todos los archivos se cambiaron de nombre correctamente

FIN