[Oracle] Network와 Oracle Net Service

HYEOB KIM·2022년 11월 15일
1

Oracle

목록 보기
17/58

이전 포스트 : [Oracle] DBMS_JOB & DBMS_SCHEDULER
다음 포스트 : [Oracle] FLASHBACK

1. IP Address 와 MAC Address

같은 네트워크 간의 통신(A <-> B)

  1. A 호스트가 자신의 IP 주소MAC 주소, B 호스트의 IP 주소를 담아서 Switch에 보냅니다.
    (A Host -> Switch)
  2. 이 요청을 받은 Switch는 자신이 가진 Switching Table에 B 호스트의 IP 주소가 있는지 확인합니다.
    만약 없다면 Switch에 연결되어 있는 Port 중에 A 호스트를 제외한 나머지 호스트들에게 Broadcast로 B 호스트의 IP 주소를 담아 메세지를 보냅니다.
    (Switch -> B, C)
    IP 주소의 주인인 B 호스트는 내가 맞다고 하면서 MAC 주소를 Switch에게 보내주고, 나머지 호스트들은 해당 메세지를 버립니다.
    (B Host -> Switch)
    B 호스트의 답장을 받은 Switch는 자신의 Switching Table에 B 호스트의 IP 주소와 MAC 주소를 매핑해서 기록합니다.
  3. 이제 Switch는 B 호스트의 MAC 주소를 알았으니 A <-> B 사이에 전용 도로를 생성해서 통신이 가능하도록 만들어줍니다.

다른 네트워크 간의 통신(A <-> F)

  1. A 호스트가 자신의 IP 주소MAC 주소, F 호스트의 IP 주소를 담아서 Switch에 보냅니다.
    (A Host -> Switch)
  2. Switch는 현재 네트워크에 해당 IP 주소를 가진 호스트가 없다는 것을 판단합니다.
  3. Switch는 Router에게 외부 네트워크에서 F 호스트의 IP 주소를 찾아달라고 요청합니다.
    (Switch -> Router)
  4. Router는 외부 네트워크에서 가장 근접한 Router 순서대로 그 Router의 Routing Table을 참조해 F 호스트의 IP가 있는 B 네트워크를 찾습니다. 이 과정에서 이웃 Router가 어떤 IP들을 가지고 있는지 정보를 공유하게 되는데 이때 사용하는 것이 Routing Protocol입니다. A 네트워크의 Router는 B 네트워크의 Router에게 F 호스트의 IP 주소를 넘겨줍니다.
    (A Router -> B Router)
  5. B 네트워크의 Router는 Switch에게 F 호스트의 IP 주소를 주면서 해당 호스트를 찾으라고 요청합니다.
    (Router -> Switch)
  6. Switch는 Broadcast로 모든 Port에 연결된 호스트들에 F의 IP 주소를 담은 메세지를 보냅니다.
    (Switch -> D, E, F)
  7. IP 주소의 주인인 F 호스트는 내가 맞다고 하면서 MAC 주소를 Switch에게 보내주고, 나머지 호스트들은 해당 메세지를 버립니다.
    (F -> Switch)
    F 호스트의 답장을 받은 Switch는 자신의 Switching Table에 F 호스트의 IP 주소와 MAC 주소를 매핑해서 기록합니다.
  8. A 호스트와 F 호스트가 통신이 가능해집니다.

2. 최초 SQL 수행 시

사용자가 SQL 문장을 수행하면 User Process라는 Process가 생성되어서 사용자가 작성한 SQL 문장을 서버 쪽으로 전달해 줍니다. User Process는 SQL 문장을 작성하는 프로그램을 의미하고 대표적으로 SQL*PLUS, SQL Developer, Toad, Orange 가 있습니다. 이때 User Process는 어떻게 자신이 전달해야 할 목적지를 알 수 있을까요?

