데이터베이스 링크를 통한 쿼리에 시간 초과가 있습니까?


11

편집 / 서문 : DB 링크 쿼리의 시간 초과에 대한 질문에 특히 관심이 있기 때문에이 질문은 SO에서 마이그레이션되었습니다. SO의 제공된 해결 방법은 다소 괜찮지 만 질문 자체에 실제로 관심이 있습니다.

동기 부여 :
데이터베이스 링크를 사용하는 "영구"(세션을 종료 할 때까지 2 일 이상)를 실행하는 쿼리가 하나 있습니다. 문제는 원격 데이터베이스를 사용할 수 없게되었지만 아직 알려지지 않은 이유로 인해 아무 ORA-02068것도 제기되지 않았으며 (여기에서 논의되지 않음) 쿼리가 대기 및 대기 한 것 같습니다.

(쿼리는 PL / SQL 패키지에서 프로 시저를 실행하는 dbms_scheduler 작업에 의해 발행됩니다. 결과적으로 작업도 중단되었습니다. 그러나이 질문의 핵심에는 특별한 관심이 없습니다)

테스트 DB 중 하나를 Quiesce 모드로 설정하고 데이터베이스 링크를 통해 쿼리하여이 상황을 시뮬레이션했습니다. 예상 한대로 쿼리는 수동으로 취소되거나 원격 DB가 중지되지 않을 때까지 대기했습니다.

질문 :
원격 데이터베이스의 동작과 가동 시간을 제어 할 수 없으므로 데이터베이스 링크를 사용하는 쿼리에서 시간 초과를 설정할 가능성이 있습니다.

이미 프로파일 ( CPU_PER_CALLetc), sqlnet.ora매개 변수, 로컬 명명 매개 변수를 연결 문자열에 직접 추가 (예 : (connect_timeout=10)데이터베이스 링크 정의에 추가) 를 사용하여 명령을 실행 ... for update wait 1했지만 사용 중이거나 유휴 세션에서는 작동하지만 대기중인 세션.

그래서 데이터베이스 링크의 "로컬"쪽에서 데이터베이스 링크에 대한 쿼리 시간 초과를 설정하는 옵션을 찾고 있습니다.
같은 일부 솔루션 alter session set xyz또는 select ... from a@b "wait 100" --(yes, I know this syntax doesn't exist)내가이 특정 데시벨에는 DBA 권한이 없기 때문에, 감상 할 수있다.

현재 10gR2에 있지만 몇 주 안에 11gR2로 업그레이드하므로 이러한 버전에 대한 아이디어가 유용합니다.


쿼리는 어떻게 사용됩니까? 더 큰 절차 / 패키지의 일부, 매트 뷰의 기본 SQL은 외부 앱에서 실행됩니다. 나는 간단한 "wait xxx"구문을 모른다. 당신의 솔루션은 더 큰 프로그램의 일부가되어야 할 수도있다.

PL / SQL 패키지의 프로 시저를 실행하는 dbms_scheduler 작업이 조회를 발행합니다. (그것으로 질문 업데이트)
GWu

답변:


4

dbms_scheduler를 사용하고 있으므로 작업 의 max_run_duration 속성 을 어느 정도 제한 한 다음 해당 이벤트가 발생하면 스케줄러에서 이메일을 보내도록 할 수 있습니다. 무대 뒤에서 Oracle은 큐잉 테이블을 사용 합니다 (응답에 대해 더 많은 자동화를 수행하기 위해 추가 단계를 수행하려는 경우 이벤트가 발생할 때 실행되는 작업을 작성할 수 있습니다 ). 그러나 기본적으로 설정 한 max_run_duration을 실행하는 모든 작업은 다음과 같은 이벤트 유형을 발생시킵니다. JOB_OVER_MAX_DUR

이메일 조각이 11gr2에 내장되어, 참조 여기에 좋은 작성자를 위해.

희망이 도움이됩니다.


좋은 생각이야, 고마워! 그것은 DB 링크의 타임 아웃에 대한 특정 질문에 대한 정확한 대답은 아니지만 어쨌든 초기 문제를 해결한다고 생각합니다. +1 :-). 나는 max_run_duration을 몰랐고 이것부터 시작하여 중단 된 작업을 중지 및 삭제하는 방법을 발견했습니다 ( forums.oracle.com/forums/thread.jspa?threadID=521939#2002982 )
GWu

어떤 이유로 나는 max_run_duration이벤트를 제기 할 수 없어서 여기에
던졌습니다

0

나는 해결책이 있다고 말하지는 않지만 dblink 시간 초과를 제어하는 ​​방법에 대한 더 많은 토론을 원합니다. 이벤트를 발생시키는 코드를 작성하거나 TNS 시간 초과 이벤트를 기다렸다가 실행하는 것이 가능하다고 생각합니다.

ALTER SESSION CLOSE DATABASE LINK dblink;

물론 다음을 수행하기 전에 원격 서버를 폴링 할 수 있습니다.

select * from dual@dblink

사용 가능한지 확인하지만 리모컨에서 너무 오래 실행되는 코드 문제를 해결하지는 않습니다. 잘못된 원격 코드는 대기 이벤트를 발생시켜야하므로 (12c의 클래스 수준에서도) 트랩 될 수 있다고 가정합니다. 그럼에도 불구하고 dblink 세션이 시간 초과되도록 강제하는 우아한 솔루션은 제공하지 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.