You are on page 1of 16

Multiplexando los Redo Log Files en Oracle

El multiplexar es una opcin que nos ayuda a reducir el riesgo de falla en la base de
datos Oracle.
Para multiplexar los redo logs se debe proceder de la siguiente manera:
Paso 1: Realizamos un select a la siguiente vista para determinar la configuracin
actual de los redo logs de la base de datos:
SELECT * FROM V$LOGFILE;
Paso 2: Ejecutamos el comando ALTER DATABASE para generar miembros en cada
grupo de redo logs:
ALTER DATABASE ADD LOGFILE MEMBER /oracle/dbs/log2b.log TO GROUP 2;
Nota: Cuando adicionamos un miembro a un redo log group no es necesario especificar
el tamao, por consiguiente, todos los redo log files en el grupo sern del mismo
tamao.
Paso 3: Verificamos otra vez la vista V$LOGFILE para verificar que se ha aadido el
nuevo miembro al grupo:
SELECT * FROM V$LOGFILE;

Como multiplexar un controlfile, utilizando OMF y ASM


Un problema con el que nos hemos encontrado en nuestro entorno de bases de datos, en concreto
despus de una instalacin Oracle 10.2.0.1 parcheada a la 10.2.0.3, ha sido el de tener que duplicar
el controlfile. En la siguiente nota indico el procedimiento que he seguido, teniendo en cuenta que
se est haciendo uso de +ASM, usando la herramienta RMAN proporcionada por Oracle.
Lo primero que hay que hacer es identificar el controlfile existente:
SQL> SELECT NAME FROM V$CONTROLFILE;
Ahora hay que parar la base de datos e iniciarla en modo nomount:
SQL> SHUTDOWN IMMEDIATE;
.
SQL> STARTUP NOMOUNT;
Este es el momento de, usar RMAN para duplicar el archivo de control (la rplica se har en el disco
flash):

$ rman nocatalog;
RMAN> CONNECT TARGET;
RMAN> RESTORE CONTROLFILE TO +DISCO_FLASH FROM
+DISCO_DATOS/ruta/nombre_ctl;
Se identifica en este momento el nombre del controlfile en la flash; teniendo en cuenta que estamos
haciendo uso de OMF, no sabemos qu nombre le va a poner Oracle al segundo controlfile, por eso
es imprescindible este paso. sto se pude hacer desde SQLPLUS (como se puede observar ms
arriba) o con la nueva herramienta proporcionada por Oracle 10.2, ASMCMD:
$ asmcmd
ASMCMD> CD +DISCO_FLASH
ASMCMD> FIND -t controlfile*
Modificar ahora el SPFILE. Esto se puede hacer desde cualquier nodo cuando estamos en un
entorno Oracle RAC:
SQL> ALTER SYSTEM SET CONTROL_FILES =
+DISCO_DATOS/ruta/nombre_ctl,'+DISCO_FLASH/ruta/nombre_ctl;
SQL> SHUTDOWN IMMEDIATE;
SQL> CONN / AS SYSDBA
SQL> STARTUP;
PUBLICADO POR RODOLFO CNDIDO EN 11:3

Reubicar y Renombrar Redo Log Members


Para cambiar el nombre o cambiar de ubicacin a los redo logs, se debe tener privilegio de sistema
para alterar la base de datos ALTER DATABASE. Adems, se necesita privilegios de sistema
operativo para copiar los archivos a la ubicacin deseada y privilegios para abrir y respaldar la base
de datos.
Nota: Es recomendable que antes de reubicar tus redo logs, o hacer un cambio estructural a la base
de datos la respaldescompletamente, ya que se podra tener algn problema en la operacin a
realizar.Despus de renombrar o reubicar un set de redo log files debes inmediatamente respaldar
los archivos de control de la base de datos.

A continuacin se describe el scenario:


