Puede haber ocasiones en las que sea necesario investigar cambios recientes en la base de datos e informar qué se modificó, cuándo y quién lo hizo. Durante años, el paquete DBMS_LOGMNR de Oracle ha estado disponible para tales tareas, pero sus invocaciones no se han cubierto por completo. Los métodos convencionales utilizan el procedimiento ADD_LOGFILE() para preparar Log Miner para su uso con una llamada básica al procedimiento START_LOGMNR. Esto inicia la utilidad con el SCN actual como punto de partida. Hay otra forma de iniciar Log Miner, seleccionando un SCN de inicio válido y proporcionándolo a la llamada START_LOGMNR(). En este artículo, verá cómo se puede hacer esto y, en el proceso, revelará un posible área de preocupación con las asignaciones de PGA.
Mirando una secuencia de comandos 'simple' para iniciar Log Miner, se realizan las llamadas de procedimiento habituales que inician Log Miner con el SCN actual:
---- run_logmnr.sql---- Agregar archivos de registro y establecer DBMS_LOGMNR para-- minar registros de archivos de forma continua--establecer tamaño de línea 200 trimspool en tamaño de página 0---- Agregar los archivos de registro existentes---- Omitir archivos de registro en espera- -select 'exec dbms_logmnr.add_logfile('''||member||''')'from v$logfilewhere escriba <> 'STANDBY'y miembro en (select min(member) from v$logfile group by group#)spool /tmp/add_logfiles.sql/spool off@/tmp/add_logfiles---- Iniciar logmnr en modo de mina continua--exec dbms_logmnr.start_logmnr(opciones => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG + DBMS_LOGMNR.CONTINUOUS_MINE + DBMS_LOGMNR.COMMITTED_DATA_ONLY)
Tenga en cuenta que todos los registros de rehacer disponibles se agregan antes de iniciar Log Miner. Existe otro método que proporciona un SCN inicial a la llamada start_logmnr, siempre que la base de datos se ejecute en modo ARCHIVELOG:
BEGIN DBMS_LOGMNR.START_LOGMNR( startScn =>, endScn => , OPTIONS => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG + DBMS_LOGMNR.COMMITTED_DATA_ONLY + DBMS_LOGMNR.CONTINUOUS_MINE);END;/
Curiosamente, el SCN final no es necesario para iniciar una sesión de Log Miner. La base de datos debe estar en modo ARCHIVELOG para que se pueda especificar la opción CONTINUOUS_MINE porque Log Miner agregará automáticamente cada archivo de registro archivado disponible a medida que se ejecuta. El uso de este método permite utilizar un SCN específico para iniciar cualquier búsqueda; especificando la búsqueda final de corchetes SCN para que solo un subconjunto limitado de datos se devuelva a la vista V$LOGMNR_CONTENTS y proporcione un punto de parada para la búsqueda, de modo que una consulta de la vista pueda terminar.
Es una tarea simple monitorear el progreso de Log Miner al verificar el registro de alertas de la base de datos a medida que se registran las entradas marcadas con 'LOGMINER'. Una entrada completa incluirá una línea BEGIN y END, como se muestra a continuación:
Lunes 07 de octubre 12:48:22 2019LOGMINER:Fin del archivo de registro de minería para la sesión -2147482111 subproceso 1 secuencia 9776, /oracle/archive/awcis/awcis_0000009776_0001_1008544071.arcLunes 07 de octubre 12:48:22 2019LOGMINER:Inicio del archivo de registro de minería para la sesión - 2147482111 hilo 1 secuencia 9777, /oracle/archive/awcis/awcis_000000009777_0001_10085444071.arcmon oct 07 12:48:36 2019LogMiner:finalización de minería final para la sesión -2147482111 Thread 1 SECHENC :48:36 2019LOGMINER:Comenzar el archivo de registro de extracción para la sesión -2147482111 subproceso 1 secuencia 9778, /oracle/archive/awcis/awcis_0000009778_0001_1008544071.arcMon Oct 07 12:48:49 2019LOGMINER:Finalizar el archivo de registro de extracción para la sesión -2147481 8, secuencia 917 oracle/archive/awcis/awcis_0000009778_0001_1008544071.arcMon Oct 07 12:48:49 2019LOGMINER:Comience a extraer el archivo de registro para la sesión -2147482111 subproceso 1 secuencia 9779, /oracle/archive/awcis/awcis_0000009779_00014pre1004_1001.85arcPara las sesiones locales de Oracle, los números son enteros positivos; para sesiones remotas, iniciadas por utilidades como Perl, Python, C/C++ u otros lenguajes, se verán enteros negativos (las entradas que se muestran arriba fueron iniciadas por una secuencia de comandos de Python). Los nombres de los archivos de registro recorrerán tanto los registros de rehacer en línea como las copias archivadas disponibles.
Iniciar Log Miner de esta manera también puede arrojar errores como "archivo de registro faltante" cuando el SCN de inicio seleccionado o el rango de SCN ya no está disponible en la secuencia de rehacer. Las consultas de ejecución prolongada pueden encontrar este tipo de errores. Además, si el SCN está fuera de rango con respecto a los archivos de registro disponibles, Log Miner no se iniciará y generará:
ERROR en la línea 1:ORA-01292:no se ha especificado ningún archivo de registro para la sesión actual de LogMinerORA-06512:en "SYS.DBMS_LOGMNR", línea 58ORA-06512:en la línea 2Para ayudar a eliminar tales errores, seleccionar FIRST_CHANGE# de la vista V$LOG proporcionará puntos de inicio válidos para una sesión de Log Miner; el uso de una consulta similar contra V$ARCHIVED_LOG devolverá todos los SCN de inicio disponibles para las copias de rehacer archivadas.
Esta no es la única complicación al usar Log Miner de esta manera. Según la cantidad de información que deba devolverse, el proceso Logmminer puede asignar grandes cantidades de memoria PGA que, si pga_aggregate_limit es pequeño, puede arrojar el siguiente error:
ORA-04036:la memoria PGA utilizada por la instancia excede PGA_AGGREGATE_LIMITafortunadamente esto no es un error fatal. Como los recursos de PGA ya no son necesarios, la memoria se puede devolver a la base de datos para su uso en otro lugar. Sin embargo, puede llevar un poco más de tiempo del deseado liberar esa memoria al grupo de memoria. Una opción es establecer pga_aggregate_limit más alto que la suma de las sesiones de Log Miner, lo que puede evitar que ocurra el error. ¿Cómo sabe qué memoria se asigna a esas sesiones? Una vista, V$PROCESS_MEMORY_DETAIL, está disponible en la base de datos. Pero intentar consultar esta vista sin alguna preparación devolverá:
ninguna fila seleccionada.Este es un problema relativamente menor, pero requiere el uso de la utilidad oradebug. Los siguientes pasos cargarán datos en V$PROCESS_MEMORY_DETAIL:
---- Establecer el identificador de la sesión actual-- oradebug setmypid---- Usar el PID del proceso deseado-- volcar los datos de la memoria---- Esto llena V$PROCESS_MEMORY_DETAIL--oradebug pga_detail_get- --- Consulte la vista para obtener los datos deseados:seleccione * From v$process_memory_detail;---- Para volver a llenar la vista con datos más nuevos, simplemente ejecute la declaración oradebug pga_detail_get--oradebug pga_detail_get A continuación se muestra un script para realizar estas acciones:
---- Configure el entorno para las llamadas oradebug--oradebug setmypidset echo off trimspool onset verificar offundefine p_1undefine p_2undefine s1undefine s1undefine s2variable p1 numbervariable p2 numbercolumn sys_date new_value sysdt noprintselect to_char(sysdate, 'RRRRMMDDHH24MISS') sys_date from dual;-- -- Obtenga la identificación del proceso de la sesión de--columna pid new_value p_1select pid from v$process where addr in (select paddr from v$session where username =' ' and sid =(select max(sid) From v$session where nombreusuario =' '));begin :p1 :=&p_1;end;/---- Volcar detalles del proceso a v$process_memory_detail--oradebug dump pga_detail_get &p_1spool &p_1._pga_stats_&sysdt..log--- - Obtener información de sesión para --COLUMN alme HEADING "MB asignados" FORMATO 99999D9COLUMN usme HEADING "MB usados" FORMATO 99999D9COLUMN frme HEADING "Freeable MB" FORMATO 99999D9COLUMN mame HEADING "Max MB" FORMATO 99999D9COLUMN nombre de usuario FORMATO a25COLUMN program FORMAT a22COLUMN sid FORMAT a5COLUMN spid FORMAT a8column pid_remote format a12SET LINESIZE 300SELECT s.username, SUBSTR(s.sid,1,5) sid, p.spid, logon_time, SUBSTR(s.program,1,22) program , s.process pid_remote, s.status, ROUND(pga_used_mem/1024/1024) usme, ROUND(pga_alloc_mem/1024/1024) alme, ROUND(pga_freeable_mem/1024/1024) frme, ROUND(pga_max_mem/1024/1024) mameFROM v$session s, v$process pWHERE p.addr=s.paddrAND s.username =' 'ORDER BY pga_max_mem,logon_time;---- Dormir 30 segundos---- Obtener información de la sesión nuevamente--exec dbms_lock.sleep(30) columna sid new_value s1 noprintSELECT s.username, SUBSTR(s.sid,1,5) sid, p.spid, logon_time, SUBSTR(s.program,1,22) program , s.process pid_remote, s.status, ROUND( pga_used_mem/1024/1024) usme, ROUND(pga_alloc_mem/1024/1024) alme, ROUND(pga_freeable_mem/1024/1024) desde, ROUND(pga_max_mem/1024/1024) mameFROM v$sesión s,v$proceso pWHERE p.addr=s.paddrAND s.username =' 'ORDER BY pga_max_mem,logon_time;exec dbms_lock.sleep(10)select max(sid) sid from v$session where username =' ';---- Obtener información de la memoria del proceso--COLUMN category HEADING "Categoría" COLUMNA asignada HEADING "Bytes asignados" COLUMNA used HEADING "Used bytes" COLUMN max_allocated HEADING "Max bytes asignados"SELECT pid, category, asignado, usado, max_allocatedFROM v$process_memoryWHERE pid in (SELECCIONE pid FROM v$process WHERE addr in (select paddr FROM v$session WHERE sid =&&s1)); exec dbms_lock.sleep(10)SELECT pid, categoría, asignado, usado, max_allocatedFROM v$process_memoryWHERE pid in (SELECCIONE pid FROM v$process DONDE addr in (seleccione paddr FROM v$session DONDE sid =&&s1)); exec dbms_lock.sleep(10)select pid from v$process whe re addr in (select paddr from v$session where username =' ' and sid =(select max(sid) from v$session where username =' '));---- Guarde el primer pase de pga stats--CREATE TABLE tab1 ASSELECT pid, categoría, nombre, heap_name, bytes, asignación_count, heap_descriptor, parent_heap_descriptorFROM v$process_memory_detailWHERE pid =&p_1AND categoría ='Otro';---- Obtener el segundo paso de pga stats--oradebug dump pga_detail_get &p_1exec dbms_lock.sleep(120)---- Guarde la segunda pasada de las estadísticas de pga--CREATE TABLE tab2 ASSELECT pid, categoría, nombre, nombre_del_montículo, bytes, recuento_de_asignación, descriptor_del_montículo, descriptor_del_montículo_principalFROM v$process_memory_detailWHERE pid =&p_1AND categoría ='Otro'; ---- Iniciar informes finales---- Información del montón PGA--COLUMN category HEADING "Categoría"COLUMN name HEADING "Nombre"COLUMN heap_name HEADING "Heap name"COLUMN q1 HEADING "Memory 1st" Format 999,999,999,999COLUMN q2 HEADING "Memory 2nd " Formato 999,999,999,9 99COLUMN diff TÍTULO "Diferencia" Formato S999,999,999,999FIJAR LÍNEAS 150SELECCIONAR tab2.pid, tab2.category, tab2.name, tab2.heap_name, tab1.bytes q1, tab2.bytes q2, tab2.bytes-tab1.bytes diffFROM tab1, tab2WHERE tab1.category =tab2.categoryAND tab1.name =tab2.nameAND tab1.heap_name =tab2.heap_nameand tab1.pid =tab2.pidAND tab1.bytes <> tab2.bytesORDER BY 1, 7 DESC;---- Logminer PGA info- -COLUMN heap_name HEADING "heap name"COLUMN nombre HEADING "Tipo" COLUMNA asignación_recuento HEADING "Recuento" COLUMNA bytes HEADING "Suma" COLUMNA avg HEADING "Promedio" FORMATO 99999D99SELECT pid, heap_name, nombre, asignación_recuento, bytes, bytes/asignación_recuento avgFROM tab2WHERE heap_name como 'Logminer%'; spool offdrop table tab1 purge;drop table tab2 purge; Guarde este código como un script y edite el texto para reemplazar las cadenas de
con la cuenta de usuario que ejecuta Log Miner. El script apunta específicamente a la memoria de Logminer para que pueda monitorearse en busca de aumentos. También se puede modificar para buscar otras áreas de memoria problemáticas. Comente los comandos de 'soltar tabla' para conservar tab1 y tab2 para futuras investigaciones, si lo desea, ya que otras áreas de memoria pueden ser de interés. Consulte también el soporte de Oracle para problemas conocidos relacionados con PGA. Dichos informes probablemente tendrán consultas para investigar áreas problemáticas específicas usando V$PROCESS_MEMORY_DETAIL. Para mayor comodidad, esas consultas adicionales se pueden agregar al código que se muestra arriba para informar sobre todas las áreas sospechosas de la memoria del proceso. Estos datos serán fundamentales para demostrar la necesidad de aplicar parches únicos específicos a la base de datos. Log Miner puede ser una herramienta muy útil para investigar acciones pasadas actuales y relativamente recientes en la base de datos. Puede ser necesario monitorear las asignaciones de PGA mientras las sesiones de Log Miner están activas para que se pueda ejecutar una acción preventiva, como aumentar pga_aggregate_limit, y las sesiones no se terminen abruptamente. "Prevenido está preparado", como dice el refrán, y aunque los administradores de bases de datos no tienen cuatro brazos, siempre vale la pena saber lo que les depara el futuro.
Ver todos los artículos de David Fitzjarrell