프린트 하기

OS 환경 : Oracle Linux 8.4 (64bit)

 

DB 환경 : Oracle Database 23.4.0.24.05 ai Free

 

방법 : 오라클 23ai 뉴피처 tns 에러 메세지 개선

오라클 23ai 부터 tns 관련 에러 메세지들이 조금 더 개선됨
오류 의미 링크, 오류 원인 및 문제 해결을 위한 조치사항 등 추가 정보를 제공하기 때문에 TNS 오류 메시지를 분석하기 용이해짐

어떻게 좋아졌는지 테스트를 통해 알아봄

 

 

테스트
1. tnsnames.ora 파일에 alias가 존재하지 않는 경우
2. tnsnames.ora 파일의 hostname이 잘못된 경우
3. 리스너가 기동중이지 않은 경우
4. 리스너가 기동중이지만 서비스 중이지 않은 경우
5. tnsnames.ora 파일의 SERVICE_NAME이 잘못된 경우
6. 유저이름이나 패스워드가 틀린 경우

 

 

테스트
1. tnsnames.ora 파일에 alias가 존재하지 않는 경우
tnsnames.ora 파일 확인(19c)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ cat tnsnames.ora
# tnsnames.ora Network Configuration File: /ORA19/app/oracle/product/19.0.0/db_1/network/admin/tnsnames.ora
# Generated by Oracle configuration tools.
 
LISTENER_ORACLE19 =
  (ADDRESS = (PROTOCOL = TCP)(HOST = ora19)(PORT = 1521))
 
ora19a =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = ora19)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = oracle19)
    )
  )

현재 ora19a 라는 alias로 정상 접속 가능한 상황임

 

 

잘못된 tns alias로 tns 접속 시도(19c)
(ora19a가 아닌 존재하지 않는 ora19b로 접속 시도함)

1
2
3
4
5
6
7
8
9
10
11
12
$ sqlplus system/oracle@ora19b
 
SQL*Plus: Release 19.0.0.0.0 - Production on Sat May 4 17:04:03 2024
Version 19.3.0.0.0
 
Copyright (c) 1982, 2019, Oracle.  All rights reserved.
 
ERROR:
ORA-12154: TNS:could not resolve the connect identifier specified
 
 
Enter user-name:

ORA-12154 에러만 발생함

 

 

tnsnames.ora 파일 확인(23ai)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ cat tnsnames.ora
# tnsnames.ora Network Configuration File: /opt/oracle/product/23ai/dbhomeFree/network/admin/tnsnames.ora
# Generated by Oracle configuration tools.
 
FREE =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = ora23)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = FREE)
    )
  )
 
LISTENER_FREE =
  (ADDRESS = (PROTOCOL = TCP)(HOST = ora23)(PORT = 1521))

현재 FREE 라는 alias로 정상 접속 가능한 상황임

 

 

잘못된 tns alias로 tns 접속 시도(23ai)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ sqlplus system/oracle@FREE1
 
SQL*Plus: Release 23.0.0.0.0 - Production on Sat May 4 17:05:03 2024
Version 23.4.0.24.05
 
Copyright (c) 1982, 2023, Oracle.  All rights reserved.
 
ERROR:
ORA-12154: Cannot connect to database. Could not find alias FREE1 in
/opt/oracle/product/23ai/dbhomeFree/network/admin/tnsnames.ora.
Help: https://docs.oracle.com/error-help/db/ora-12154/
 
 
Enter user-name:

ORA-12154 에러와 함께 FREE1이라는 alias를 tnsnames.ora 파일에서 찾을수 없다고 까지 알려줌
그리고 에러 메세지 설명 링크까지 제공됨

 

 

2. tnsnames.ora 파일의 hostname이 잘못된 경우
tnsnames.ora 파일 수정(19c)
현재 19c db 서버의 hostname은 ora19임, tnsnames.ora 파일의 host를 ora199로 변경

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ cat tnsnames.ora
# tnsnames.ora Network Configuration File: /ORA19/app/oracle/product/19.0.0/db_1/network/admin/tnsnames.ora
# Generated by Oracle configuration tools.
 
LISTENER_ORACLE19 =
  (ADDRESS = (PROTOCOL = TCP)(HOST = ora19)(PORT = 1521))
 
ora19a =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = ora199)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = oracle19)
    )
  )

ora19a 라는 tns alias의 HOST를 ora199로 변경함

 

 

잘못된 hostname 이 등록된 alias 로 tns 접속 시도(19c)