답은 tnsnames.ora 파일입니다. Client 쪽에 Oracle Client Software를 설치하고 적절한 설정을 하게 되면 (netca 등을 사용해서) $ORACLE_HOME/network/admin/tnsnames.ora 파일이 생성됩니다. 이 파일에는 User Process가 찾아가야 할 Oracle Server의 SID, IP, Port 정보가 자세하게 기록되어 있습니다. User Process는 tnsnames.ora 파일을 참고해서 Server를 찾아갑니다.

만약 사용자가 최초로 SQL 문장을 실행하는 것이라면 User Process가 Oracle Server를 찾아 갔을 때 Listener를 먼저 만나게 됩니다(1). Listener가 listener.ora 파일을 참고해서 해당 요청에 문제가 없는지 검사한 후 Database Instance에 호출을 넣어서 실제 처리할 실무 담당자인 Server Process를 불러오게 됩니다(2).

최초 실행이 아닌 두 번째로 수행하는 SQL부터Listener를 거치는 과정을 생략하고 바로 Server Process를 찾아가게 됩니다(3).

3. Oracle Net Service 설정하기

1) Client 쪽 설정

Oracle Server에 접속하려는 모든 컴퓨터나 서버는 Client입니다.
Oracle Server에 접속하려면 Oracle Client 프로그램을 설치하고 적절한 설정을 해야만 합니다.

Oracle Client 설치 방법

Windows 기반으로 Client 프로그램이 설치되었다고 가정하고 아래 과정을 소개하겠습니다.

작업표시줄의 윈도우 버튼을 누르고 Net Configuration Assistant를 실행합니다.

새로 접속할 서버의 정보를 등록하기 위해 로컬 네트 서비스 이름 구성을 선택합니다.

접속하고자 하는 DB의 SID를 작성합니다

접속할 서버의 IP 주소와 Port를 작성합니다.

설정이 잘 되었는지 테스트를 진행합니다.

Oracle Server의 계정 정보를 입력합니다.

테스트 성공!

에러 메시지(ORA-XXXXX) 발생

  • ORA-12541 : 만약 Server 쪽에 Listener가 기동하고 있지 않다면 ORA-12541 에러 메시지가 나타납니다. 이럴 경우 Server에서 lsnrctl start <Listener 이름> 명령을 통해 리스너를 실행시켜주면 됩니다.
  • ORA-01017 : 해당 메시지는 유효하지 않은 사용자/비밀번호를 입력했을 때 발생하는 에러 메시지입니다. Server 쪽에 유효한 사용자를 따로 생성해 주고 그 사용자를 통해 접속해 보도록 합니다.

네트 서비스 이름(Client에서 Server로 접속할 때 사용하는 별명)을 입력합니다.

모든 구성이 완료되었다면 C:\app\client\user\product\19.0.0\client_1\network\admintnsnames.ora 파일이 아래와 같은 내용을 가지고 생성되어 있습니다.

# tnsnames.ora Network Configuration File: C:\app\client\user\product\19.0.0\client_1\NETWORK\ADMIN\tnsnames.ora
# Generated by Oracle configuration tools.

ORACLE19 =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.137.50)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = oracle19)
    )
  )

설정을 모두 마친 후 Client에서 Server의 listener가 정상인지 확인하기 위해 cmd 창을 열고 tnsping <Net Service 이름>을 실행할 수 있습니다.

2) Server 쪽 설정

Server 쪽 명령창에서 netca를 입력해 실행합니다.

그럼 $ORACLE_HOME/network/admin 경로에 listener.ora 파일이 생성되어 있습니다.

$ cd $ORACLE_HOME/network/admin

$ vi listener.ora
# listener.ora Network Configuration File: /ORA19/app/oracle/product/19.0.0/db_1/network/admin/listener.ora
# Generated by Oracle configuration tools.

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = localhost.localdomain)(PORT = 1521))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
  )

