SafeChildren Banner

Havoc Oracle Solaris Experts

miércoles, 28 de octubre de 2009

Mover DataFile en Caliente en Oracle Solaris

Introducción
Una de las tareas con las que nos encontramos en el mundo Oracle es el uso de I/O y como distribuir la carga entre diferentes LUNs. Para ello, podemos mover los datafiles que necesitemos de la siguiente manera:

Si nuestra base de datos está en ARCHIVE_MODE,
  1. Poner DataFile en Offline
  2. Mover/Copiar DataFile de Ubicación original a la nueva
  3. Recuperar DataFile
  4. Poner DataFile en Online

Debemos tener en cuenta que mientras dure esta tarea, los accesos al DataFile lanzarán una Excepción de "No se puede acceder al datafile /u0x/oradata/XYZ.dbf'

Veamos el ejemplo para mover el DataFile EXAD01.dbf de /u05 a /u02
SQL> ALTER DATABASE DATAFILE '/u05/oradata/OLTP1/EXAD01.dbf' OFFLINE;

Base de datos modificada.

SQL> !mv /u05/oradata/OLTP1/EXAD01.dbf /u02/oradata/OLTP1/EXAD01.dbf

SQL> ALTER DATABASE RENAME FILE '/u05/oradata/OLTP1/EXAD01.dbf' TO '/u02/oradata/OLTP1/EXAD01.dbf';

Base de datos modificada.

SQL> RECOVER DATAFILE '/u02/oradata/OLTP1/EXAD01.dbf';
Recuperacion del medio fisico terminada.

SQL> ALTER DATABASE DATAFILE '/u02/oradata/OLP1/EXAD01.dbf' ONLINE;

Base de datos modificada.

Como podéis ver, es un procedimiento muy sencillo aunque NO EXENTO DE PROBLEMAS, ya que si no hacemos el movimiento de forma atómica, podemos hacer que nuestra DB deje de funcionar

Y Si no está en Modo ARCHIVE?
Si la base de datos no está en modo Archive, no se puede hacer en caliente, y simplemente debemos hacer los siguientes pasos,
  1. Bajar la base de datos
  2. Mover/Copiar el DataFile
  3. Montar Base de Datos
  4. Lanzar el Rename
  5. Abrir Base de datos
Vemos los pasos con un ejemplo,
SQL> SHUTDOWN IMMEDIATE;
SQL> !mv /u05/oradata/OLTP1/EXAD01.dbf /u02/oradata/OLTP1/EXAD01.dbf
SQL> STARTUP MOUNT
SQL> ALTER DATABASE RENAME FILE '/u05/oradata/OLTP1/EXAD01.dbf' TO '/u02/oradata/OLTP1/EXAD01.dbf';
SQL> ALTER DATABASE OPEN;
Cómo sé si Oracle está en modo Archive?
Podemos lanzar la siguiente SQL
SQL> select log_mode from sys.v_$database;

LOG_MODE
------------
ARCHIVELOG
Referencias

No hay comentarios:

Publicar un comentario