2014-05-13 2 views
1

좋은 시간.클라이언트의 비정상 종료시 Oracle 활성 세션 상태

며칠 전에 Google DB 팀에서 더 이상 활동하지 않는 클라이언트에 대해 '활성'상태의 세션이 있음을 감지했습니다. '

  1. 원격 SQL 개발자 연결 (실제로,이 경우는 매우 흥미로운 아니다),
  2. 이상 바람둥이 (여기서 우리의 응용 프로그램이 실행되는) 종료 (같은 : 수사는 문제에 대한 두 가지 소스가 있음을 보여 주었다 kill -9 ')

모든 세션이'활성 '상태에 있다는 것은 이상한 일입니다. 누군가가 제발, 어떻게 될 수 있는지 명확하게 (어쩌면 거기에 해당 소켓에서 기다리는 기본 프로세스와 뭔가가 ... 또는 모든 좋은 tomcat 종료시 괜찮아요, 근본 원인은 트랜잭션과 같습니다 것 같습니다. ..)?

(모든 연결에 대해) 'IDLE_TIME'(모든 RAC 인스턴스에 대해) 'EXPIRE_TIME'을 설정하면 도움이 될까요?

나는 다음과 같은 시나리오는 (설정 위의 매개 변수와 함께) 이루어져야 바로 것을 건가요 :
  1. 클라이언트가이 세션이 'ACTIVE과 관련없이
  2. 'ACTIVE '로 표시되어있어 연결

    '상태에는 클라이언트에 핑하는'EXPIRE_TIME '매개 변수에 의해 시작된'ping '프로세스가 있습니다.
  3. 세션이 '활성'인 경우에도 EXPIRE_TIME 시간 동안 ping 프로세스가 실패하면 세션이 oracle에 의해 종료됩니다.
  4. 클라이언트가 ping에 응답하지만 처리를 수행하지 않으면 IDLE_TIME 시간이 지나면 세션이 '비활성'이되고 ('IDLE_TIME'매개 변수가 설정된 경우) 'SNIPED'가됩니다. 그 후 'SMON'프로세스는이 세션 (그리고 'SNIPED'상태의 다른 멤버들)을위한 하우스 키핑 활동을 시작합니다.

UPDATE :

유일한 방법은 그런 상황에서 작동하도록 보인다는 Oracle 인스턴스를 구성하는 것입니다. 분의 < #>

= 죽은 연결 감지를위한

  • https://community.oracle.com/thread/873226?start=0&tstart=0

    이 매개 변수 SQLNET.EXPIRE_TIME 파일 SQLNET.ORA 서버 측을 사용됩니다 내 조사의 결과가 있습니다 다른 옵션은 프로파일 설정에서 idle_time을 구현합니다. 그런 다음 일부 작업이 SNIPED 세션을 종료합니다 (idle_time이 에 도달하면 세션이 INACTIVE에서 SNIPED로 변경됨).

    내가 연결을 열고 점심을 꺼 경우

    , IDLE_TIME 제한 내 세션이 비활성 15 분 후 종료하게됩니다. EXPIRE_TIME이 15 분이면 클라이언트가 내 클라이언트 애플리케이션에 패킷을 보내어 클라이언트가 실패하지 않았는지 확인하게됩니다. 클라이언트가 작동 중이면 ping에 응답하고 내 세션은 무기한으로 주위에 머물러있게됩니다. EXPIRE_TIME은 클라이언트 응용 프로그램이 핑에 응답하지 않으면 클라이언트가 클라이언트 프로세스가 실패했거나 클라이언트 시스템이 실패했음을 의미하는 경우에만 세션을 종료합니다. IDLE_TIME은 시간 동안 활동이없는 세션을 종료하지만 일반적으로 연결 풀에 공정한 번호가 있다고 가정하기 때문에 이 연결 풀을 유지하는 응용 프로그램과 잘 작동하지 않습니다 연결은 이고 하루 동안 연결은 연결을 사용하는 응용 프로그램은 풀의 연결이 제대로 작동하지 않는 경향이 있습니다.

  • https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:2233109200346833212

  • TCP/IP는 설계, 기본적으로 일을 방해하지 않습니다. 연결이 끊어지면 클라이언트 및/또는 서버가 즉시 을 알리지 않습니다. 따라서 클라이언트가 데이터베이스에 연결하여 아무 것도 수행하지 않고 을 수행하고 클라이언트 (파란색 화면이 표시되면이를 죽이고, 네트워크 케이블을 빼거나, 컴퓨터를 망가 뜨리는 등)가 발생하면 세션 이 데이터베이스에 남아있게됩니다. 서버는 결코 메시지를받을 수 없음을 알 수 없습니다. 우리는 죽은 클라이언트 의 경우에 문제가 될 것을 탐지가 : 활성 세션으로

    http://download.oracle.com/docs/cd/B12037_01/network.101/b10776/sqlnet.htm#sthref476

    을, 그건 정말 간단합니다. 연결을 열면 이 연결을 통해 "잠금 테이블 T"와 같은 요청을 제출합니다. 테이블 은 세션에서 거래로 인해 잠겨 있습니다. 그런 다음 블록 같은 코드를 제출하십시오 :

    시작 루프 dbms_lock.sleep (5); 엔드 루프; 종료;/

    해당 코드가 실행되는 동안에는 세션이 활성화됩니다. - 클라이언트 프로세스가 서버를 기다리는 동안 읽지 못하도록 차단되었습니다. 결과를 회신합니다 - 응답 (물론 올 수 없습니다) . 서버가 현재 네트워크에 연결되어 있지 않습니다. 코드가 인 경우 활성화되어 있습니다. 따라서 고객이 지금 죽으면 ' '코드 블록이 계속 실행되어 실행되고 실행됩니다. - 결코 에 걸리면 바로 실행되고 잠금이 해제됩니다. 은 그대로 있습니다.

  • http://www.databaseskill.com/4267817/

  • http://www.dba-oracle.com/t_connect_time_idle_expire_timeout.htm

    sqlnet.expire_time 파라미터 클라이언트 것을 확인하는 검사가 전송되어야하는 빈도를 결정하기 분, 시간 간격을 설정하기 위해 사용/서버 연결이 활성화되어 있습니다. 연결을 무기한 열어 두지 않거나 ( 운영 체제 관련 매개 변수로 설정 한 시간까지) 값을 0보다 크게 설정해야합니다. 이렇게하면 연결이 열린 상태에서 시스템이 보호됩니다. 비정상적인 클라이언트 종료로 인해

    https://asktom.oracle.com/pls/apex/f?p=100:11:0::NO::P11_QUESTION_ID:453256655431

  • 세션 리소스 잠금 또는 래치를 기다리고 있다면,이 대기 시간이 초과하는 경우 IDLE_TIME도 세션이 경우 세션 이 스닙 도착 않는 프로파일 번째에 설정 트랜잭션 중일 때 잠금을 기다리는 중입니다.

    경고 로그에 항목이있을 것입니다.

    추가

    잠금을 기다리는 경우, 유휴 상태가 아닙니다. 이 페이지를 내 관심을 얻을


    , 내가 IDLE_TIME를 사용 오라클 데이터 가드 문제에 대한 지원 때문에 오라클들 중 하나, 통지를했고 전에 육개월 그는 나에게 말했다가이 매개 변수의 망가 아주 잘 작동 오라클 냈다으로 을 표시했다 세션의 자원을 해제 해달라고 때문에, 다음 번에 사용자가

    후속 조사를 (세션 자원을 취소, 살해 된 세션을 말해 에 대기)를 사용하려고 할 때까지

    ... 조사 후 ... "세션"이 있습니다. 클라이언트가 승인하기 전까지는 이 사라지지 않지만 "트랜잭션"은 사라졌습니다.


    톰, 나는 IDLE_TIME = 240 (4 시간)하도록 프로파일을 변경하고 확인 내 RESOURCE_LIMIT 매개 변수가 TRUE로 설정했습니다. v $ session을 쿼리 할 때 일부 "snipped"세션이 표시되지만 이 하루 이상 유휴 상태 인 "비활성"세션도 표시됩니다. 모든 사용자는이 프로필 을 할당 받았습니다. idle_time 이 설정되기 전에 사용자 세션이 연결된 경우 해당 세션이이 변경 사항의 영향을 받느냐 아니겠습니까? 나는 꽤 오래 전에 을 바꿨다. 내가해야 할 일이 있습니까? ? IDLE_TIME가 설정되기 전에 사용자 세션이 연결되어 있다면

    후속 조사

    , 그들은에서 "예외 적용된"하는 - 그들은 스닙되지 않습니다. 만 새 세션에 영향을줍니다.

  • http://agstamy.blogspot.ru/2011/03/profile-and-resource-limit.html

  • 추가 재료 및 권장 사항 : 우리는 위의 조사에 나열된 매개 변수를 확인하고 모든 것을 한 https://rebby.com/blog.php?detail=32
  • +0

    안녕하세요, 어떤 종류의 연결을 사용합니까? 전용 또는 공유 (또는 풀링) 되었습니까? 공유 서버에 버그가 있습니다. 우리는이 버그를 쳤다. Oracle은 활성 클라이언트의 연결이 끊어지지 않고 쿼리를 계속 진행합니다. 그들은 단지 그것을 고칠 패치를 우리에게 보냅니다 – eliatou

    +1

    안녕하세요, eliatou.우리는 풀링 된 연결을 사용하지만 위의 모든 것을 자세히 아는 것도 정말 흥미 롭습니다. 가능하면이 문제에 대한 지식을 가능한 한 자세하게 공유하고 가능한 경우 패치를 공유하십시오. – Dmitry

    +0

    내 기억이 잘못되었습니다. 우리 버그는 너 같은 풀링 된 연결에 관한거야! 패치 17054981을 참조하십시오. DRCP가 죽은 연결을 종료하지 않습니다. – eliatou

    답변