리스너는 Client로부터 신규 접속 요청이 있을 경우 해당 DB와 연결해주는 역할을 합니다. 그래서 리스너는 자신이 관리하는 DB의 SID를 모두 알고 있어야 하며 이 정보들은 모두 listener.ora 파일에 기록되어 있어야 합니다.

client가 자신의 tnsnames.ora 파일을 보고 특정 SID에 접속 요청을 하면 해당 server의 리스너는 자신의 listener.ora 파일을 보고 해당 SID가 존재하는지 확인한 후 연결을 성립시켜 줍니다. 이때 당연히 리스너는 실행되고 있어야 하며, 실행 명령어는 아래와 같습니다.

$ lsnrctl start <리스너 이름>

lsnrctl

리스너와 관련된 모든 명령어는 이 명령어로 시작합니다.

reload

listener.ora 파일의 내용이 변경되면 해당 리스너를 재시작해서 변경된 내용을 적용시켜야 합니다. reload <리스너 이름> 명령어를 사용하면 파일의 내용이 수정되어도 재시작 없이 환경파일만 다시 읽어서 적용시킬 수 있습니다.

$ lsnrctl reload <리스너 이름>

LSNRCTL for Linux: Version 19.0.0.0.0 - Production on 25-NOV-2022 13:41:08

Copyright (c) 1991, 2019, Oracle.  All rights reserved.

Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))
The command completed successfully

save_config

리스너의 환경이 변경될 경우 그 내용을 listener.ora 파일에 저장하는 명령어입니다. 주로 운영 중에 set 등의 명령어로 리스너의 환경을 변경한 후에 그 내용을 저장할 때 이용합니다.

$ lsnrctl save_config <리스너 이름>

LSNRCTL for Linux: Version 19.0.0.0.0 - Production on 25-NOV-2022 13:41:20

Copyright (c) 1991, 2019, Oracle.  All rights reserved.

Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))
No changes to save for LISTENER.
The command completed successfully

services

현재 리스너가 서비스 중인 목록을 확인하는 명령어입니다.

$ lsnrctl services

LSNRCTL for Linux: Version 19.0.0.0.0 - Production on 25-NOV-2022 13:43:05

Copyright (c) 1991, 2019, Oracle.  All rights reserved.

Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))
Services Summary...
Service "oracle19" has 1 instance(s).
  Instance "oracle19", status READY, has 1 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:0 refused:0 state:ready
         LOCAL SERVER
Service "oracle19XDB" has 1 instance(s).
  Instance "oracle19", status READY, has 1 handler(s) for this service...
    Handler(s):
      "D000" established:0 refused:0 current:0 max:1022 state:ready
         DISPATCHER <machine: khyup, pid: 6334>
         (ADDRESS=(PROTOCOL=tcp)(HOST=khyup)(PORT=20839))
The command completed successfully

set

리스너의 환경 설정을 변경하는 명령어입니다. 설정을 변경한 후 save_config 명령어를 통해 설정 값을 저장할 수 있습니다.

$ lsnrctl set inbound_connect_timeut 10

version

리스너의 버전 정보를 보여줍니다.

$ lsnrctl version

LSNRCTL for Linux: Version 19.0.0.0.0 - Production on 25-NOV-2022 13:52:52

Copyright (c) 1991, 2019, Oracle.  All rights reserved.

Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))
TNSLSNR for Linux: Version 19.0.0.0.0 - Production
        TNS for Linux: Version 19.0.0.0.0 - Production
        Unix Domain Socket IPC NT Protocol Adaptor for Linux: Version 19.0.0.0.0 - Production
        Oracle Bequeath NT Protocol Adapter for Linux: Version 19.0.0.0.0 - Production
        TCP/IP NT Protocol Adapter for Linux: Version 19.0.0.0.0 - Production,,
The command completed successfully

show

현재 설정되어 있는 내용을 보여줍니다.

]$ lsnrctl show

LSNRCTL for Linux: Version 19.0.0.0.0 - Production on 25-NOV-2022 13:54:03

Copyright (c) 1991, 2019, Oracle.  All rights reserved.

