programing

Oracle 환경에서 TNS: 청취자란 무엇입니까?

newstyles 2023. 8. 2. 08:53

Oracle 환경에서 TNS: 청취자란 무엇입니까?

Borderline ServerFault 질문입니다. 하지만 과거 Oracle 질문에 운이 좋았기 때문에 먼저 여기서 시도해 보겠습니다.

PHP에서 오라클 데이터베이스에 연결하려고 하는데 다음 오류가 발생합니다.

ORA-12505: TNS:listener does not currently know of SID given in connect descriptor

이것은 PHP가 보고하는 오류이며 Oracle의 listener.log에 나타나는 오류입니다.

저의 당면한 문제는 이 오류를 수정하는 것입니다.제가 대답하고 싶은 더 큰 질문은 Oracle 연결 모델의 작동 방식입니다.

이것은 제 로컬 윈도우 머신에서 실행되는 개발 환경에서 지금까지 작동하고 있습니다.불행히도 환경은 제게 넘겨졌고(제가 설정하지 않았습니다), 환경을 설정한 사람들은 제가 디버깅하는 것을 도와줄 수 없습니다.

MySQL 또는 PostgreSQL(제가 더 친숙한 두 시스템)에서 유사한 오류가 발생하는 경우 데이터베이스 프로세스가 실행 중인지 확인한 다음 사용자 이름/암호/연결 문자열을 사용하여 데이터베이스에 수동으로 연결을 시도합니다.안타깝게도, 저는 (SQL Developer를 제외한) Windows의 Oracle 도구에 익숙하지 않고 Oracle 환경에서 TNS:listener 또는 SID가 무엇인지 잘 모릅니다(나는 모호한 아이디어를 가지고 있지만, 이런 것을 디버깅할 때는 거의 도움이 되지 않습니다).

어떤 일반적인 조언이든 감사하겠습니다.

댓글당 업데이트 수:

내 tnsname.or 파일에 여러 개의 항목이 있습니다. 관련 항목은

OBS2 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = steel-ae39650)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = OBS2)
    )
  )

실행 시 인스턴스 목록에 반영되지 않습니다.

    LSNRCTL> services

다음 질문은 OBS2 인스턴스를 수동으로 시작하는 방법입니다.

TNS 이름은 서비스 인스턴스의 별칭과 같습니다.이와 관련하여 TNS 수신기 서비스는 일종의 룩업 서비스 역할을 합니다.TNS 이름을 통해 연결하려는 실제 서비스가 올바르지 않으면 해당 오류 메시지와 함께 실패합니다.

그런 다음 TNS 수신기가 명령줄 도구를 사용하여 서비스를 올바르게 인식하는지 테스트할 수 있습니다.

%>lsnrctl services

다음과 같은 것을 출력해야 합니다.

Service "myservice" has 1 instance(s).
  Instance "myinstance", status READY, has 1 handler(s) for this service...
    Handler(s):
      "D000" established:0 refused:0 current:0 max:1002 state:ready
         DISPATCHER <machine: LOCALHOST, pid: 12345>
         (ADDRESS=(PROTOCOL=tcp)(HOST=LOCALHOST)(PORT=6789))

관련 TNS 항목을 게시해 주시겠습니까?tnsnames.orafile)? ORAHOME\client 또는 db\에 있습니다.관리\네트워크.클라이언트와 서버가 모두 있는 경우 두 개의 복사본을 모두 사용해야 합니다.tnsnames.ora안전을 위해 파일의 값이 정확합니다.

은 다은의적 TNS 예입다니에 있는 tnsnames.ora 'mydb' :

myDbAlias =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 12345)(QUEUESIZE = 100))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = myservice)
    )
  )

여기에 추가하고 싶은 것은, 최근에 저도 비슷한 연결 문제로 인해 무슨 일이 일어나고 있는지 알기 전까지 저를 미치게 만들었기 때문입니다.

첫째, SID와 SERVICE_NAME 키워드가 정확히 동일하지 않습니다.이것은 저의 첫 번째 잘못된 추측이었습니다.대부분의 환경에서 SID와 SERVICE_NAME을 교환할 수 있지만, 항상 그런 것은 아닙니다.

즉, tnsname이 성공적으로 사용하는 SERVICE_NAME 대신 연결 문자열에 SID를 지정하는 오류가 발생합니다.

따라서 코드에서 연결 문자열을 지정하는 경우 연결 문자열에서 SERVICE_NAME 키워드를 사용해 보십시오(*또는 SERVICE_NAME을 이미 사용하고 있고 연결할 수 없는 경우 SID 키워드*를 사용해 보십시오).

너무 단순한 대답이지만 시도하기 쉽고 누군가의 두통을 덜어줄 수도 있습니다.

도움이 되길 바랍니다.

Mike Atlas의 답변은 상당히 포괄적이지만 [//]host_name[:port][/service_name]을 사용하여 게시된 tns 이름이 없는 10g(또는 그 이상) DB에 연결할 수 있습니다.

HTH

c.

언급URL : https://stackoverflow.com/questions/2134617/what-is-a-tnslistener-in-the-context-of-oracle