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
Felipe, como me hago miembro del blog?
salu2,
A
Don Felipe, se que mi consulta no va en este tema pero me asalta una duda.
cuando intento cargar datos desde un texto plano con sql*loader no se donde debo colocar el archivo de control, es válido colocar el directorio en que se encuentra al momento de ejecutar elcomando?
si es posible en algun momento poder redactar algun post referente a este tema seria ahun mejor, gracias
Estimado Bastian
El archivo de control del SQLLOADER lo puedes ubicar en cualquier parte, en particular en el directorio desde donde ejecutas el comando. En este caso no tienes que especificar el full path name del archivo. En cualquier otro caso debes especificar el full path name del archivo.
Por orden debieras tener un directorio llamado cargas y dentro de este directorio puedes tener un subdirectorio llamado ctl donde puedes ubicar todos los archivos de control, otro directorio llamado flatfiles, donde guardes los archivos planos a cargar, y asi sucesivamente con los reject files, bad files, log files.
Suerte
Felipe
aaaaa ya entendí, muchas gracias, el enredo que tenia es que estaba realizando el sqlloader desde el sqlplus, pero cuando mencionó «directorio desde donde ejecutas el comando» me di cuenta que estaba errado y era desde la consola, tomaré en cuenta la buena práctica de crear un directorio para las cargas y sus correspondientes subdirectorios
Se le agradece enormemente
Bastián.-
Cordial Saludos,
Soy novato, pero entiendo rapido
tengo un problema que al paracer no tengo enpacio en la particion para crear o redimensionar unos datafile, tengo otras particiones las cuales si tienen espacios que puedo hacer gracias
ORACLE 11G
==========
SQLPLUS /NOLOG
CONN / AS SYSDBA
SHUTDOWN IMMEDIATE
EXIT
* DETENER LOS SERVICIOS DE TNSLISTER Y DE LA BASE.
COPIAR C:appAdministratoradminDBEJEMPLOpfileINI.ORA.xxxxxxxxxx A C:appAdministratorproduct11.1.0db_1databaseinitDBEJEMPLO.ora
MOVER C:appAdministratorproduct11.1.0db_1databaseSPFILEDBEJEMPLO.ORA A OTRA UBICACION COMO RESPALDO
EDITAR initDBEJEMPLO.ora Y CAMBIAR RUTAS (CONTROLFILES, FLASHRECOVERY Y ARCHIVED)
COPIAR ARCHIVOS FISICOS DE LA BASE A LA NUEVA RUTA (DATAFILES, REDOLOGS Y CONTROLFILES, TODO…)
CREAR ESTRUCTURAS DE DIRECTORIOS PARA ARCHIVED Y FLASHRECOVERY.
* INICIAR SERVICIOS DE TNSLISTENER Y DE LA BASE.
SQLPLUS /NOLOG
CONN / AS SYSDBA
* SHUTDOWN IMMEDIATE
STARTUP MOUNT;
CAMBIAR RUTAS DE LOS ARCHIVOS UNO POR UNO.
ALTER DATABASE RENAME FILE ‘G:ORACLEDBEJEMPLOSYSAUX01.DBF’ TO ‘D:ORACLEDBEJEMPLOSYSAUX01.DBF’;
ALTER DATABASE RENAME FILE ‘G:ORACLEDBEJEMPLOTEMP01.DBF’ TO ‘D:ORACLEDBEJEMPLOTEMP01.DBF’;
ALTER DATABASE RENAME FILE ‘G:ORACLEDBEJEMPLOUNDOTBS01.DBF’ TO ‘D:ORACLEDBEJEMPLOUNDOTBS01.DBF’;
ALTER DATABASE RENAME FILE ‘G:ORACLEDBEJEMPLOREDO01.LOG’ TO ‘D:ORACLEDBEJEMPLOREDO01.LOG’;
ALTER DATABASE RENAME FILE ‘G:ORACLEDBEJEMPLOREDO02.LOG’ TO ‘D:ORACLEDBEJEMPLOREDO02.LOG’;
ALTER DATABASE RENAME FILE ‘G:ORACLEDBEJEMPLOREDO03.LOG’ TO ‘D:ORACLEDBEJEMPLOREDO03.LOG’;
ALTER DATABASE OPEN;
EXIT;
PROBAR BASE DE DATOS.
** ELIMINAR SPFILEDBEJEMPLO.ORA
** ELIMINAR CARPETA CON RUTA DE BASE DE DATOS ANTERIOR.
DONE.
* solo si es windows.
** no realizar hasta nos aseguremos que la base de datos funcione correctamente.