The following operations are available after show
An asterisk (*) denotes a modifier or extended command:

rawmode                              displaymode
rules                                trc_file
trc_directory                        trc_level
log_file                             log_directory
log_status                           current_listener
inbound_connect_timeout              startup_waittime
snmp_visible                         save_config_on_stop
dynamic_registration                 enable_global_dynamic_endpoint
oracle_home                          pid
connection_rate_limit                valid_node_checking_registration
registration_invited_nodes           registration_excluded_nodes
remote_registration_address

start/status/stop

$ lsnrctl start/stat/stop <리스너 이름>

trace

리스너를 trace 하는 명령어입니다. 해당 명령어를 수행하면 특정 경로에 .trc 파일이 생성됩니다.

  • off: trace 정보가 없음
  • user: 사용자 레벨의 trace 정보 표시
  • admin: 관리자 레벨의 trace 정보 표시
  • support: Oracle Support Services 레벨의 trace 정보 표시
$ lsnrctl trace admin listener

LSNRCTL for Linux: Version 19.0.0.0.0 - Production on 25-NOV-2022 14:03:23

Copyright (c) 1991, 2019, Oracle.  All rights reserved.

Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))
Opened trace file: /ORA19/app/oracle/diag/tnslsnr/khyup/listener/trace/ora_7328_139706525494336.trc
The command completed successfully

.trc 파일이 생성된 경로로 접근해서 내용을 살펴보면 아래와 같습니다.

$ cd /ORA19/app/oracle/diag/tnslsnr/khyup/listener/trace/

$ ls -al
total 24
drwxr-xr-x.  2 oracle dba    98 Nov 25 14:03 .
drwxr-xr-x. 14 oracle dba  4096 Nov 25 12:06 ..
-rw-r-----.  1 oracle dba 10006 Nov 25 14:03 listener.log
-rw-r-----.  1 oracle dba  2370 Nov 25 14:03 ora_7328_139706525494336.trc
-rw-r-----.  1 oracle dba  1432 Nov 25 14:03 ora_7328_139706525494336.trm

$ vi ora_7328_139706525494336.trc
Trace file /ORA19/app/oracle/diag/tnslsnr/khyup/listener/trace/ora_7328_139706525494336.trc
2022-11-25 14:03:23.215 : nsglrespond:entry
2022-11-25 14:03:23.216 : nsdo:cid=5, opcode=67, *bl=141, *what=1, uflgs=0x0, cflgs=0x3
2022-11-25 14:03:23.217 : nsdo:rank=64, nsctxrnk=0
2022-11-25 14:03:23.217 : nsdo:nsctx: state=8, flg=0x2100400c, mvd=0
2022-11-25 14:03:23.217 : nsdo:gtn=223, gtc=223, ptn=10, ptc=8111
2022-11-25 14:03:23.217 : nsdo:141 bytes to NS buffer
2022-11-25 14:03:23.217 : nsdo:nsctxrnk=0
2022-11-25 14:03:23.217 : nsglrespond:exit
2022-11-25 14:03:23.217 : nsgldissolve:entry
2022-11-25 14:03:23.217 : nsvntx_dei:entry
2022-11-25 14:03:23.217 : nsvntx_dei:exit
2022-11-25 14:03:23.217 : nstimarmed:no timer allocated
2022-11-25 14:03:23.217 : nsfull_cls:cid=5, opcode=65, *bl=0, *what=0, uflgs=0x0, cflgs=0x0
2022-11-25 14:03:23.217 : nsfull_cls:nsctx: state=8, flg=0x21004008, mvd=141
2022-11-25 14:03:23.217 : nsevunreg:cid=5, sgt=0, rdm=0
2022-11-25 14:03:23.217 : nsevunreg:3 registered connection(s)
2022-11-25 14:03:23.217 : nsdo:cid=5, opcode=67, *bl=0, *what=1, uflgs=0x0, cflgs=0x1
2022-11-25 14:03:23.217 : nsdo:nsctx: state=8, flg=0x1004008, mvd=141
2022-11-25 14:03:23.217 : nsdo:gtn=223, gtc=223, ptn=151, ptc=8111
2022-11-25 14:03:23.217 : nsdofls:DATA flags: 0x40
2022-11-25 14:03:23.217 : nsdofls:sending NSPTDA packet
2022-11-25 14:03:23.217 : nspsend:plen=151, type=6
2022-11-25 14:03:23.217 : ntuswrte:entry
2022-11-25 14:03:23.217 : ntuswrte:Wrote on 15 bytes 151
2022-11-25 14:03:23.217 : ntuswrte:exit
2022-11-25 14:03:23.217 : nspsend:151 bytes to transport
2022-11-25 14:03:23.217 : nsclose:closing transport
2022-11-25 14:03:23.217 : ntusdisc:entry
2022-11-25 14:03:23.217 : ntusdisc:Closed socket 15
2022-11-25 14:03:23.217 : ntusdisc:exit
2022-11-25 14:03:23.217 : nsclose:global context check-out (from slot 5) complete
2022-11-25 14:03:23.217 : nsvntx_dei:entry
2022-11-25 14:03:23.217 : nsvntx_dei:exit
2022-11-25 14:03:23.217 : nsmfr:3368 bytes at 0x25b1cc0
2022-11-25 14:03:23.217 : nsmfr:1952 bytes at 0x25b8670
2022-11-25 14:03:23.217 : nsgldissolve:Deallocating cxd 0x25f2da0.
2022-11-25 14:03:23.217 : nsgldissolve:exit
2022-11-25 14:03:23.217 : nsevwait:3 registered connection(s)
2022-11-25 14:03:23.217 : nsevwait:0 pre-posted event(s)
2022-11-25 14:03:23.218 : nsevwait:waiting for transport event (1 thru 4)...