1: Los redolog files de este ejemplo estn localizados sobre dos discos: disk01 y disk02
2: El primer grupo de redo logs consiste de los siguientes miembros: /disk01/logs/log101.log y
/disk02/logs/log102.log, y el segundo grupo consiste de los miembros /disk01/logs/log201.log y
/disk02/logs/log202.log.
3: Los redolog files localizados sobre el disk01 deben ser reubicados al disk03, y debern reflejar las
siguientes rutas: /disk03/logs/log103.log y /disk03/logs/log203.log
Pasos para renombrar o reubicar los redo logs:
1: Bajar la base de datos:
SHUTDOWN
2: Copiar los redo redo log files a la nueva localizacin utilizando comandos de sistema operativo.
3: En el caso de Unix o Linux para mover los redo logs a una nueva localizacin ejecutamos el
siguiente comando:
mv /disk01/logs/log101.log /disk03/logs/log103.logmv /disk01/logs/log201.log
/disk03/logs/log203.log
4: Levantamos la base de datos en modo MOUNT:
STARTUP MOUNT
5: Utilizando la sentencia ALTER DATABASE con la clusula RENAME FILE renombramos los redo
logs:
ALTER DATABASERENAME FILE /disk01/logs/log1a.log, /disk01/logs/log2a.log TO
/disk03/logs/log1c.log, /disk03/logs/log2c.log;
6: Abrimos la base de datos:
ALTER DATABASE OPEN;

Oracle Redo Log Files Multiplexing


First of all, lets see output from v$log and v$logfile.

SQL> select * from v$logfile;

GROUP# STATUS

TYPE

MEMBER

IS_

--------------------------------------------------------------------------------------------------------- --------3 STALE


ONLINE
G:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL1\REDO03.LOG
NO
2
ONLINE
G:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL1\REDO02.LOG
NO
1
ONLINE
G:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL1\REDO01.LOG
NO

SQL> select * from v$log;

GROUP#
THREAD# SEQUENCE#
FIRST_CHANGE# FIRST_TIM

BYTES

MEMBERS ARC STATUS

---------- ---------- ---------- ---------- ---------- ------------------ ------------- ---------

1
799976 01-MAY-12

11

52428800

1 YES INACTIVE

2
800427 01-MAY-12

12

52428800

1 NO

3
779491 29-APR-12

10

52428800

1 YES INACTIVE

CURRENT

As shown above, Group 2 was the CURRENT one and Group 3 becomes CURRENT one after switching log.

SQL> alter system switch logfile;

System altered.

SQL> select * from v$log;

GROUP#
THREAD# SEQUENCE#
FIRST_CHANGE# FIRST_TIM

BYTES

MEMBERS ARC STATUS

---------- ---------- ---------- ---------- ---------- ------------------ ------------- --------1


799976 01-MAY-12

11

52428800

1 YES INACTIVE

2
800427 01-MAY-12

12

52428800

1 YES ACTIVE

3
802153 01-MAY-12

13

52428800

1 NO

CURRENT

To change Group Status from ACTIVE to INACTIVE, we need to issue checkpoint.

SQL> alter system checkpoint;

System altered.

SQL> select * from v$log;

GROUP#
THREAD# SEQUENCE#
FIRST_CHANGE# FIRST_TIM

BYTES

MEMBERS ARC STATUS

---------- ---------- ---------- ---------- ---------- ------------------ ------------- --------1


799976 01-MAY-12

11

52428800

1 YES INACTIVE

2
800427 01-MAY-12

12

52428800

1 YES INACTIVE

3
802153 01-MAY-12

13

52428800

1 NO

CURRENT

It is possible to add logfile even if Group is the CURRENT one.

SQL> alter database add logfile member


'G:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL1\REDO03A.LOG' to group 3;

Database altered.

SQL> select * from v$log;

GROUP#
THREAD# SEQUENCE#
FIRST_CHANGE# FIRST_TIM

BYTES