1
2
3
4
5
6
7
8
9
10
11
12
$ sqlplus system/oracle@ora19a
 
SQL*Plus: Release 19.0.0.0.0 - Production on Sat May 4 17:10:58 2024
Version 19.3.0.0.0
 
Copyright (c) 1982, 2019, Oracle.  All rights reserved.
 
ERROR:
ORA-12545: Connect failed because target host or object does not exist
 
 
Enter user-name:

ORA-12545 에러만 발생함

 

 

tnsnames.ora 파일 수정(23ai)
현재 23ai db 서버의 hostname은 ora23임, tnsnames.ora 파일의 host를 ora233로 변경

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ cat tnsnames.ora
# tnsnames.ora Network Configuration File: /opt/oracle/product/23ai/dbhomeFree/network/admin/tnsnames.ora
# Generated by Oracle configuration tools.
 
FREE =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = ora233)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = FREE)
    )
  )
 
LISTENER_FREE =
  (ADDRESS = (PROTOCOL = TCP)(HOST = ora23)(PORT = 1521))

FREE 라는 tns alias의 HOST를 ora233로 변경함

 

 

잘못된 hostname 이 등록된 alias 로 tns 접속 시도(23ai)

1
2
3
4
5
6
7
8
9
10
11
12
13
$ sqlplus system/oracle@FREE
 
SQL*Plus: Release 23.0.0.0.0 - Production on Sat May 4 17:11:58 2024
Version 23.4.0.24.05
 
Copyright (c) 1982, 2023, Oracle.  All rights reserved.
 
ERROR:
ORA-12545: Connect failed because target host or object does not exist
Help: https://docs.oracle.com/error-help/db/ora-12545/
 
 
Enter user-name:

ORA-12545 에러와 함께 에러 메세지 설명 링크가 제공됨
이 링크를 따라 들어가서 보면 에러 코드 원인이 "지정된 주소가 유효하지 않거나 연결하려는 프로그램이 존재하지 않음" 이라고 나옴
Action 부분에도 ADDRESS 매개변수가 올바르게 입력되었는지 확인한뒤,
프로토콜이 TCP/IP인 경우 TNSNAMES.ORA 파일을 편집하여 호스트 이름을 숫자 IP 주소로 변경하고 다시 시도하라고 나옴

 

 

3. 리스너가 기동중이지 않은 경우
리스너 종료(19c)

1
2
3
4
5
6
7
8
$ lsnrctl stop
 
LSNRCTL for Linux: Version 19.0.0.0.0 - Production on 04-MAY-2024 17:16:50
 
Copyright (c) 1991, 2019, Oracle.  All rights reserved.
 
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=ora19)(PORT=1521)))
The command completed successfully

정상적으로 종료됨

 

 

tns 접속 시도(19c)

1
2
3
4
5
6
7
8
9
10
11
12
$ sqlplus system/oracle@ora19
 
SQL*Plus: Release 19.0.0.0.0 - Production on Sat May 4 17:17:47 2024
Version 19.3.0.0.0
 
Copyright (c) 1982, 2019, Oracle.  All rights reserved.
 
ERROR:
ORA-12541: TNS:no listener
 
 
Enter user-name:

ORA-12541 에러만 발생함

 

 

리스너 종료(23ai)

1
2
3
4
5
6
7
8
$ lsnrctl stop
 
LSNRCTL for Linux: Version 23.0.0.0.0 - Production on 04-MAY-2024 17:18:47
 
Copyright (c) 1991, 2023, Oracle.  All rights reserved.
 
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=ora23)(PORT=1521)))
The command completed successfully

정상적으로 종료됨

 

 

tns 접속 시도(23ai)

1
2
3
4
5
6
7
8
9
10
11
12
13
$ sqlplus system/oracle@FREE
 
SQL*Plus: Release 23.0.0.0.0 - Production on Sat May 4 17:19:47 2024
Version 23.4.0.24.05
 
Copyright (c) 1982, 2023, Oracle.  All rights reserved.
 
ERROR:
ORA-12541: Cannot connect. No listener at host 192.168.137.23 port 1521.
Help: https://docs.oracle.com/error-help/db/ora-12541/
 
 
Enter user-name:

ORA-12541 에러가 발생하고 현재 접속하려는 ip(host)에 리스너가 없다고 나옴
그리고 에러 메세지 설명 링크까지 제공됨

 

 

4. 리스너가 기동중이지만 서비스 중이지 않은 경우
리스너 기동(19c)
리스너 기동 후 바로 접속 시도(리스너에 db 서비스가 자동으로 등록되기 전 접속)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
$ lsnrctl start
 