4. Oracle Net Service 관련 파일들

Oracle Net Service 관련 파일은 tnsnames.ora, sqlnet.ora, listener.ora 파일이 대표적입니다. 이 파일들의 내용들이 어떤 의미가 있고 어떻게 설정해서 사용하면 되는지를 자세하게 살펴보겠습니다.

파일 설정 시 규칙 및 주의 사항

파일의 파라미터들의 작성 형식은 parameter=(keyword=value) 형태로 key-value 형식입니다.
만약 keyword 안에 key-value가 존재할 경우 아래와 같이 작성합니다.

(keyword=
  (keyword=value)
  (keyword=value))

예를 들어서 실제로 아래와 같이 작성할 수 있습니다.

(ADDRESS=
  (PROTOCOL=tcp)
  (HOST=localhost)
  (PORT=1521))

주의사항

  • 반드시 들여쓰기를 해야 합니다.
  • keyword는 대소문자를 구분하지 않지만 값은 OS에 따라서 대소문자를 구분할 수도 있습니다.
  • 항목의 배치 순서는 상관없습니다.
  • keyword에는 공백이 포함될 수 없습니다.
  • 값 부분에 공백을 포함하려면 반드시 "'로 감싸야 합니다.
  • 주석을 사용하려면 해당 행 앞에 # 기호를 붙이면 됩니다.

Network 환경 설정 시 사용 가능한 문자

위에서 살펴본 파일들에 값을 설정할 때 값에 사용될 수 있는 문자는 아래와 같습니다.

A-Z, a-z, 0-9, ( ) < > / \
, . : ; ' " = - _
$ + * # & ! % ? @

이 중에서 ( ) = \ " ' # 문자들은 오라클이 미리 사용처를 예약해두었기 때문에 문자로 쓰고 싶다면 이스케이프 문자\를 앞에 붙이고 사용해야 합니다.

Listener 이름에 사용될 수 잇는 문자는 아래 문자 뿐입니다.
(Listener 이름이 위 문자 외의 문자가 들어갈 경우 에러가 발생합니다)

