java - oracledriver - Solución de problemas de Oracle-proceso colgado
oracle database 11.2 0.4 jdbc driver & ucp downloads (2)
Estoy tratando de entender un problema que estamos teniendo con un proceso de Java que está colgado. Este proceso ha estado funcionando en producción durante aproximadamente 4 meses y, a principios de esta semana, comenzó a colgarse. Cuando veo un volcado de hilos del proceso, todos los hilos relevantes (3) tienen pilas como las siguientes:
"TxnParser_1" prio=6 tid=0x69bd3400 nid=0x2534 runnable [0x6aa2f000]
java.lang.Thread.State: RUNNABLE
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:129)
at oracle.net.ns.Packet.receive(Unknown Source)
at oracle.net.ns.DataPacket.receive(Unknown Source)
at oracle.net.ns.NetInputStream.getNextPacket(Unknown Source)
at oracle.net.ns.NetInputStream.read(Unknown Source)
at oracle.net.ns.NetInputStream.read(Unknown Source)
at oracle.net.ns.NetInputStream.read(Unknown Source)
at oracle.jdbc.driver.T4CMAREngine.unmarshalUB1(T4CMAREngine.java:1099)
at oracle.jdbc.driver.T4CMAREngine.unmarshalSB1(T4CMAREngine.java:1070)
at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:478)
at oracle.jdbc.driver.T4CStatement.doOall8(T4CStatement.java:207)
at oracle.jdbc.driver.T4CStatement.executeForDescribe(T4CStatement.java:790)
at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:1039)
at oracle.jdbc.driver.T4CStatement.executeMaybeDescribe(T4CStatement.java:830)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1132)
at oracle.jdbc.driver.OracleStatement.executeInternal(OracleStatement.java:1687)
at oracle.jdbc.driver.OracleStatement.execute(OracleStatement.java:1653)
- locked <0x40e22f88> (a oracle.jdbc.driver.T4CStatement)
- locked <0x28f8d398> (a oracle.jdbc.driver.T4CConnection)
at com.gcg.data.LogParsingInfo.initFromDB(LogParsingInfo.java:262)
at com.gcg.om.OmQueueEntry.initParseInfoFromDB(OmQueueEntry.java:104)
at com.gcg.om.GenericQueueEntry.run(GenericQueueEntry.java:237)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:619)
No hay hilos en espera de bloqueos, por lo que el proceso no está bloqueado. Estos 3 hilos que están haciendo el trabajo solo están bloqueados esperando una respuesta de Oracle, al menos eso es lo que me parece.
En cuanto a Oracle, cuando pregunto v $ sesión, parece que una de las conexiones asociadas con estos subprocesos está ejecutando una consulta, aunque no puedo ver el sql.
select ... from v$session where ...;
SQL_ADDRESS SQL_HASH_VALUE SQL_ID SQL_CHILD_NUMBER SQL_EXEC_START SQL_EXEC_ID PREV_SQL_ADDR PREV_HASH_VALUE PREV_SQL_ID PREV_CHILD_NUMBER PREV_EXEC_START PREV_EXEC_ID
---------------- -------------- ------------- ---------------- -------------- ----------- ---------------- --------------- ------------- ----------------- --------------- ------------
00 0 0000000239F59EE8 1483377872 fqr8pndc6p36h 5 26-JUL-12 32080545
00 0 0000000239F59EE8 1483377872 fqr8pndc6p36h 5 26-JUL-12 32080546
0000000148CABD88 1784444892 a16hxxtp5sxyw 0000000239F59EE8 1483377872 fqr8pndc6p36h 5 26-JUL-12 32080544
select * from v$sql where sql_id = ''a16hxxtp5sxyw'';
no rows selected
Mis preguntas son:
- ¿Tengo razón en mi análisis de que el proceso simplemente está bloqueado a la espera de una respuesta de Oracle?
- ¿Qué debo buscar en Oracle para comprender por qué este proceso está bloqueando?
Actualizado:
Basado en el comentario sobre la búsqueda en DBA_WAITERS y DBA_LOCKS
select * from dba_waiters;
no rows selected
select * from dba_locks where BLOCKING_OTHERS <> ''Not Blocking'';
no rows selected
Hubo 98 filas en dba_locks pero, como todos están ''No bloqueados'', ¿no creo que sea un problema de bloqueo? El proceso en cuestión ha estado en este estado durante más de 3 horas, por lo que hasta ahora no se habría detectado ningún punto muerto.
Soy de la teoría de que la instancia de Oracle no es "saludable", pero no sé qué mirar. Tengo una solicitud para reiniciar el servidor Oracle, pero aún no se ha hecho.
Pregunta de seguimiento: ¿Es normal que la sesión v $ contenga un sql_id que no exista en v $ sql y, en caso afirmativo, en qué condiciones?
El problema se resolvió y la respuesta fue correcta en la tabla v $ session. Al parecer, las sesiones de Oracle pueden bloquearse por razones distintas al bloqueo. Observe la columna FINAL_BLOCKING_SESSION - identifica la sesión que es la causa raíz del bloqueo. Investigamos la sesión 845 y encontramos que el proceso del cliente (identificado por MACHINE y PORT) ya no existía. El DBA eliminó la sesión 845 y todo volvió a la normalidad.
SID SERIAL# STATUS PROGRAM TYPE SQL_ID PREV_SQL_ID BLOCKING_SESSION_STATUS BLOCKING_INSTANCE BLOCKING_SESSION FINAL_BLOCKING_SESSION_STATUS FINAL_BLOCKING_INSTANCE FINAL_BLOCKING_SESSION EVENT
------- ------- --------- ---------------- ---- ------------- -------------- ----------------------- ----------------- ---------------- ----------------------------- ----------------------- ---------------------- ----------------------------
108 22447 ACTIVE Gcg log parser 1 USER fqr8pndc6p36h VALID 1 1581 VALID 1 845 library cache: mutex X
639 40147 ACTIVE Gcg log parser 3 USER fqr8pndc6p36h VALID 1 1581 VALID 1 845 library cache: mutex X
742 34683 ACTIVE Gcg log parser 2 USER a16hxxtp5sxyw fqr8pndc6p36h VALID 1 1581 VALID 1 845 library cache: mutex X
También encontré este problema recientemente, y utilicé esta consulta para encontrar sesiones bloqueadas / bloqueadas en Oracle:
select
inst_id||'' ''||sid||'',''||serial# inst_sid_s#,
username,
row_wait_obj#||'',''||row_wait_block#||'',''||row_wait_row# obj_lck,
blocking_session_Status||'' ''||blocking_instance||'',''||blocking_session blk_info,
final_blocking_session_Status||'' ''||final_blocking_instance||'',''||final_blocking_session f_blk_info,
event,
seconds_in_wait
from
gv$session
where
lockwait is not null
order by
inst_id;
Fuente: http://www.dba-oracle.com/t_final_blocking_session_final_blocking_instance.htm