¿Por qué mucha generación de Redo y Archived Redo logs?
De acuerdo a la teoría, los DBA Oracle sabemos que toda operación DDL (Create, Alter, Drop) y DML (Insert, Update, Delete) se registra en la base de datos en forma de “REDO”. Inicialmente llega al “Redo Log Buffer” (en memoria) para posteriormente ser grabado en los archivos “Online Redo Logs”, pudiendo terminar en los “Archived Redo Logs” para asegurar un mejor nivel de recuperabilidad de la información. ¿Pero cómo podemos indagar la información que esta escrita?. Si notamos un incremento de redo, ¿a qué se debe?
Primero deberiamos investigar sobre la generación de redo que tiene nuestra base de datos:
SQL> alter session set NLS_DATE_FORMAT=’DD-MON-YYYY HH24:MI:SS’;
Session altered.
SQL> select trunc(first_time, ‘HH’) , count(*)
2 from v$loghist
3 group by trunc(first_time, ‘HH’) ;
TRUNC(FIRST_TIME,’HH COUNT(*)
——————– ———-
04-MAY-2009 20:00:00 4
05-MAY-2009 12:00:00 6
05-MAY-2009 13:00:00 5
06-MAY-2009 15:00:00 5
07-MAY-2009 12:00:00 4 <- Indica 4 log switches entre 12PM-1PM.
07-MAY-2009 18:00:00 2
08-MAY-2009 11:00:00 39
08-MAY-2008 12:00:00 40
08-MAY-2009 13:00:00 38
08-MAY-2009 14:00:00 135 <- Indica 135 log switches entre 2PM-3PM.
08-MAY-2009 15:00:00 112
Pregunta: ¿ Es normal 135 log switches el 08-MAY-2009 entre 2pm y 3pm?. Podria responderse que si es normal, asumiendo que hay muchas operaciones de cambio (DDL, DML), pero ¿qué sucede si realmente consideramos que NO es algo normal?. Es muy probable que nos interese saber ¿qué operaciones fueron ejecutadas el 08-MAY-2009 entre 2pm y 3pm?, por lo que podemos recurrir al Oracle LogMiner para analizar los “Archive Redo Logs” respectivos:
Habilitar Supplemental Logging a nivel de toda la base de datos
SQL> SELECT SUPPLEMENTAL_LOG_DATA_MIN FROM V$DATABASE;
SUPPLEME
——–
NO
SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
Database altered.
SQL> SELECT SUPPLEMENTAL_LOG_DATA_MIN FROM V$DATABASE;
SUPPLEME
——–
YES
Consultar el ultimo archivelog generado en la base de datos
SQL> SELECT NAME FROM V$ARCHIVED_LOG WHERE FIRST_TIME = (SELECT MAX(FIRST_TIME) FROM V$ARCHIVED_LOG);
NAME
—————————————————————————
+ASM_FRA/orcl_ccp/archivelog/2009_05_08/thread_1_seq_17490.1007.685284033
Registrar el archivelog que deseamos a analizar. La primera vez que se usa LogMiner, se usa el parametro OPTIONS => DBMS_LOGMNR.NEW, para próximos registros de archivelogs se usuaria el parametro OPTIONS => DBMS_LOGMNR.ADDFILE
SQL> EXECUTE DBMS_LOGMNR.ADD_LOGFILE(LOGFILENAME => ‘+ASM_FRA/orcl_ccp/archivelog/2009_05_08/thread_1_seq_17490.1007.685284033′, OPTIONS => DBMS_LOGMNR.NEW);
PL/SQL procedure successfully completed.
Se inicia el minado de archivelog
SQL> EXECUTE DBMS_LOGMNR.START_LOGMNR(OPTIONS => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG);
PL/SQL procedure successfully completed.
A continuación se muestra un ejemplo de consultar la información de LogMiner, haciendo uso a la vista V$LOGMNR_CONTENTS
SQL> ALTER SESSION SET NLS_DATE_FORMAT = ‘DD-MON-YYYY HH24:MI:SS’;
SQL> SELECT username AS USR, (XIDUSN || ‘.’ || XIDSLT || ‘.’ || XIDSQN) AS XID,SQL_REDO, SQL_UNDO FROM V$LOGMNR_CONTENTS;
Luego de terminar el proceso de minado con LogMiner se deberia detener el proceso
SQL> EXECUTE DBMS_LOGMNR.END_LOGMNR();
Saludos,
Miguel.
En: Administración, Oracle Database el 05/09/2009
You must be logged in to post a comment.