[a - z] [A - Z] [0 - 9]

Protocol Address List

아래는 Client 쪽의 tnsnames.ora 파일의 내용입니다.

TESTDB = 
  (DESCRIPTION = 
    (ADDRESS_LIST = 
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.192.129)(PORT = 1521))
    )
    (CONNECT_DATA = 
      (SERVICE_NAME = testdb)
    )
  )

위 화면에서도 볼 수 있듯이 Protocol Address는 Address와 Address_list로 구성이 되어 있습니다.
만약 Listener가 여러 IP의 서버를 연결해 주는 역할을 한다면 아래의 예와 같이 입력합니다.

(ADDRESS_LIST=
  (ADDRESS=
    (PROTOCOL=tcp)
    (HOST=server100)
    (PORT=1521)
  )
  (ADDRESS=
    (PROTOCOL=tcp)
    (HOST=server101)
    (PORT=1521)
  )
)

HOST 부분에는 접속하고자 하는 서버의 IP 주소를 적어도 되고, /etc/hosts 파일에 명시된 서버 이름이 적힐 수도 있습니다.

만약 tnsnames.oralistener.ora 파일의 port 번호가 다른 상황(1521 - 1522)에서 Client -> Server로 접속을 시도할 경우 에러가 발생하면서 접속이 되지 않습니다. 에러가 발생하는 이유는 Client 쪽의 User Process가 tnsnames.ora 파일을 보고 Server의 1521번 Port로 찾아 가서 접속을 요청했지만 Listener는 1522번 Port 앞에서 접속을 기다리고 있었던 것입니다.

Client 쪽의 tnsnames.ora

Client 쪽의 User Process가 Server를 찾아가기 위한 정보를 담고 있는 설정 파일입니다. 기본 경로는 $ORACLE_HOME/network/admin으로 설정되어 있습니다.

DESCRIPTION, DESCRIPTION_LIST 파라미터는 접속하고자 하는 대상 서버에 대한 정보를 상세하게 지정해주는 역할을 합니다. 서비스 명이 여러 개일 경우 DESCRIPTION_LIST를 사용합니다.

testdb=
(DESCRIPTION=
  (ADDRESS=(PROTOCOL=tcp)(HOST=rac1)(PORT=1521))
    (CONNECT_DATA=(SERVICE_NAME=testdb)))
    
testdb=
(DESCRIPTION_LIST=
  (DESCRIPTION=
    (ADDRESS=...)
    (CONNECT_DATA=(SERVICE_NAME=testdb1)))
  (DESCRIPTION=
    (ADDRESS=...)
    (CONNECT_DATA=(SERVICE_NAME=testdb2))))

RAC 등과 같이 같은 서비스 명으로 여러 IP가 있다면 아래와 같이 작성하면 됩니다.

rac=
(DESCRIPTION=
  (ADDRESS_LIST=
    (ADDRESS=(PROTOCOL=tcp)(HOST=rac1)(PORT=1521))
    (ADDRESS=(PROTOCOL=tcp)(HOST=rac2)(PORT=1521)))
    (CONNECT_DATA=(SERVICE_NAME=racdb)))

Server 쪽의 listener.ora

listener가 작동하기 위해 필요한 설정들이 저장되어 있는 파일입니다. 기본 경로는 $ORACLE_HOME/network/admin/listener.ora로 설정되어 있으며 OS 편집기로 수정할 수 있습니다.

양쪽의 sqlnet.ora

sqlnet.ora 파일은 client와 server 쪽 모두 존재하며, client의 접근 제어 profile 역할을 하는 파일입니다. 이 파일이 존재하지 않을 경우에는 netca 명령어로 설정을 해 주면 됩니다.

5. Client -> Server 접속 테스트 및 트러블슈팅

tnsnames.ora와 trcroute 명령어

tnspingclient에서 tnsnames.ora 파일에 적혀 있는 Net Service Name을 보고 서버 쪽의 Listener로 접속을 시도하는 명령어입니다.

