programing

Oracle 중단 프로세스 문제 해결

linuxpc 2023. 6. 20. 21:24
반응형

Oracle 중단 프로세스 문제 해결

저는 현재 진행 중인 Java 프로세스에 대한 문제를 이해하려고 합니다.이 프로세스는 약 4개월 동안 운영되었으며 이번 주 초에 중단되기 시작했습니다.프로세스의 스레드 덤프를 보면 모든 관련 스레드(3)에 다음과 같은 스택이 있습니다.

    "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)

잠금을 기다리는 스레드가 없으므로 프로세스가 교착 상태에 빠지지 않습니다.작업을 수행하는 이 세 개의 스레드는 Oracle의 응답을 기다리며 차단되어 있습니다. 적어도 제가 보기에는 그렇게 보입니다.

Oracle을 보면 v$session을 쿼리하면 이 스레드와 관련된 연결 중 하나가 현재 쿼리를 실행하고 있는 것처럼 보이지만 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

제 질문은 다음과 같습니다.

  1. Oracle의 응답을 기다리는 동안 프로세스가 차단되었을 뿐이라는 분석이 맞습니까?
  2. 이 프로세스가 차단되는 이유를 이해하려면 Oracle에서 무엇을 찾아야 합니까?

업데이트됨:

DBA_WAITERS 및 DBA_LOCKs 검색에 대한 의견을 기반으로 합니다.

select * from dba_waiters;

no rows selected

select * from dba_locks where BLOCKING_OTHERS <> 'Not Blocking';

no rows selected 

dba_locks에 98개의 행이 있었지만 모두 'Not Blocking'이므로 잠금 문제는 아닌 것 같습니다.문제의 프로세스가 3시간 이상 이 상태에 있으므로 지금쯤 교착 상태가 감지되었을 것입니다.

Oracle 인스턴스가 "정상"이 아니라는 이론은 있지만 무엇을 봐야 할지 막막합니다.Oracle 서버를 재부팅하라는 요청이 있습니다. 하지만 아직까지 이 요청이 수행되지 않았습니다.

후속 질문:v$sql에 없는 sql_id가 v$sql에 포함되어 있는 것이 정상입니까? 포함되어 있는 경우 어떤 조건입니까?

문제가 해결되었고 v$session 테이블에서 정답이 맞았습니다.Oracle 세션은 잠금 이외의 이유로 차단될 수 있습니다.FINAL_BLOCKING_SESSION 열에 주의하십시오. FINAL_BLOCKING_SESSION은 차단의 근본 원인인 세션을 식별합니다.세션 845를 조사한 결과 클라이언트 프로세스(MACHINE 및 PORT로 식별)가 더 이상 존재하지 않는 것으로 확인되었습니다.DBA가 세션 845를 종료하고 모두 정상으로 돌아왔습니다.

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

또한 최근에 이 문제가 발생하여 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;

출처: http://www.dba-oracle.com/t_final_blocking_session_final_blocking_instance.htm

언급URL : https://stackoverflow.com/questions/11673947/troubleshoot-oracle-hung-process

반응형