Oracle Tunning | How to change the Redo Log File size

innodb-transactions
Image by martin.guo via Flickr

Como redimensionar REDOLOG FILE

Hace algunos dias estuvimos trabajando en el redimensionamiento de los redo log file.

Que nos llevo a tomar esta decisión ?

La aplicación ESB (Enterprise Service Bus) que tenemos en una entidad financiera puso en funcionamiento un nuevo canal sin previo aviso, generando una gran cantidad de transacciones, aumentado notablemente el commit.

Esto provoco que se incrementara la cantidad de log switch y que el espacio dimensionado de los REDOLOGS no sea suficiente. Obviamente impacto notablemente en la performance de la base de datos.

Cual era el escenario ?

  • 8 REDO GROUPS
  • 4 REDO THREADS
  • 50 MB el volumen de los Redo Logs Files
SQL> set line 150
SQL> select * from v$log;

    GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS	    FIRST_CHANGE# FIRST_TIM
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- ---------
	 1	    1	    1795   52428800	     2 YES INACTIVE	       1770421689 30-MAY-11
	 2	    1	    1796   52428800	     2 NO  CURRENT	       1770770352 31-MAY-11
	 3	    2	    1429   52428800	     2 YES INACTIVE	       1770671024 30-MAY-11
	 4	    2	    1430   52428800	     2 NO  CURRENT	       1770770347 31-MAY-11
	 5	    3	     871   52428800	     2 YES INACTIVE	       1770714581 30-MAY-11
	 6	    3	     872   52428800	     2 NO  CURRENT	       1770770350 31-MAY-11
	 7	    4	     853   52428800	     2 NO  CURRENT	       1770770342 31-MAY-11
	 8	    4	     852   52428800	     2 YES INACTIVE	       1770421681 30-MAY-11

8 rows selected.

Plan de Acción

Lo que que hay que realizar como tareas los resumimos en los siguientes puntos:

  • Agregar Grupos Nuevos que llamaremos administrativos. (Recordemos que debemos tener como minimo debemos tener dos miembros por cada grupo)
  • Switchear para que los grupos entren en modo ARC=YES STATUS=INACTIVE
  • Eliminar Grupos Dispobibles. (Elijo los pares)
  • Agregar Grupos (Grupos Pares) con el Nuevo Volumen.
  • Eliminar Grupos Dispobibles. (Elijo los impares)
  • Agregar Grupos (Grupos Impares) con el Nuevo Volumen.
  • Eliminar Grupos Creados
  • Eliminamos Grupos Administrativos.

Estas tareas podemos hacerlo con la base online sin tener que hacer un shutdown a la base .
El primer paso implica verificar que el status de los REDOLOGS de la base sea INACTIVE.

Vamos a revisar con la siguiente query como se encuentra

SQL> select group#, status from v$log;

    GROUP# STATUS
---------- ----------------
	 1 INACTIVE
	 2 CURRENT
	 3 INACTIVE
	 4 CURRENT
	 5 INACTIVE
	 6 CURRENT
	 7 CURRENT
	 8 INACTIVE

8 rows selected.

SQL>

Como primer paso vamos a crear los REDOLOGS que llamamos administrativos, que nos permiten rotar y principalmente poder eliminar los grupos que vayamos a ridemensionar. Esto es importantante ya que por lo menos precisamos dos Grupos, si no incurriremos en el error ORA-01567

SQL> ALTER DATABASE ADD LOGFILE THREAD 1 GROUP 9 SIZE 512M;

Database altered.

SQL>  ALTER DATABASE ADD LOGFILE THREAD 2 GROUP 10 SIZE 512M;

Database altered.

SQL> ALTER DATABASE ADD LOGFILE THREAD 3 GROUP 11 SIZE 512M;

Database altered.

SQL> ALTER DATABASE ADD LOGFILE THREAD 4 GROUP 12 SIZE 512M;

Database altered.

SQL>

En un segundo paso podemos consultar los REDOLOGS creados , los antiguos y en que STATUS se encuentran.

De esta manera podemos conocer cuales tenemos disponibles para dropear.

Como paso previo hice mover los REDOLOGS, para que no tuvieran STATUS = UNUSED y se llenaran con la sentencia.

ALTER SYSTEM SWITCH LOGFILE;

Esto también provoco el cambio de STATUS de los demás grupos.

Veamos como quedo.