LSNRCTL for Linux: Version 19.0.0.0.0 - Production on 04-MAY-2024 17:20:12
 
Copyright (c) 1991, 2019, Oracle.  All rights reserved.
 
Starting /ORA19/app/oracle/product/19.0.0/db_1/bin/tnslsnr: please wait...
 
TNSLSNR for Linux: Version 19.0.0.0.0 - Production
System parameter file is /ORA19/app/oracle/product/19.0.0/db_1/network/admin/listener.ora
Log messages written to /ORA19/app/oracle/diag/tnslsnr/ora19/listener/alert/log.xml
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=ora19)(PORT=1521)))
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
 
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=ora19)(PORT=1521)))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 19.0.0.0.0 - Production
Start Date                04-MAY-2024 17:20:12
Uptime                    0 days 0 hr. 0 min. 0 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /ORA19/app/oracle/product/19.0.0/db_1/network/admin/listener.ora
Listener Log File         /ORA19/app/oracle/diag/tnslsnr/ora19/listener/alert/log.xml
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=ora19)(PORT=1521)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
The listener supports no services
The command completed successfully

리스너가 기동만 되고 아직 서비스가 붙지 않은 상태임

 

 

바로 접속 시도(19c)

1
2
3
4
5
6
7
8
9
10
11
12
$ sqlplus system/oracle@ora19
 
SQL*Plus: Release 19.0.0.0.0 - Production on Sat May 4 17:20:14 2024
Version 19.3.0.0.0
 
Copyright (c) 1982, 2019, Oracle.  All rights reserved.
 
ERROR:
ORA-12541: TNS:no listener
 
 
Enter user-name: ^C

ORA-12541 에러만 발생함

 

 

리스너 기동(23ai)
리스너 기동 후 바로 접속 시도(리스너에 db 서비스가 자동으로 등록되기 전 접속)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
$ lsnrctl start
 
LSNRCTL for Linux: Version 23.0.0.0.0 - Production on 04-MAY-2024 17:21:14
 
Copyright (c) 1991, 2023, Oracle.  All rights reserved.
 
Starting /opt/oracle/product/23ai/dbhomeFree//bin/tnslsnr: please wait...
 
TNSLSNR for Linux: Version 23.0.0.0.0 - Production
System parameter file is /opt/oracle/product/23ai/dbhomeFree/network/admin/listener.ora
Log messages written to /opt/oracle/diag/tnslsnr/ora23/listener/alert/log.xml
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=ora23)(PORT=1521)))
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
 
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=ora23)(PORT=1521)))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 23.0.0.0.0 - Production
Start Date                04-MAY-2024 17:21:14
Uptime                    0 days 0 hr. 0 min. 0 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Default Service           FREE
Listener Parameter File   /opt/oracle/product/23ai/dbhomeFree/network/admin/listener.ora
Listener Log File         /opt/oracle/diag/tnslsnr/ora23/listener/alert/log.xml
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=ora23)(PORT=1521)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
The listener supports no services
The command completed successfully

리스너가 기동만 되고 아직 서비스가 붙지 않은 상태임

 

 

바로 접속 시도(23ai)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ sqlplus system/oracle@FREE
 
SQL*Plus: Release 23.0.0.0.0 - Production on Sat May 4 17:22:14 2024
Version 23.4.0.24.05
 
Copyright (c) 1982, 2023, Oracle.  All rights reserved.
 
ERROR:
ORA-12514: Cannot connect to database. Service FREE is not registered with the
listener at host 192.168.137.23 port 1521.
(CONNECTION_ID=F3zP+2ZF8DTgYxeJqMCuLg==)
Help: https://docs.oracle.com/error-help/db/ora-12514/
 
 
Enter user-name: ^C

ORA-12541가 아닌 ORA-12514 에러가 발생하며 FREE service가 등록되지 않았다고 알려줌
리스너와 포트까지 알려주고 추가로 에러 메세지 설명 링크까지 제공됨

 

 

5. tnsnames.ora 파일의 SERVICE_NAME이 잘못된 경우
tnsnames.ora 파일 확인(19c)
기존 oracle19 라는 SERVICE_NAME을 oracle199로 변경

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ cat tnsnames.ora
# tnsnames.ora Network Configuration File: /ORA19/app/oracle/product/19.0.0/db_1/network/admin/tnsnames.ora
# Generated by Oracle configuration tools.
 
LISTENER_ORACLE19 =
  (ADDRESS = (PROTOCOL = TCP)(HOST = ora19)(PORT = 1521))
 
