jueves, 18 de mayo de 2023

Tuning Redo Logs

Para mejorar la performance en las escrituras a disco, es necesario que el tamaño de los redologs sea suficiente como para que se hagan como máximo 3 switch de redologs por hora.
Esto es independiente de la version de base de datos que estemos usando, el uso de los redologs en Oracle es igual en todas las versiones inclusive si es una CDB o no.
En este ejemplo detectamos en el alert.log que se estan ejecutando switch de redolog cada 2 minutos. Esto genera mucho overhead.

Mon Feb 06 16:21:23 2017
Thread 1 cannot allocate new log, sequence 104612
Checkpoint not complete
  Current log# 1 seq# 104611 mem# 0:/u01/oradata/TEST/redo01.log
Thread 1 advanced to log sequence 104612 (LGWR switch)
  Current log# 2 seq# 104612 mem# 0: /u01/oradata/TEST/redo02.log
Mon Feb 06 16:21:23 2017
Archived Log entry 69088 added for thread 1 sequence 104611 ID 0x72f28ed0 dest 1:
Mon Feb 06 16:23:21 2017
Thread 1 advanced to log sequence 104613 (LGWR switch)
  Current log# 3 seq# 104613 mem# 0: /u01/oradata/TEST/redo03.log
Mon Feb 06 16:23:21 2017
Archived Log entry 69089 added for thread 1 sequence 104612 ID 0x72f28ed0 dest 1:
Mon Feb 06 16:23:32 2017
Thread 1 cannot allocate new log, sequence 104614
Checkpoint not complete
  Current log# 3 seq# 104613 mem# 0: /u01/oradata/TEST/redo03.log
Thread 1 advanced to log sequence 104614 (LGWR switch)
  Current log# 1 seq# 104614 mem# 0: /u01/oradata/TEST/redo01.log
Mon Feb 06 16:23:33 2017
Archived Log entry 69090 added for thread 1 sequence 104613 ID 0x72f28ed0 dest 1:
Mon Feb 06 16:25:22 2017
Thread 1 cannot allocate new log, sequence 104615
Checkpoint not complete
  Current log# 1 seq# 104614 mem# 0: /u01/oradata/TEST/redo01.log
Thread 1 advanced to log sequence 104615 (LGWR switch)
  Current log# 2 seq# 104615 mem# 0: /u01/oradata/TEST/redo02.log
Mon Feb 06 16:25:24 2017
Archived Log entry 69091 added for thread 1 sequence 104614 ID 0x72f28ed0 dest 1:
Mon Feb 06 16:27:22 2017
Thread 1 cannot allocate new log, sequence 104616
Checkpoint not complete
  Current log# 2 seq# 104615 mem# 0: /u01/oradata/TEST/redo02.log
Thread 1 advanced to log sequence 104616 (LGWR switch)
  Current log# 3 seq# 104616 mem# 0: /u01/oradata/TEST/redo03.log

Recomiendo revisar el log en varios horarios para ver si es algo que se mantiene o si es muy eventual, para poder calcular el tamaño de acuerdo a un promedio de actividad.

Revisamos el tamaño de los RedoLogs
$ ls -lh re*
-rw-r-----. 1 oracle oinstall 51M Feb  6 16:29 redo01.log
-rw-r-----. 1 oracle oinstall 51M Feb  6 16:31 redo02.log
-rw-r-----. 1 oracle oinstall 51M Feb  6 16:31 redo03.log

En este caso tienen 51M y no alcanzan a almacenar ni un minuto, en forma teorica tendrian que poder almacenar 20 minutos, o sea 3 switch de redolog por hora. Sin embargo el comportamiento no es igual en todas las horas, y decido realizar el incremento en forma gradual, por lo tanto voy a subir el tamaño a 300M para luego seguir monitoreando y ajustando según se necesite.

SQL> select group#, bytes/1024/1024 "size Mb" from v$log;

    GROUP#    size Mb
---------- ----------
         1         50
         2         50
         3         50

SQL> select group#,member from v$logfile;

    GROUP#
----------
MEMBER
--------------------------------------------------------------------------------
         1
/u01/oradata/TEST/redo01.log

         2
/u01/oradata/TEST/redo02.log

         3
/u01/oradata/TEST/redo03.log

El procedimiento para agrandarlos, es agregar otros 3 grupos con el tamaño deseado y eliminar estos 3 grupos actuales. En este caso aprovecho a realizarlo en otro file system que hay mas espacio.

 SQL> alter database add logfile group 4 '/u01/redologs/TEST/redo04.log' size 300M;

Database altered.

SQL> alter database add logfile group 5 '/u01/redologs/TEST/redo05.log' size 300M;

Database altered.

SQL>  alter database add logfile group 6 '/u01/redologs/TEST/redo06.log' size 300M;
SQL> select group#,status from v$log;

    GROUP# STATUS
---------- ----------------
         1 INACTIVE
         2 INACTIVE
         3 ACTIVE
         4 ACTIVE
         5 CURRENT
         6 UNUSED

SQL> alter database drop logfile group 1;

Database altered.

SQL> alter database drop logfile group 3;
alter database drop logfile group 3
*
ERROR at line 1:
ORA-01624: log 3 needed for crash recovery of instance TEST (thread 1)
ORA-00312: online log 3 thread 1: '/u01/oradata/TEST/redo03.log'
Este error es porque todavia esta ACTIVE

SQL> alter database add logfile group 7 '/u01/redologs/TEST/redo07.log' size 300M;

Database altered.

SQL> alter database add logfile group 8 '/u01/redologs/TEST/redo08.log' size 300M;

Database altered.

SQL> alter database add logfile group 9 '/u01/redologs/TEST/redo09.log' size 300M;

Database altered.

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

STATUS               GROUP#
---------------- ----------
INACTIVE                  3
CURRENT                   4
ACTIVE                    5
ACTIVE                    6
UNUSED                    7
UNUSED                    8
UNUSED                    9

SQL> alter database drop logfile group 3;

Database altered.


Conclusion :  Cuando el tamaño de los Redo Logs no sea suficiente para almacenar 20 minutos hay que agrandarlos y la forma es agregando mas grupos de RedoLogs del tamaño requerido. Luego se deben borrar los anteriores aunque posiblemente no puedan borrarse en el instante pero si unos minutos más tarde.

No hay comentarios:

Publicar un comentario