C:\Users\khyup>tnsping testdb

만약 Server 쪽 Listener가 중단된 상태거나 네트워크로 접속이 안되는 장애 상황일 경우에는 아래와 같은 메시지가 나옵니다.

C:\Users\khyup>tnsping testdb

TNS-12541: TNS:no listener

위와 같은 에러 메시지가 나올 경우 OS에서 ping 명령어로 서버 자체가 켜져 있는지 확인하고,
ping이 정상 작동한다면 listener가 정상적으로 작동하는지를 lsnrctl 명령어로 확인해야 합니다.

trcroute 명령어는 Client에서 Listener를 찾아가면서 tnsping보다 더 자세한 내역을 보여줍니다.

$ trcroute testdb

log file과 주요 에러 메시지 살펴보기

1. ADR(Automatic Diagnostic Repository) 살펴보기

ADR이란 DB 서버에서 발생하는 모든 에러나 장애 로그 파일들을 특정 디렉토리에 자동으로 저장하고 관리하기 위한 방법입니다.
기본 경로는 $ORACLE_BASE/diag/product_type/product_id/instance_id로 설정됩니다.
ADR은 모든 로그 파일이나 trace 관련 파일을 중앙집중적으로 관리합니다.

product_type에는 asm, rdbms, tnslsnr, clients, crs 등이 있습니다.

product_type으로 들어가면 아래에는 대략 이런 형식으로 디렉토리가 구성되어 있습니다.

예를 들어, listener 관련 로그는 $ORACLE_BASE/diag/tnslsnr/<SERVER명>/listener/trace 디렉토리에서 관리합니다. 해당 디렉토리를 조회하면 확장자가 .trc인 파일들이 보이는데 그 중에서 원하는 파일들을 vi 편집기 같은 것들로 열어서 살펴보면 됩니다.

oracle에서 ADR Command Interpreter(adrci)라는 별도의 ADR 명령어를 제공해줍니다.

$ adrci

adrci> show tracefile

특정 파일의 내용을 조회하려면 show trace <file name>으로 명령을 수행합니다. 하지만 이 방법보다는 OS 편집기로 해당 trace 파일을 확인하는 방법이 더 많이 사용되는 것 같습니다.

2. 주요 Net Service 관련 에러 모음

Oracle에서는 에러의 내용을 쉽게 확인하기 위해 oerr이라는 유틸리티를 제공합니다.
아래와 같이 조회하면 에러의 내용을 보다 자세하게 확인할 수 있습니다.

$ oerr ora 12533

$ oerr tns 12500