ora19a =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = ora19)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = oracle199)
    )
  )

 

 

잘못된 SERVICE_NAME을 가진 tns 접속 시도(19c)

1
2
3
4
5
6
7
8
9
10
11
12
13
$ sqlplus system/oracle@ora19a
 
SQL*Plus: Release 19.0.0.0.0 - Production on Sat May 4 17:28:54 2024
Version 19.3.0.0.0
 
Copyright (c) 1982, 2019, Oracle.  All rights reserved.
 
ERROR:
ORA-12514: TNS:listener does not currently know of service requested in connect
descriptor
 
 
Enter user-name:

ORA-12514 에러만 발생함

 

 

tnsnames.ora 파일 확인(23ai)
기존 FREE 라는 SERVICE_NAME을 FREE9로 변경

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ cat tnsnames.ora
# tnsnames.ora Network Configuration File: /opt/oracle/product/23ai/dbhomeFree/network/admin/tnsnames.ora
# Generated by Oracle configuration tools.
 
FREE =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = ora23)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = FREE9)
    )
  )
 
LISTENER_FREE =
  (ADDRESS = (PROTOCOL = TCP)(HOST = ora23)(PORT = 1521))

 

 

잘못된 SERVICE_NAME을 가진 tns 접속 시도(23ai)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ sqlplus system/oracle@FREE
 
SQL*Plus: Release 23.0.0.0.0 - Production on Sat May 4 17:29:54 2024
Version 23.4.0.24.05
 
Copyright (c) 1982, 2023, Oracle.  All rights reserved.
 
ERROR:
ORA-12514: Cannot connect to database. Service FREE9 is not registered with the
listener at host 192.168.137.23 port 1521.
(CONNECTION_ID=F3z0sHhZ8OzgYxeJqMBd0Q==)
Help: https://docs.oracle.com/error-help/db/ora-12514/
 
 
Enter user-name:

ORA-12514 에러가 발생하며 FREE9 service가 등록되지 않았다고 알려줌
리스너와 포트까지 알려주고 추가로 에러 메세지 설명 링크까지 제공됨

 

 

6. 유저이름이나 패스워드가 틀린 경우
다른 패스워드로 로그인 시도(19c)
기존 패스워드는 oracle인데 oracle1로 로그인 시도함

1
2
3
4
5
6
7
8
9
10
11
12
$ sqlplus system/oracle1@ora19a
 
SQL*Plus: Release 19.0.0.0.0 - Production on Sat May 4 17:36:22 2024
Version 19.3.0.0.0
 
Copyright (c) 1982, 2019, Oracle.  All rights reserved.
 
ERROR:
ORA-01017: invalid username/password; logon denied
 
 
Enter user-name:

ORA-01017 에러만 발생함

 

 

다른 패스워드로 로그인 시도(23ai)
기존 패스워드는 oracle인데 oracle1로 로그인 시도함

1
2
3
4
5
6
7
8
9
10
11
12
13
$ sqlplus system/oracle1@FREE
 
SQL*Plus: Release 23.0.0.0.0 - Production on Sat May 4 17:37:22 2024
Version 23.4.0.24.05
 
Copyright (c) 1982, 2023, Oracle.  All rights reserved.
 
ERROR:
ORA-01017: invalid credential or not authorized; logon denied
Help: https://docs.oracle.com/error-help/db/ora-01017/
 
 
Enter user-name:

ORA-01017 에러 메세지가 약간 바뀌었고 에러 메세지 설명 링크까지 제공됨

 

 

결론 : tns 에러 메세지가 좀더 명확해지고 힌트 및 에러코드 설명 링크까지 나오기 때문에 tns 접속 관련 문제 발생시 트러블 슈팅을 더 쉽게 할 수 있음

 

 

참조 : 

https://apex.oracle.com/pls/apex/features/r/dbfeatures/features?feature_id=1718
https://docs.oracle.com/en/database/oracle/oracle-database/23/netag/troubleshooting-oracle-net-services.html#GUID-F521AB0A-B67C-432B-B899-8F856EB51CAE
https://docs.oracle.com/en/error-help/db/ora-12154/?r=23ai
https://docs.oracle.com/en/error-help/db/ora-12545/?r=23ai
https://docs.oracle.com/en/error-help/db/ora-12541/?r=23ai
https://docs.oracle.com/en/error-help/db/ora-12514/?r=23ai
https://docs.oracle.com/en/error-help/db/ora-01017/?r=23ai