MEMBERS ARC STATUS

---------- ---------- ---------- ---------- ---------- ------------------ ------------- --------1


799976 01-MAY-12

11

52428800

1 YES INACTIVE

2
800427 01-MAY-12

12

52428800

1 YES INACTIVE

3
802153 01-MAY-12

13

52428800

2 NO

CURRENT

SQL> alter database add logfile member


'G:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL1\REDO03B.LOG' to group 3;

Database altered.

SQL> select * from v$log;

GROUP#
THREAD# SEQUENCE#
FIRST_CHANGE# FIRST_TIM

BYTES

MEMBERS ARC STATUS

---------- ---------- ---------- ---------- ---------- ------------------ ------------- ---------

1
799976 01-MAY-12

11

52428800

1 YES INACTIVE

2
800427 01-MAY-12

12

52428800

1 YES INACTIVE

3
802153 01-MAY-12

13

52428800

3 NO

CURRENT

SQL> select member from v$logfile where group# = 3;

MEMBER
-----------------------------------------------------G:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL1\REDO03.LOG
G:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL1\REDO03A.LOG
G:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL1\REDO03B.LOG

It is not possible to drop CURRENT Group but we can drop any other GROUP.

SQL> alter database drop logfile


alter database drop logfile

group 3;

group 3

*
ERROR at line 1:
ORA-01623: log 3 is current log for instance orcl1 (thread 1) - cannot
drop

ORA-00312: online log 3 thread 1:


'G:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL1\REDO03.LOG'
ORA-00312: online log 3 thread 1:
'G:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL1\REDO03A.LOG'
ORA-00312: online log 3 thread 1:
'G:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL1\REDO03B.LOG'

SQL> alter database drop logfile

group 1;

Database altered.

SQL> select * from v$log;

GROUP#
THREAD# SEQUENCE#
FIRST_CHANGE# FIRST_TIM

BYTES

MEMBERS ARC STATUS

---------- ---------- ---------- ---------- ---------- ------------------ ------------- --------2


800427 01-MAY-12

12

52428800

1 YES INACTIVE

3
802153 01-MAY-12

13

52428800

3 NO

CURRENT

While adding Group again, you may consider all the groups to be of same size (better practice).

SQL> alter database add logfile group 1 size 52428800;

Database altered.

SQL> select * from v$log;

GROUP#
THREAD# SEQUENCE#
FIRST_CHANGE# FIRST_TIM

BYTES

MEMBERS ARC STATUS

---------- ---------- ---------- ---------- ---------- ------------------ ------------- --------1

52428800

1 YES UNUSED

2
800427 01-MAY-12

12

52428800

1 YES INACTIVE

3
802153 01-MAY-12

13

52428800

3 NO

CURRENT

SQL> select member from v$logfile where group# =1;

MEMBER
---------------------------------------------------------------------------------------------------G:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\ORCL1\ONLINELOG\O1_MF_1_7T01
969R_.LOG

While trying to add member for GROUP 1, it will generate error for same file name. we need to delete it
physically as it's not an OMF FILE.

SQL> alter database add logfile member


'G:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL1\REDO01.LOG' to group 1;
alter database add logfile member
'G:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL1\REDO01.LOG' to group 1
*
ERROR at line 1:
ORA-00301: error in adding log file
'G:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL1\REDO01.LOG' - file cannot be
created
ORA-27038: created file already exists
OSD-04010:

option specified, file already exists

SQL> alter database add logfile member


'G:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL1\REDO01.LOG' to group 1;

Database altered.

SQL> alter database add logfile member


'G:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL1\REDO01A.LOG' to group 1;

Database altered.

SQL> alter database add logfile member


'G:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL1\REDO01B.LOG' to group 1;

Database altered.

SQL> select * from v$log;

GROUP#
THREAD# SEQUENCE#
FIRST_CHANGE# FIRST_TIM

BYTES