SQL> set line 150
SQL> select * from v$log;

    GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS	    FIRST_CHANGE# FIRST_TIM
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- ---------
	 1	    1	    1801   52428800	     2 NO  CURRENT	       1771100462 01-JUN-11
	 2	    1	    1799   52428800	     2 YES INACTIVE	       1770977996 31-MAY-11
	 3	    2	    1432   52428800	     2 NO  CURRENT	       1771100464 01-JUN-11
	 4	    2	    1430   52428800	     2 YES INACTIVE	       1770770347 31-MAY-11
	 5	    3	     874   52428800	     2 NO  CURRENT	       1771100467 01-JUN-11
	 6	    3	     872   52428800	     2 YES INACTIVE	       1770770350 31-MAY-11
	 7	    4	     856   52428800	     2 NO  CURRENT	       1771100460 01-JUN-11
	 8	    4	     855   52428800	     2 YES INACTIVE	       1771031333 31-MAY-11
	 9	    1	    1800  536870912	     2 YES INACTIVE	       1771031159 31-MAY-11
	10	    2	    1431  536870912	     2 YES INACTIVE	       1770977989 31-MAY-11
	11	    3	     873  536870912	     2 YES INACTIVE	       1770977992 31-MAY-11
	12	    4	     854  536870912	     2 YES INACTIVE	       1770977985 31-MAY-11

12 rows selected.

SQL>

Como podemos observar tenemos como STATUS = INACTIVE los grupos 2 4 6 8 de los viejos con dimensión 50MB, como asi también los grupos nuevos 9 10 11 12 de 500MB.

	 2	    1	    1799   52428800	     2 YES INACTIVE	       1770977996 31-MAY-11
	 4	    2	    1430   52428800	     2 YES INACTIVE	       1770770347 31-MAY-11
	 6	    3	     872   52428800	     2 YES INACTIVE	       1770770350 31-MAY-11
	 8	    4	     855   52428800	     2 YES INACTIVE	       1771031333 31-MAY-11

	 9	    1	    1800  536870912	     2 YES INACTIVE	       1771031159 31-MAY-11
	10	    2	    1431  536870912	     2 YES INACTIVE	       1770977989 31-MAY-11
	11	    3	     873  536870912	     2 YES INACTIVE	       1770977992 31-MAY-11
	12	    4	     854  536870912	     2 YES INACTIVE	       1770977985 31-MAY-11

Con este escenario voy a proceder a realizar los DROPEOS de los grupos que tienen el valor de 50MB.

SQL> ALTER DATABASE DROP LOGFILE GROUP 2;

Database altered.

SQL> ALTER DATABASE DROP LOGFILE GROUP 4;

Database altered.

SQL> ALTER DATABASE DROP LOGFILE GROUP 6;

Database altered.

SQL> ALTER DATABASE DROP LOGFILE GROUP 8;

Database altered.
SQL>

Observemos los grupos que quedan.

SQL> select * from v$log;

    GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS	    FIRST_CHANGE# FIRST_TIM
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- ---------
	 1	    1	    1801   52428800	     2 NO  CURRENT	       1771100462 01-JUN-11
	 3	    2	    1432   52428800	     2 NO  CURRENT	       1771100464 01-JUN-11
	 5	    3	     874   52428800	     2 NO  CURRENT	       1771100467 01-JUN-11
	 7	    4	     856   52428800	     2 NO  CURRENT	       1771100460 01-JUN-11
	 9	    1	    1800  536870912	     2 YES INACTIVE	       1771031159 31-MAY-11
	10	    2	    1431  536870912	     2 YES INACTIVE	       1770977989 31-MAY-11
	11	    3	     873  536870912	     2 YES INACTIVE	       1770977992 31-MAY-11
	12	    4	     854  536870912	     2 YES INACTIVE	       1770977985 31-MAY-11

8 rows selected.

Quedaron solo los GRUPOS 1 3 5 7 con dimensión de 50MB y los nuevos que usaremos como modo administrativo.

Agregamos los grupos 2 4 6 8 con la nueva dimensión de 500MB.

SQL> ALTER DATABASE ADD LOGFILE THREAD 1 GROUP 2 SIZE 512M;

Database altered.

SQL> ALTER DATABASE ADD LOGFILE THREAD 2 GROUP 4 SIZE 512M;

Database altered.

SQL> ALTER DATABASE ADD LOGFILE THREAD 3 GROUP 6 SIZE 512M;

Database altered.

SQL> ALTER DATABASE ADD LOGFILE THREAD 4 GROUP 8 SIZE 512M;

Database altered.

Observamos que los nuevos grupos fueron creados y se encuentran con STATUS = UNUSED.

SQL> select * from v$log;

    GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS	    FIRST_CHANGE# FIRST_TIM
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- ---------
	 1	    1	    1805   52428800	     2 NO  CURRENT	       1771231012 01-JUN-11
	 2	    1	       0  536870912	     2 YES UNUSED			0
	 3	    2	    1432   52428800	     2 YES ACTIVE	       1771100464 01-JUN-11
	 4	    2	       0  536870912	     2 YES UNUSED			0
	 5	    3	     874   52428800	     2 YES ACTIVE	       1771100467 01-JUN-11
	 6	    3	       0  536870912	     2 YES UNUSED			0
	 7	    4	     858   52428800	     2 NO  CURRENT	       1771231012 01-JUN-11
	 8	    4	       0  536870912	     2 YES UNUSED			0
	 9	    1	    1804  536870912	     2 YES INACTIVE	       1771231003 01-JUN-11
	10	    2	    1433  536870912	     2 NO  CURRENT	       1771231009 01-JUN-11
	11	    3	     875  536870912	     2 NO  CURRENT	       1771231006 01-JUN-11
	12	    4	     857  536870912	     2 YES INACTIVE	       1771230999 01-JUN-11