주요 에러 메시지

  • ORA-03113: TNS: end-of-file on communication channel
    이 에러 메시지는 DB와의 접속이 강제로 끊어진 경우에 발생합니다. DB의 비정상 종료 등의 원인으로 연결이 강제로 끊어진 경우이니 해당 DB의 Alert Log 파일을 살펴보고 원인을 찾아야 합니다.

  • ORA-12154: TNS: could not resolve the connect identifier specified
    client에서 Net Service Name을 찾지 못하는 경우, 즉 접속할 대상을 찾지 못했을 경우 발생하는 것입니다. 주로 tnsnames.ora 파일의 설정이 틀리거나 sqlnet.ora 파일에서 names.directory_path의 경로값에 tnsnames 값이 설정되어 있는지 확인해야 합니다.

  • ORA-12170: TNS: Connect timeout occurred
    sqlnet.ora 파일에서 SQLNET.INBOUND_CONNECT_TIMEOUT이 설정되어 있을 경우 해당 시간 동안 요청이 없을 때 서버 쪽에서 강제로 접속을 끊어서 발생하는 에러 메시지입니다. 네트워크가 불안정하거나 접속이 잘 안되는 경우에도 발생할 수 있으니 네트워크 상태를 점검해보기를 권장합니다. 그리고 sqlnet.ora 파일에 설정된 SQLNET.INBOUND_CONNECT_TIMEOUT, SQLNET.SEND_TIMEOUT, SQLNET.RECV_TIMEOUT 파라미터 값을 현재 값보다 더 크게 설정할 것을 권장합니다.

  • TNS-12500/ORA-12500: TNS: listener failed to start a dedicated server process
    여러 가지 이유((1)1명의 사용자가 수행할 수 있는 PROCESS의 개수를 넘었을 때, (2)listener 프로그램에 oracle 사용자의 실행권한이 없을 경우, (3)Windows 운영체제에서 service가 시작되지 않았을 경우)로 listener가 시작되지 않았을 경우 발생합니다. 위의 경우 다음과 같은 메시지도 함께 발생합니다. TNS-12549/ORA-12549, TNS-00519, TNS-12540/ORA-12540, TNS-00510, TNS-12560/ORA-12560. 에러 메시지를 해결하는 방법은 파라미터 파일에서 PROCESS의 개수를 증가시키거나 실행권한을 주면 됩니다.

  • ORA-12514: TNS: listener does not currently know of service requested in connect descriptor
    client가 listener에게 접속 요청한 service name을 listener.ora 파일에서 찾을 수 없어서 발생합니다. tnsnames.ora, listener.ora 파일의 SID와 SERVICE_NAME이 일치하는지 확인한 후 동일하게 설정하면 됩니다.

  • ORA-12521: TNS: listener does not currently know of instance requested in connect descriptor
    client가 요청한 Instance name을 listener가 알지 못할 때 발생합니다. 해결 방법은 tnsnames.oralistener.ora 파일의 SERVICE_NAME을 동일하게 설정하면 됩니다.

  • ORA-12525: TNS: listener has not received client's request in time allowed
    sqlnet.ora 파일의 INBOUND_CONNECT_TIMEOUT_listener_name 파라미터에 설정된 시간 값 동안 client의 요청을 받지 못해서 server 쪽의 listener가 발생하는 에러 메시지 입니다. 해당 값을 현재 설정 값보다 크게 하거나 네트워크 상태를 점검해서 해결해야 합니다.

  • ORA-12533: TNS: illegal ADDRESS parameters
    tnsnames.ora 파일이나 listener.ora 파일에 PROTOCOL ADDRESS 쪽에 잘못된 항목이나 오타가 있을 경우 발생하는 에러 메시지 입니다.

  • TNS-12540/ORA-12540: TNS: internal limit restriction exceeded and TNS-00510: Internal limit restriction exceeded
    이 에러 메시지는 내부적인 한계를 초과한 경우 발생하는 에러입니다. (1)Oracle Net Service에 접속할 수 있는 process의 개수 초과, (2)사용 가능한 메모리 버퍼 개수의 초과, (3)데이터베이스 전체에서 사용할 수 있는 process 개수의 초과인 경우 발생합니다. 이런 경우 대부분 파라미터 파일에서 process의 개수를 현재보다 많이 지정하면 해결됩니다. 메모리 버퍼 수 초과의 경우 메모리 용량을 변경해주어야 하고, 각 사항은 alert log를 참고해 적절한 조치를 취해야 합니다.

  • TNS-12541/ORA-12541: TNS: no listener
    client가 server 쪽의 listener를 찾지 못해 발생하는 에러입니다. tnsnames.ora, listener.ora 파일의 IP, Port 정보가 동일한지 확인하거나 listener가 동작하고 있는지 확인합니다.

  • TNS-12560/ORA-12560: TNS: protocol adapter error occurred
    windows에서만 발생하는 에러이며, ADDRESS 파라미터의 값이 잘못 지정될 경우 발생하는 경우가 많습니다. 또는 windows가 시작될 때 Oracle Service가 정상적으로 시작이 안될 경우 많이 발생합니다. OracleService<SID> 서비스를 enable 해 준 후 재시작하면 됩니다.


참고

profile
Devops Engineer

0개의 댓글