MEMBERS ARC STATUS

---------- ---------- ---------- ---------- ---------- ------------------ ------------- --------1

52428800

4 YES UNUSED

2
805988 01-MAY-12

17

52428800

1 YES INACTIVE

3
806007 01-MAY-12

18

52428800

3 NO

CURRENT

Now, let's try to drop this OMF redo file, will encounter error eventually as it is still unused. switch log file to
avoid this error.

SQL> alter database drop logfile member


'G:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\ORCL1\ONLINELOG\O1_MF_1_7T0
1969R_.LOG';
alter database drop logfile member
'G:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\ORCL1\ONLINELOG\O1_MF_1_7T0
1969R_.LOG'
*
ERROR at line 1:

ORA-00362: member is required to form a valid logfile in group 2


ORA-01517: log member:
'G:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\ORCL1\ONLINELOG\O1_MF_1_7T0
1969R_.LOG'

SQL> alter system switch logfile;

System altered.

SQL> select * from v$log;

GROUP#
THREAD# SEQUENCE#
FIRST_CHANGE# FIRST_TIM

BYTES

MEMBERS ARC STATUS

---------- ---------- ---------- ---------- ---------- ------------------ ------------- --------1


806398 01-MAY-12

19

52428800

4 NO

2
805988 01-MAY-12

17

52428800

3 YES INACTIVE

3
806007 01-MAY-12

18

52428800

3 YES ACTIVE

SQL> alter system switch logfile;

System altered.

CURRENT

SQL> select * from v$log;

GROUP#
THREAD# SEQUENCE#
FIRST_CHANGE# FIRST_TIM

BYTES

MEMBERS ARC STATUS

---------- ---------- ---------- ---------- ---------- ------------------ ------------- --------1


806398 01-MAY-12

19

52428800

4 YES ACTIVE

2
806404 01-MAY-12

20

52428800

3 NO

3
806007 01-MAY-12

18

52428800

3 YES ACTIVE

CURRENT

SQL> alter database drop logfile member


'G:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\ORCL1\ONLINELOG\O1_MF_1_7T0
1969R_.LOG';

Database altered.

SQL> select * from v$log;

GROUP#
THREAD# SEQUENCE#
FIRST_CHANGE# FIRST_TIM

BYTES

MEMBERS ARC STATUS

---------- ---------- ---------- ---------- ---------- ------------------ ------------- --------1


806398 01-MAY-12

19

52428800

3 YES ACTIVE

2
806404 01-MAY-12

20

52428800

1 NO

CURRENT

3
806007 01-MAY-12

18

52428800

3 YES ACTIVE

Let's Multiplex Members for Group 2. Here, all members are placed in same location but it's just a demo.
Multiplexing must be done on different disk or disk controllers.

SQL> alter database add logfile member


'G:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL1\REDO02A.LOG' to group 2;

Database altered.

SQL> alter database add logfile member


'G:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL1\REDO02B.LOG' to group 2;

Database altered.

SQL> select * from v$log;

GROUP#
THREAD# SEQUENCE#
FIRST_CHANGE# FIRST_TIM

BYTES

MEMBERS ARC STATUS

---------- ---------- ---------- ---------- ---------- ------------------ ------------- ---------

1
806398 01-MAY-12

19

52428800

3 YES ACTIVE

2
806404 01-MAY-12

20

52428800

3 NO

3
806007 01-MAY-12

18

52428800

3 YES ACTIVE

SQL> select member from v$logfile order by 1;

MEMBER
--------------------------------------------------------G:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL1\REDO01.LOG
G:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL1\REDO01A.LOG
G:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL1\REDO01B.LOG
G:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL1\REDO02.LOG
G:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL1\REDO02A.LOG
G:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL1\REDO02B.LOG
G:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL1\REDO03.LOG
G:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL1\REDO03A.LOG
G:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL1\REDO03B.LOG

CURRENT