12 rows selected.

Hacemos correr los LOGS para poner en STATUS = INACTIVE los candidatos 1 3 5 7 para ser dropeados.

SQL> ALTER SYSTEM SWITCH LOGFILE; 
System altered.

SQL> ALTER SYSTEM SWITCH LOGFILE; 
System altered.

SQL> ALTER SYSTEM SWITCH LOGFILE; 
System altered.

SQL> ALTER SYSTEM SWITCH LOGFILE;

System altered.

Vuelvo a consultar , y nos queda el escenario nuevamente listo para dropear los candidatos.

SQL> select * from v$log;

    GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS	    FIRST_CHANGE# FIRST_TIM
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- ---------
	 1	    1	    1814   52428800	     2 YES INACTIVE	       1771252364 01-JUN-11
	 2	    1	    1815  536870912	     2 YES INACTIVE	       1771252371 01-JUN-11
	 3	    2	    1435   52428800	     2 YES INACTIVE	       1771252107 01-JUN-11
	 4	    2	    1437  536870912	     2 NO  CURRENT	       1771252369 01-JUN-11
	 5	    3	     877   52428800	     2 YES INACTIVE	       1771252113 01-JUN-11
	 6	    3	     879  536870912	     2 NO  CURRENT	       1771272936 01-JUN-11
	 7	    4	     861   52428800	     2 YES INACTIVE	       1771252347 01-JUN-11
	 8	    4	     862  536870912	     2 NO  CURRENT	       1771252369 01-JUN-11
	 9	    1	    1816  536870912	     2 NO  CURRENT	       1771272935 01-JUN-11
	10	    2	    1436  536870912	     2 YES INACTIVE	       1771252347 01-JUN-11
	11	    3	     878  536870912	     2 YES INACTIVE	       1771252369 01-JUN-11
	12	    4	     860  536870912	     2 YES INACTIVE	       1771251877 01-JUN-11

12 rows selected.

SQL> ALTER DATABASE DROP LOGFILE GROUP 2;

Database altered.

SQL> ALTER DATABASE DROP LOGFILE GROUP 3;

Database altered.

SQL> ALTER DATABASE DROP LOGFILE GROUP 5;

Database altered.

SQL> ALTER DATABASE DROP LOGFILE GROUP 7;

Database altered.

SQL>

Agregamos los grupos nuevos correspondientes a la serie 1 3 5 7.

SQL> ALTER DATABASE ADD LOGFILE THREAD 1 GROUP 1 SIZE 512M;

Database altered.

SQL> ALTER DATABASE ADD LOGFILE THREAD 2 GROUP 3 SIZE 512M;

Database altered.

SQL> ALTER DATABASE ADD LOGFILE THREAD 3 GROUP 5 SIZE 512M;

Database altered.

SQL> ALTER DATABASE ADD LOGFILE THREAD 4 GROUP 7 SIZE 512M;

Database altered.

Una vez que tenemos todos los grupos redimensionados podemos hacer correr los logs nuevamente y eliminar los grupos que usamos como administrativos que se corresponden con la serie 9 10 11 12 .

SQL> ALTER DATABASE DROP LOGFILE GROUP 9 ;

Database altered.

SQL> ALTER DATABASE DROP LOGFILE GROUP 10 ;

Database altered.

SQL> ALTER DATABASE DROP LOGFILE GROUP 11 ;

Database altered.

SQL> ALTER DATABASE DROP LOGFILE GROUP 12 ;

Database altered.

Resultado Final, REDOLOGS de 500MB y nuestros problemas de performance resueltos.

SQL> select * from v$log;

    GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS	    FIRST_CHANGE# FIRST_TIM
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- ---------
	 1	    1	    1838  536870912	     2 YES INACTIVE	       1771633054 02-JUN-11
	 2	    1	    1839  536870912	     2 NO  CURRENT	       1771633057 02-JUN-11
	 3	    2	    1444  536870912	     2 YES INACTIVE	       1771632828 02-JUN-11
	 4	    2	    1445  536870912	     2 NO  CURRENT	       1771633063 02-JUN-11
	 5	    3	     888  536870912	     2 YES INACTIVE	       1771633031 02-JUN-11
	 6	    3	     889  536870912	     2 NO  CURRENT	       1771633057 02-JUN-11
	 7	    4	     874  536870912	     2 NO  CURRENT	       1771633057 02-JUN-11
	 8	    4	     873  536870912	     2 YES INACTIVE	       1771633044 02-JUN-11

8 rows selected.SQL>

Como llego a la conclusión de que el problema quedo resuelto ?

Por que al principio tome un reporte de AWR y lo compare con otro reporte AWR que tome al final, luego de haber dejado correr durante un periodo los cambios.

One thought on “Oracle Tunning | How to change the Redo Log File size

Comments are closed.