오라클에서 리스너는 DB외부 사용을 위해 필수적으로 사용해야 합니다.
이번 글에서는 리스너에 대한 정리를 해보고 몇가지 테스트도 해보았습니다.
리스너란?
외부에서 DB접속을 위해 사용되는 유틸리티입니다.
테스트가 아니라 외부접속환경을 만들기 위해서는 필수요소입니다.
매커니즘
외부에서 접속시도를 할때 어떤식으로 움직이는지 알아보겠습니다.

사용자가 접속시도 시
1. 리스너로 연결요청
2. 리스너에서 프로세스 생성 및 연결요청 상속을 서버쪽에 전달
3.서버에서 PGA에 세션이 사용할 메모리 생성
4.서버에서 사용자에게 RESEND 패킷전송
5.연결
서버와 사용자가 연결이 설정되면 리스너는 해당 세션에서의 역할은 종료됩니다.
서비스 등록방식
두가지 방식이 있습니다. 정적등록과 동적등록입니다.
정적등록은 listener.ora 파일에 SID_LIST_리스너명 섹션을 통해 수동구성합니다.
동적등록은 PMON 프로세스가 LREG 프로세스를 통해 자동으로 리스너에 서비스 정보를 등록하는 것입니다.
LISTENER.ORA 파일구성 및 파라미터
아래의 요소들로 구성됩니다.
- 리스너 이름
- 리스터가 연결요청을 수락하는 프로토콜 주소
- 리스터나 데이터베이스에 등록할 수 있도록 허용하는 유효한 노드
- 데이터베이스 서비스
- 제어를 위한 파라미터
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = dgrac)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = ORAADG)
(ORACLE_HOME = /oracle/app/oracle/product/19c)
(SID_NAME = ORAADG)
)
)
각 파라미터 설정
DESCRIPTION : 리스너 프로토콜을 포함한 listener.ora파일의 네트워크 파라미터
ADDRESS : 리스너가 사용할 프로토콜,호스트,포트 등의 정보를 지정
QUEUESIZE : 해당 리스너로 연결될 수 있는 동시 연결 요청의 수. (ex. QUERESIZE=20)
SEND_BUF_SIZE : 세션의 수신작업을 위한 버퍼공간(단위 : 바이트)
RECV_BUF_SIZE : 세션의 전송작업을 위한 버퍼공간(단위 : 바이트)
CONNECTION_RATE_리스너명 : 리스너가 매초마다 사용자가 지정한 최대 속도 제한을 부여.(ex. CONNECTION_RATE_LISTENER=10)
example
CONNECTION_RATE_LISTENER=10
LISTENER=
(ADDRESS_LIST=
(ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521)(RATE_LIMIT=yes))
(ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1522)(RATE_LIMIT=yes))
(ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1523)))
RATE_LIMIT : 특정 리스너의 속도제한이 있음을 확인. (ex.RATE_LIMIT=yes or RATE_LIMIT=5)
yes를 쓸때는 위의 CONNECTION_RATE_LISTENER 와 같이 사용하여 속도를 조절할 수 있고 RATE_LIMIT를 이용하여 각각 다르게 설정할 수 있습니다.
example
LISTENER= (ADDRESS_LIST=
(ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521)(RATE_LIMIT=5))
(ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1522)(RATE_LIMIT=10))
(ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1523))
)
SID_LIST_리스너명 : SID_LIST 뒤에 정의한 리스너명. 정적등록을 위해 등록하는 영역 SID_DESC : 접근시킬 DB가 여러개인 경우 SID_DESC를 여러개 만든다. ORACLE_HOME : 오라클 HOME경로 SID_NAME : 오라클 SID
GLOBAL_DBNAME : 데이터베이스 전역이름(optional)
그외의 제어를 위한 파라미터
ADMIN_RESTRICTIONS_리스너명 : 리스너의 런타임관리를 제한
(ADMIN_RESTRICTIONS_listener=on/off(default))
ALLOW_MULTIPLE_REDIRECTS_리스너명 : 클라이언트의 여러 리다이렉션을 가능하게 함.(ALLOW_MULTIPLE_REDIRECTS_listener=on/off(default))
ENABLE_EXADIRECT_리스너명 : exadirect 프로토콜 활성화
( ENABLE_EXADIRECT_listener=on/off(default))
CRS_NOTIFICATION_리스너명 : RAC환경에서 CRS 알림을 리스너를 관리할 수 있도록 허용.
( CRS_NOTIFICATION_listener=on(default)/off)
DEDICATED_THROUGH_BROKER_LISTENER : 연결이 요청될 때 서버가 쓰레드를 생성하거나 프로세스를 처리할 수 있도록 허용
( DEDICATED_THROUGH_BROKER_LISTENER=on/off(default))
DEFAULT_SERVICE_리스너명 : 클라이언트 측에서 서비스이름을 지정할 필요없이 연결가능
( DEFAULT_SERVICE_listener=sales.us.example.com)
INBOUND_CONNECT_TIMEOUT_리스너명 : 네트워크 연결이 설정된 후 요청완료하는데 걸리는 시간을 초단위로 지정
( INBOUND_CONNECT_TIMEOUT_listener=2 (default 60))
LOCAL_REGISTRATION_ADDRESS_리스너명 : 로컬리스너를 위한 전용 보안등록 엔드포인트 등록
(LOCAL_REGISTRATION_ADDRESS_lsnr_alias = (address=(protocol=ipc)(group=xyz)) LOCAL_REGISTRATION_ADDRESS_lsnr_alias =ON /OFFdefault)
MAX_ALL_CONNECTIONS_리스너명 : 리스너의 최대 동시등록 및 클라이언트 연결 세션 수 지정
( MAX_ALL_CONNECTIONS_listener=4096)
MAX_REG_CONNECTIONS_리스너명 : 최대 동시 등록 연결 세션 수 지정
( MAX_REG_CONNECTIONS_listener=2048 (512 default))
REGISTRATION_EXCLUDED_NODES_리스너명 : 제외할 노드목록 지정
(REGISTRATION_EXCLUDED_NODES_listener = (10.1.26.*, 10.16.40.0/24, \
2001:DB8:3eff:fe38, node2))
REGISTRATION_INVITED_NODES_리스너명 : 허용할 노드목록 지정
(REGISTRATION_INVITED_NODES_listener = (10.1.35.*, 10.1.34.0/24, \
2001:DB8:fe38:7303, node1))
REMOTE_REGISTRATION_ADDRESS_리스너명 : SCAN 리스너를 위한 전용 보안등록 엔드포인트 등록
( REMOTE_REGISTRATION_ADDRESS_listener=off)
SAVE_CONFIG_ON_STOP_리스너명 : 런타임 구성변경이 listener.ora파일에 저장되는지 여부
( SAVE_CONFIG_ON_STOP_listener=true/false(default))
SERVICE_RATE_리스너명 : 인스턴스에 대해 서비스 당 허용되는 연결 속도 지정
( SERVICE_RATE=10 (default 0))
SSL_CIPHER_SUITES : TLS(Transport Layer Security)에서 사용하는 인증,암호화 및 데이터 무결성 알고리즘 조합을 제어
(SSL_CIPHER_SUITES=(TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256))
SSL_CLIENT_AUTHENTICATION : 클라이언트가 TLS를 사용하여 인증되는지 여부를 체크
( SSL_CLIENT_AUTHENTICATION=true(default)/false)
SSL_DISABLE_WEAK_EC_CURVES : Elliptic Curve Cyptography사용을 비활성화/활성화
(tnsnames.ora에서 net_service_name=
(DESCRIPTION=
(ADDRESS=(PROTOCOL=tcps)(HOST=sales-svr)(PORT=1521))
(SECURITY=(SSL_DISABLE_WEAK_EC_CURVES=TRUE))
) or sqlnet.ora에서
SSL_DISABLE_WEAK_EC_CURVES=TRUE/FALSE(default))
SSL_VERSION : 유효한 TLS 버전 정의
(SSL_VERSION=1.0 or 1.1 or 1.2)
SUBSCRIBE_FOR_NODE_DOWN_EVENT_리스너명 : 다운된 이벤트에 대한 오라클 알림서비스 사용 여부
( SUBSCRIBE_FOR_NODE_DOWN_EVENT_listener=on(default)/off)
USE_SID_AS_SERVICE_리스너명 : 연결할 때 SID를 서비스이름으로 해석하게 해줌.
( USE_SID_AS_SERVICE_listener=on/off(default))
VALID_NODE_CHECKING_REGISTRATION_리스너명 :노드검사등록이 수행되었는지 또는 서브넷이 허용되었는지 체크
(VALID_NODE_CHECKING_REGISTRATION_listener=on(default)/off)
WALLET_LOCATION : Oracle Wallet의 위치를 설정(WALLET_LOCATION=
(SOURCE=
(METHOD=file)
(METHOD_DATA=
(DIRECTORY=/etc/oracle/wallets/databases))))
sqlnet.ora 관련 파라미터
sqlnet.ora 파일은 다음작업을 수행할 수 있습니다.
- 자격이 없는 이름에 추가할 클라이언트 도메인지정
- 명명 방법의 우선순위 지정
- 로깅 및 추적기능 활성화
- 특정 프로세스를 통해 연결 경로 지정
- 외부 명명을 위한 파라미터 설정
- 고급 보안구성
- 프로토콜별 파라미터를 사용하여 DB 접근 제한
즉 보안을 위해서 설정하는 부분이 많습니다.
이부분은 파라미터만 간단히 정리하고 default 값 을 뒤에 적어놓고 주로쓴다고 생각되는 부분만 설명해보도록 하겠습니다.
ACCEPT_MD5_CERTS = FALSE
ACCEPT_SHA1_CERTS = TRUE
ADD_SSLV3_TO_DEFAULT = FALSE
BEQUEATH_DETACH = NO
DEFAULT_SDU_SIZE = 8192
DISABLE_INTERRUPT = FALSE
DISABLE_OOB=OFF
DISABLE_OOB_AUTO = FALSE
EXADIRECT_FLOW_CONTROL=OFF
EXADIRECT_RECVPOLL = 0
ipc.keypath= /var/tmp/.oracle
- 도메인 소켓의 내부파일이 생성되는 대상 디렉토리를 지정
NAMES.DEFAULT_DOMAIN=NONE
- 이 파라미터 설정시 기본 도메인이 자동으로 추가됩니다 .예를들어 us.example.com 라고 되어 있으면, 기본 도메인이 scott@sales 가 sales.us.example.com로 자동검색 됩니다.
NAMES.DIRECTORY_PATH=(tnsnames, ezconnect, ldap)
- 이 파라미터 설정시 클라이언트 이름 확인검색을 순서를 지정합니다.
- tnsnames(로컬명명방법) : 클라이언트의 tnsnames.ora파일을 통해 네트워크 서비스 이름을 확인
- ldap(디렉토리명명방법) : 디렉토리 서버를 통해 데이터베이스서비스이름,네트워크 서비스 이름등을 확인
- ezconnect or hostname : 클라이언트가 호스트이름과 선택적 포트 및 서비스이름으로 구성된 TCP/IP연결 식별자를 사용하기
- nis(외부명명방법) : 기존네트워크 정보서비스(NIS)를 통해 서비스정보 확인
NAMES.LDAP_AUTHENTICATE_BIND=FALSE
names.ldap_conn_timeout = 15
NAMES.LDAP_PERSISTENT_SESSION=FALSE
NAMES.NIS.META_MAP=sqlnet.maps
OCI_COMPARTMENT
- 클라이언트 연결을 위한 OCI의 정보를 입력합니다.
OCI_IAM_URL
OCI_DATABASE
OCI_TENANCY
tnsnames.ora
net_service_name=
(DESCRIPTION=
(ADDRESS=(PROTOCOL=tcps)(HOST=salesserver1)(PORT=1522))
(SECURITY=
(SSL_SERVER_DN_MATCH=TRUE)
(SSL_SERVER_CERT_DN="C=US,O=example,CN=OracleContext")
(PASSWORD_AUTH=OCI_TOKEN)
(OCI_IAM_URL=https://auth.us-region-1.example.com/v1/actions/generateScopedAccessBearerToken)
(OCI_TENANCY=ocid1.tenancy..12345)
(OCI_COMPARTMENT=ocid1.compartment..12345)
(OCI_DATABASE=ocid1.autonomousdatabase.oc1.12345))
(CONNECT_DATA=(SERVICE_NAME=sales.us.example.com))
)
sqlnet.ora
SSL_SERVER_DN_MATCH=TRUE
PASSWORD_AUTH=OCI_TOKEN
OCI_IAM_URL=https://auth.us-region-1.example.com/v1/actions/generateScopedAccessBearerToken
OCI_TENANCY=ocid1.tenancy..12345
OCI_COMPARTMENT=ocid1.compartment..12345
OCI_DATABASE=ocid1.autonomousdatabase.oc1.12345
PASSWORD_AUTH=PASSWORD_VERIFIER/TOKEN
- 두가지 옵션이 있고, OCI 환경에서 액세스관리 사용자에대한 인증방법설정
RECV_BUF_SIZE=11784
SDP.PF_INET_SDP=27
SEC_USER_UNAUTHORIZED_ACCESS_BANNER=/opt/oracle/admin/data/unauthwarning.txt
SEND_BUF_SIZE=11784
SQLNET.ALLOW_WEAK_CRYPTO = TRUE
- 클라이언트측의 지정된 암호화 및 암호화 체크섬 알고리즘 사용
SQLNET.ALLOW_WEAK_CRYPTO_CLIENTS = TRUE
- 서버측의 지정된 암호화 및 암호화 체크섬 알고리즘 사용
SQLNET.ALLOWED_LOGON_VERSION_CLIENT=11
- 많이 설정하는 부분임
- 클라이언트가 사용하는 최소 인증 프로토콜
SQLNET.ALLOWED_LOGON_VERSION_SERVER=12
- Oracle DB 서버가 사용하는 최소 인증 프로토콜
- 아래 에러와 연관
- ORA-28040: No matching authentication protocol
- ORA-03134: Connections to this server version are no longer supported
SQLNET.AUTHENTICATION_SERVICES=TCPS/ALL/BEQ/KERBEROS5/RADUIS
SQLNET.CLIENT_REGISTRATION=NONE
- 클라이언트측의 고유식별자 설정
SQLNET.CLOUD_USER = NONE
SQLNET.COMPRESSION=OFF
- LOB과 Data Guard streaming redo를 제외한 모든 연결에 적용
SQLNET.COMPRESSION_ACCELERATION=ON
- 사용가능한경우 하드웨어 가속 압축버전의 사용을 지정
SQLNET.COMPRESSION_LEVELS=(low)/(high)
- low는 낮은 압축률,낮은 CPU 사용률 high는 높은 cpu 사용률 높은 압축률
SQLNET.COMPRESSION_THRESHOLD=1024
- 압축시 필요한 최소 데이터 사이즈
SQLNET.CRYPTO_CHECKSUM_CLIENT=accepted
SQLNET.CRYPTO_CHECKSUM_SERVER=accepted
SQLNET.CRYPTO_CHECKSUM_TYPES_CLIENT=(SHA256, MD5)
SQLNET.CRYPTO_CHECKSUM_TYPES_SERVER=(SHA256, MD5)
SQLNET.DBFW_PUBLIC_KEY=NONE
SQLNET.DOWN_HOSTS_TIMEOUT=600
SQLNET.ENCRYPTION_CLIENT=accepted
SQLNET.ENCRYPTION_SERVER=accepted
SQLNET.ENCRYPTION_TYPES_CLIENT=(rc4_56)
SQLNET.ENCRYPTION_TYPES_SERVER=(rc4_56, des, ...)
SQLNET.EXPIRE_TIME=0
- 클라이언트와 서버연결이 활성화된 시간을 지정 (추천값 10)
SQLNET.IGNORE_ANO_ENCRYPTION_FOR_TCPS=FALSE
SQLNET.INBOUND_CONNECT_TIMEOUT=60
- 많이 사용하는 파라미터
- 클라이언트가 서버에 연결하고 필요한 인증정보를 제공하는데 걸리는 시간(ms,sec,min 단위로 지정 ex.10ms)
- ORA-12170: TNS:Connect timeout occurred, ORA-12547: TNS:lost contact, ORA-12637: Packet receive failed
- INBOUND_CONNECT_TIMEOUT_리스너명으로 직접 listener.ora파일에 적을 수도 있음
SQLNET.FALLBACK_AUTHENTICATION=FALSE
SQLNET.KERBEROS5_CLOCKSKEW=300
SQLNET.KERBEROS5_CONF=/krb5/krb.conf
SQLNET.KERBEROS5_CONF_LOCATION=/krb5
SQLNET.KERBEROS5_KEYTAB=/etc/v5srvtab
SQLNET.KERBEROS5_REALMS=/krb5/krb.realms
SQLNET_KERBEROS5_REPLAY_CACHE=OS_MEMORY
SQLNET.OUTBOUND_CONNECT_TIMEOUT=NONE
- 많이 사용하는 파라미터
- 클라이언트가 서버에 연결을 설정해야 하는 시간 (ms,sec,min 단위로 지정 ex.10ms)
- ORA-12170: TNS:Connect timeout occurred 와 관련있음
SQLNET.RA SQLNET.RADIUS_ALTERNATE_PORT=1667
SQLNET.RADIUS_ALTERNATE_PORT=1645
SQLNET.RADIUS_ALTERNATE_RETRIES=3
SQLNET.RADIUS_ALTERNATE_TIMEOUT=5
SQLNET.RADIUS_AUTHENETICATION=officeacct
SQLNET.RADIUS_AUTHENTICATION_INTERFACE=DefaultRadiusInterface
SQLNET.RADIUS_AUTHENTICATION_PORT=1645
SQLNET.RADIUS_AUTHENTICATION_RETRIES=3
SQLNET.RADIUS_AUTHENTICATION_TIMEOUT=5
SQLNET.RADIUS_CHALLENGE_KEYWORD=challenge
SQLNET.RADIUS_CHALLENGE_RESPONSE=off/on
SQLNET.RADIUS_CLASSPATH=/jre1.1
SQLNET.RADIUS_SECRET= ORACLE_HOME/network/security/radius.key
SQLNET.RADIUS_SEND_ACCOUNTING=off/on
SQLNET.RECV_TIMEOUT=11 ms
- 연결 설정 후 클라이언트로부터 데이터를 기다리는 시간
- ORA-12535: TNS:operation timed out, ORA-12609: TNS: Receive timeout occurred messages 와 관련
SQLNET.SEND_TIMEOUT=1 ms
- 연결설정 후 클라이언트에 전송작업을 완료하는데 기다리는 시간
sqlnet.uri=" /sqlnet "
SQLNET.USE_HTTPS_PROXY=on
SQLNET.WALLET_OVERRIDE=true
SSL_CERT_REVOCATION=NONE
SSL_CRL_FILE=NONE
SSL_CRL_PATH=NONE
SSL_CIPHER_SUITES=NONE
SSL_CLIENT_AUTHENTICATION=TRUE
SSL_DISABLE_WEAK_EC_CURVES=FALSE/TRUE
SSL_EXTENDED_KEY_USAGE="client authentication"
SSL_SERVER_DN_MATCH=NO/YES
SSL_VERSION=1.1 or 1.2
TCP.CONNECT_TIMEOUT=60
- ORA-12170: TNS:Connect timeout occurred 와 관련
TCP.EXCLUDED_NODES=(finance.us.example.com, mktg.us.example.com, 192.0.2.25, 172.30.*, 2001:DB8:200C:417A/32)
- 허용되지 않는 클라이언트 설정
TCP.INVITED_NODES=(sales.us.example.com, hr.us.example.com, 192.0.*, 2001:DB8:200C:433B/32)
- 허용되는 클라이언트 설정
TCP.NODELAY=yes
TCP.QUEUESIZE=100
TCP.VALIDNODE_CHECKING=no/yes
- 위의 EXCLUDED_NODES와 INVITED_NODES를 사용하기 위해서 yes로 설정되어 있어야함
TNSPING.TRACE_DIRECTORY= ORACLE_HOME/network/trace
TNSPING.TRACE_LEVEL=off/user/admin/support
TOKEN_AUTH=OAUTH
TOKEN_LOCATION="/home/dbuser1/access-token/mytoken"
USE_CMAN=FALSE
USE_DEDICATED_SERVER=OFF
WALLET_LOCATION= (SOURCE= (METHOD=entr) (METHOD_DATA= (PROFILE=/etc/oracle/wallets/example.epf)
(INIFILE=/etc/oracle/wallets/example.ini)))
아래는 ADR 진단용 파라미터입니다.
- ADR을 활성화하면 sqlnet.ora파일의 non-ADR파라미터를 무시합니다.
ADR_BASE=/oracle/network/trace
DIAG_ADR_ENABLED=on
TRACE_LEVEL_CLIENT=OFF/USER/ADMIN/SUPPORT
TRACE_LEVEL_SERVER= OFF/USER/ADMIN/SUPPORT
TRACE_TIMESTAMP_CLIENT=TRUE/FALSE
TRACE_TIMESTAMP_SERVER=TRUE/FALSE
아래는 non-ADR파라미터입니다.
LOG_DIRECTORY_CLIENT= $ORACLE_HOME/network/log
LOG_DIRECTORY_SERVER= $ORACLE_HOME/network/trace
LOG_FILE_CLIENT = $ORACLE_HOME/network/log/sqlnet.log
LOG_FILE_SERVER= sqlnet.log
TRACE_DIRECTORY_CLIENT= $ORACLE_HOME/network/trace
TRACE_DIRECTORY_SERVER=$ORACLE_HOME/network/trace
TRACE_FILE_CLIENT= $ORACLE_HOME/network/trace/cli.trc
TRACE_FILE_SERVER= $ORACLE_HOME/network/trace/svr_pid.trc
TRACE_FILEAGE_CLIENT=60
TRACE_FILEAGE_SERVER=60
TRACE_FILELEN_CLIENT=100
TRACE_FILELEN_SERVER=100
TRACE_FILENO_CLIENT=NONE
TRACE_FILENO_SERVER=NONE
TRACE_UNIQUE_CLIENT=on
tnsnames.ora 관련 파라미터
접속하고자 하는 서버의 정보를 입력하여 데이터베이스 서버접속을 위해서 사용합니다.
LISTENER_ORAADG =
(ADDRESS = (PROTOCOL = TCP)(HOST = dgrac)(PORT = 1521))
LSNR2_ORAADG =
(ADDRESS = (PROTOCOL = TCP)(HOST = dgrac)(PORT = 15212))
ORAADG =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = dgrac)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = ORAADG)
)
)
##1
net_service_name=
(DESCRIPTION_LIST=
(DESCRIPTION=
(ADDRESS=(PROTOCOL=tcp)(HOST=sales1-svr)(PORT=1521))
(ADDRESS=(PROTOCOL=tcp)(HOST=sales2-svr)(PORT=1521))
(CONNECT_DATA=
(SERVICE_NAME=sales.us.example.com)))
(DESCRIPTION=
(ADDRESS=(PROTOCOL=tcp)(HOST=hr1-svr)(PORT=1521))
(ADDRESS=(PROTOCOL=tcp)(HOST=hr2-svr)(PORT=1521))
(CONNECT_DATA=
(SERVICE_NAME=hr.us.example.com))))
##2
sample2=
(DESCRIPTION=
(LOAD_BALANCE=on) # 1
(FAILOVER=on)
(ADDRESS_LIST=
(SOURCE_ROUTE=yes)
(ADDRESS=(PROTOCOL=tcp)(HOST=host1)(PORT=1630)) # 2
(ADDRESS=(PROTOCOL=tcp)(HOST=host2)(PORT=1521)))
(ADDRESS_LIST=
(SOURCE_ROUTE=yes)
(ADDRESS=(PROTOCOL=tcp)(HOST=host3)(port=1630))
(ADDRESS=(PROTOCOL=tcp)(HOST=host4)(port=1521)))
(CONNECT_DATA=(SERVICE_NAME=sales.us.example.com))) # 3
테스트DB에 설정된 부분이고 파라미터들을 정리해보도록 하겠습니다.
DESCRIPTION_LIST부분
DESCRIPTION : 특정 넷 서비스이름에 대한 설명을 정의하고 있습니다.
DESCRIPTION_LIST : 특정 넷 서비스이름에 대한 설명을 정의하고 있습니다. (DESCRIPTION_LIST 안에 여러 DESCRIPTION이 올 수 있습니다.)
ADDRESS : 접속하고자 하는 DB의 정보(프로토콜,호스트,포트)의 정보를 정의합니다.
ADDRESS_LIST : 접속하고자 하는 DB의 정보(프로토콜,호스트,포트)의 정보를 정의합니다. (ADDRESS_LIST 안에 여러 ADDRESS가 올 수 있습니다.)
HTTPS_PROXY=www-proxy.example.com
HTTPS_PROXY_PORT=80
DESCRIPTION의 Optional 파라미터
ENABLE = broken
- 지원되는 TCP전송에서 킵얼라이브 기능을 활성화
FAILOVER=on/off
- 여러 프로토콜 주소에 대한 연결시간 failover기능을 활성화
LOAD_BALANCE=on/off
- 여러 프로토콜 주소에 대한 클라이언트 로드밸런싱을 활성화
RECV_BUF_SIZE = n
- 수신작업을 위한 버퍼 공간 지정
SDU=n
- 네트워크 데이터 패킷의 크기 지정
SEND_BUF_SIZE=n
- 전송작업을 위한 버퍼 공간 지정
SOURCE_ROUTE=on/off
- 여러프로토콜 주소를 통해 라우팅 할 수 있음
TYPE_OF_SERVICE=rdb_database
- Oracle RDB DB에 사용할 서비스 유형 지정
CONNECT_DATA부분
CONNECT_DATA : 접속 서비스를 정의
COLOCATION_TAG=abc
- colocation_tag가 동일한 데이터베이스 인스턴스로 접속
FAILOVER_MODE
- 첫번째 리스너가 실패할겨우 다른리스너로 fail over
GLOBAL_NAME=alpha5
- Oracle RDB DB에서 사용
HS=ok
- Non-Oracle 시스템에 접속하기 위해서 사용
INSTANCE_NAME=sales1
- 접속하려는 인스턴스이름
KERBEROS5_PRINCIPAL
KERBEROS5_CC_NAME
RDB_DATABASE
SHARDING_KEY
SUPER_SHARDING_KEY
SERVER=dedicated
- 클라이언트 유형(dedicated/shared/ pooled ) 설정
SERVICE_NAME=sales.us.example.com
-DB접속을 위한 서비스이름 설정
SECUTIRY부분
AUTHENTICATION_SERVICE = (ALL/BEQ/KERBEROS5/RADIUS/TCPS)
IGNORE_ANO_ENCRYPTION_FOR_TCPS=TRUE
KERBEROS5_CC_NAME=/tmp/kcache
OCI_COMPARTMENT
OCI_DATABASE
OCI_TENANCY
PASSWORD_AUTH
SSL_DISABLE_WEAK_EC_CURVES
SSL_SERVER_CERT_DN
SL_SERVER_DN_MATCH
SSL_VERSION
TOKEN_AUTH
TOKEN_LOCATION
WALLET_LOCATION
TIMEOUT 부분
CONNECT_TIMEOUT=10 ms
- 클라이언트가 DB에 연결을 설정해야 하는 시간(ms,sec,min)지정
RETRY_COUNT=3
- 연결시도를 종료하기 전에 다시 시도할 횟수
RETRY_DELAY=2
- 연결 재시도 사이의 대기 시간(초)
TRANSPORT_CONNECT_TIMEOUT=10 ms
- 전송연결 타임아웃 시간(ms,sec,min)지정
RECV_TIMEOUT=10 ms
- 데이터를 대기하는 시간
COMPRESSION 부분
COMPRESSION=on
- 압축여부 설정
COMPRESSION_LEVELS=(LEVEL=low)
- 압축률(low,high) 설정
테스트 시나리오 1
sqlnet.ora에 TCP.EXCLUDED_NODES 설정을 통해 특정 IP 접속 차단하기
1.기존 클라이언트 쪽에서 접속을 시도해서 잘되는 것을 확인합니다.
$ sqlplus system@192.168.75.121:1521/ORAADG
SQL*Plus: Release 19.0.0.0.0 - Production on Thu May 8 13:18:36 2025
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
Enter password:
Last Successful login time: Thu May 08 2025 13:14:06 +09:00
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
SQL> exit
2.
서버측 sqlnet.ora에 아래 정보 추가합니다
해당 IP는 클라이언트의 IP입니다.
TCP.VALIDNODE_CHECKING =YES
TCP.EXCLUDED_NODES = (192.168.75.229, 192.168.75.129)
설정 후 리스너 reload
$lsnrctl reload
3.클라이언트에서 다시 접속 시도
$ sqlplus system@192.168.75.121:1521/ORAADG
SQL*Plus: Release 19.0.0.0.0 - Production on Thu May 8 13:18:49 2025
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
Enter password:
ERROR:
ORA-12547: TNS:lost contact
에러 발생
끝.
테스트 시나리오 2
listener.ora에 Inbound_connect_timeout_listener 설정을 통해 지연발생 후 에러 확인
sqlnet.ora에 Inbound_connect_timeout 설정 추가 후 에러 확인
1.서버쪽 listener.ora에 내용 추가
INBOUND_CONNECT_TIMEOUT_LISTENER=30
리스너 reload
$lsnrctl reload
2.클라이언트 측에 잘못된 비밀번호 입력후 30초 대기
$ sqlplus system/oradata@192.168.75.121:1521/ORAADG
SQL*Plus: Release 19.0.0.0.0 - Production on Thu May 8 14:34:47 2025
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
ERROR:
ORA-01017: 사용자명/비밀번호가 부적합, 로그온할 수 없습니다.
Enter user-name:
---30초간 대기
3.서버측 리스너로그 확인
에러 발생
</msg>
<msg time='2025-05-08T14:36:40.145+09:00' org_id='oracle' comp_id='rdbms'
type='UNKNOWN' level='16' host_id='dgrac'
host_addr='192.168.75.121' pid='15844'>
<txt>WARNING: inbound connection timed out (ORA-3136)
</txt>
</msg>
4.서버쪽 설정한 listener.ora 주석처리후 다시 reload
#INBOUND_CONNECT_TIMEOUT_LISTENER=30
$lsnrctl reload
5.클라이언트 쪽 sqlnet.ora에 내용 추가
SQLNET.INBOUND_CONNECT_TIMEOUT=30
6.잘못된 패스워드 설정 후 대기
$ sqlplus system/oradata@192.168.75.121:1521/ORAADG
SQL*Plus: Release 19.0.0.0.0 - Production on Thu May 8 14:34:47 2025
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
ERROR:
ORA-01017: 사용자명/비밀번호가 부적합, 로그온할 수 없습니다.
Enter user-name:
---30초간 대기
7.에러발생
</msg>
<msg time='2025-05-08T14:49:38.145+09:00' org_id='oracle' comp_id='rdbms'
type='UNKNOWN' level='16' host_id='dgrac'
host_addr='192.168.75.121' pid='15844'>
<txt>WARNING: inbound connection timed out (ORA-3136)
</txt>
</msg>
끝.
테스트 시나리오 3
정적등록 / 동적등록 해보기새로운 리스너를 생성 후 해당 리스너를 정적등록/동적등록 해보기.
동적등록1.현재 상태 확인아래부분에 UNKNOWN과 READY가 있음. READY는 동적등록,UNKNOWN은 정적등록한 상태임.
lsnrctl status
LSNRCTL for Linux: Version 19.0.0.0.0 - Production on 08-5월 -2025 15:02:09
Copyright (c) 1991, 2019, Oracle. All rights reserved.
(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=dgrac)(PORT=1521)))에 연결되었습니다
리스너의 상태
------------------------
별칭 LISTENER
버전 TNSLSNR for Linux: Version 19.0.0.0.0 - Production
시작 날짜 08-5월 -2025 13:12:14
업타임 0 일 1 시간. 49 분. 55 초
트레이스 수준 off
보안 ON: Local OS Authentication
SNMP OFF리스너 매개변수 파일 /oracle/app/oracle/product/19c/network/admin/listener.ora
리스너 로그 파일 /oracle/app/oracle/diag/tnslsnr/dgrac/listener/alert/log.xml
끝점 요약 청취 중...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=dgrac)(PORT=1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
서비스 요약...
"ORAADG" 서비스는 2개의 인스턴스를 가집니다.
"ORAADG" 인스턴스(UNKNOWN 상태)는 이 서비스에 대해 1 처리기를 가집니다.
"ORAADG" 인스턴스(READY 상태)는 이 서비스에 대해 1 처리기를 가집니다.
"ORAADGXDB" 서비스는 1개의 인스턴스를 가집니다.
"ORAADG" 인스턴스(READY 상태)는 이 서비스에 대해 1 처리기를 가집니다.
"ORAADG_CFG" 서비스는 1개의 인스턴스를 가집니다.
"ORAADG" 인스턴스(READY 상태)는 이 서비스에 대해 1 처리기를 가집니다.
명령이 성공적으로 수행되었습니다
2.listener.ora에 새로운 리스너정보 추가
LSNR2 =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = dgrac)(PORT = 15212))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC15212))
)
)
3.새로운 리스너 기동 후 확인
기동은 되었지만 아래부분에 서비스가 아무것도 조회되지 않습니다.
lsnrctl start LSNR2
LSNRCTL for Linux: Version 19.0.0.0.0 - Production on 08-5월 -2025 15:12:04
Copyright (c) 1991, 2019, Oracle. All rights reserved.
시작 /oracle/app/oracle/product/19c/bin/tnslsnr: 잠시만 기다리세요...
TNSLSNR for Linux: Version 19.0.0.0.0 - Production
시스템 매개변수 파일은 /oracle/app/oracle/product/19c/network/admin/listener.ora 입니다
/oracle/app/oracle/diag/tnslsnr/dgrac/lsnr2/alert/log.xml (으)로 로그 메시지를 기록했습니다
리스닝이: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=dgrac)(PORT=15212)))
리스닝이: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC15212)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=dgrac)(PORT=15212)))에 연결되었습니다
리스너의 상태
------------------------
별칭 LSNR2
버전 TNSLSNR for Linux: Version 19.0.0.0.0 - Production
시작 날짜 08-5월 -2025 15:12:04
업타임 0 일 0 시간. 0 분. 0 초
트레이스 수준 off
보안 ON: Local OS Authentication
SNMP OFF리스너 매개변수 파일 /oracle/app/oracle/product/19c/network/admin/listener.ora
리스너 로그 파일 /oracle/app/oracle/diag/tnslsnr/dgrac/lsnr2/alert/log.xml
끝점 요약 청취 중...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=dgrac)(PORT=15212)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC15212)))
리스너는 서비스를 지원하지 않습니다
명령이 성공적으로 수행되었습니다
4.tnsnames.ora 파일에 local listener 파라미터 설정을 위해 추가
LSNR2_ORAADG =
(ADDRESS = (PROTOCOL = TCP)(HOST = dgrac)(PORT = 15212))
5.sqlplus 접속 후 local_listener 파라미터 설정 변경
SQL> alter system set local_listener=LSNR2_ORAADG;
시스템이 변경되었습니다.
SQL> show parameter local_listener
NAME TYPE
------------------------------------ ---------------------------------
VALUE
------------------------------
local_listener string
LSNR2_ORAADG
SQL> alter system register;
시스템이 변경되었습니다.
6.lsnrctl status로 상태확인
변경 후 확인해보니 LSNR2쪽으로 READY상태인 서비스들이 보입니다.
--기본리스너
$lsnrctl status
LSNRCTL for Linux: Version 19.0.0.0.0 - Production on 08-5월 -2025 15:16:34
Copyright (c) 1991, 2019, Oracle. All rights reserved.
(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=dgrac)(PORT=1521)))에 연결되었습니다
리스너의 상태
------------------------
별칭 LISTENER
버전 TNSLSNR for Linux: Version 19.0.0.0.0 - Production
시작 날짜 08-5월 -2025 15:11:41
업타임 0 일 0 시간. 4 분. 53 초
트레이스 수준 off
보안 ON: Local OS Authentication
SNMP OFF리스너 매개변수 파일 /oracle/app/oracle/product/19c/network/admin/listener.ora
리스너 로그 파일 /oracle/app/oracle/diag/tnslsnr/dgrac/listener/alert/log.xml
끝점 요약 청취 중...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=dgrac)(PORT=1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
서비스 요약...
"ORAADG" 서비스는 1개의 인스턴스를 가집니다.
"ORAADG" 인스턴스(UNKNOWN 상태)는 이 서비스에 대해 1 처리기를 가집니다.
명령이 성공적으로 수행되었습니다
--새로 추가한 리스너
$ lsnrctl status LSNR2
LSNRCTL for Linux: Version 19.0.0.0.0 - Production on 08-5월 -2025 15:16:39
Copyright (c) 1991, 2019, Oracle. All rights reserved.
(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=dgrac)(PORT=15212)))에 연결되었습니다
리스너의 상태
------------------------
별칭 LSNR2
버전 TNSLSNR for Linux: Version 19.0.0.0.0 - Production
시작 날짜 08-5월 -2025 15:12:04
업타임 0 일 0 시간. 4 분. 35 초
트레이스 수준 off
보안 ON: Local OS Authentication
SNMP OFF리스너 매개변수 파일 /oracle/app/oracle/product/19c/network/admin/listener.ora
리스너 로그 파일 /oracle/app/oracle/diag/tnslsnr/dgrac/lsnr2/alert/log.xml
끝점 요약 청취 중...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=dgrac)(PORT=15212)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC15212)))
서비스 요약...
"ORAADG" 서비스는 1개의 인스턴스를 가집니다.
"ORAADG" 인스턴스(READY 상태)는 이 서비스에 대해 1 처리기를 가집니다.
"ORAADGXDB" 서비스는 1개의 인스턴스를 가집니다.
"ORAADG" 인스턴스(READY 상태)는 이 서비스에 대해 1 처리기를 가집니다.
"ORAADG_CFG" 서비스는 1개의 인스턴스를 가집니다.
"ORAADG" 인스턴스(READY 상태)는 이 서비스에 대해 1 처리기를 가집니다.
명령이 성공적으로 수행되었습니다
7.클라이언트에서 접속 확인
]$ sqlplus system@LSNR2_ORAADG
SQL*Plus: Release 19.0.0.0.0 - Production on Thu May 8 15:18:35 2025
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
Enter password:
Last Successful login time: Thu May 08 2025 14:29:29 +09:00
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
SQL> exit
8.local_listener파라미터 원복후 리스너 상태 다시 확인
SQL> alter system set local_listener=LISTENER_ORAADG;
시스템이 변경되었습니다.
SQL> show parameter local_listener;
NAME TYPE
------------------------------------ ---------------------------------
VALUE
------------------------------
local_listener string
LISTENER_ORAADG
SQL> alter system register;
시스템이 변경되었습니다.
READY상태인 서비스들이 보이지 않고 있습니다.
$ lsnrctl service LSNR2
LSNRCTL for Linux: Version 19.0.0.0.0 - Production on 08-5월 -2025 15:28:45
Copyright (c) 1991, 2019, Oracle. All rights reserved.
(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=dgrac)(PORT=15212)))에 연결되었습니다
리스너는 서비스를 지원하지 않습니다
명령이 성공적으로 수행되었습니다
원래 리스너확인
local_listener파라미터를 변경했을때 안보였던 READY 상태인 서비스들이 다시 보입니다.
]$ lsnrctl status LISTENER
LSNRCTL for Linux: Version 19.0.0.0.0 - Production on 08-5월 -2025 15:28:58
Copyright (c) 1991, 2019, Oracle. All rights reserved.
(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=dgrac)(PORT=1521)))에 연결되었습니다
리스너의 상태
------------------------
별칭 LISTENER
버전 TNSLSNR for Linux: Version 19.0.0.0.0 - Production
시작 날짜 08-5월 -2025 15:11:41
업타임 0 일 0 시간. 17 분. 17 초
트레이스 수준 off
보안 ON: Local OS Authentication
SNMP OFF리스너 매개변수 파일 /oracle/app/oracle/product/19c/network/admin/listener.ora
리스너 로그 파일 /oracle/app/oracle/diag/tnslsnr/dgrac/listener/alert/log.xml
끝점 요약 청취 중...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=dgrac)(PORT=1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
서비스 요약...
"ORAADG" 서비스는 2개의 인스턴스를 가집니다.
"ORAADG" 인스턴스(UNKNOWN 상태)는 이 서비스에 대해 1 처리기를 가집니다.
"ORAADG" 인스턴스(READY 상태)는 이 서비스에 대해 1 처리기를 가집니다.
"ORAADGXDB" 서비스는 1개의 인스턴스를 가집니다.
"ORAADG" 인스턴스(READY 상태)는 이 서비스에 대해 1 처리기를 가집니다.
"ORAADG_CFG" 서비스는 1개의 인스턴스를 가집니다.
"ORAADG" 인스턴스(READY 상태)는 이 서비스에 대해 1 처리기를 가집니다.
명령이 성공적으로 수행되었습니다
새로운 리스너로 클라이언트에서 접속시도
에러발생합니다. 리스너가 가지고 있는 서비스가 없기 때문입니다.
$ sqlplus system@LSNR2_ORAADG
SQL*Plus: Release 19.0.0.0.0 - Production on Thu May 8 15:29:49 2025
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
Enter password:
ERROR:
ORA-12514: TNS:listener does not currently know of service requested in connect
Descriptor
9.새로운 리스너를 정적등록 후 상태확인 및 접속테스트
listener.ora에 새로운 리스너용 SID_LIST 를 추가해줍니다.
SID_LIST_LSNR2 =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = ORAADG)
(ORACLE_HOME = /oracle/app/oracle/product/19c)
(SID_NAME = ORAADG)
)
)
리스너재기동
$lsnrctl reload
10.상태 확인 및 접속 테스트
UNKNOWN 상태의 서비스가 생겼습니다.
$ lsnrctl status LSNR2
LSNRCTL for Linux: Version 19.0.0.0.0 - Production on 08-5월 -2025 15:35:49
Copyright (c) 1991, 2019, Oracle. All rights reserved.
(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=dgrac)(PORT=15212)))에 연결되었습니다
리스너의 상태
------------------------
별칭 LSNR2
버전 TNSLSNR for Linux: Version 19.0.0.0.0 - Production
시작 날짜 08-5월 -2025 15:12:04
업타임 0 일 0 시간. 23 분. 44 초
트레이스 수준 off
보안 ON: Local OS Authentication
SNMP OFF리스너 매개변수 파일 /oracle/app/oracle/product/19c/network/admin/listener.ora
리스너 로그 파일 /oracle/app/oracle/diag/tnslsnr/dgrac/lsnr2/alert/log.xml
끝점 요약 청취 중...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=dgrac)(PORT=15212)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC15212)))
서비스 요약...
"ORAADG" 서비스는 1개의 인스턴스를 가집니다.
"ORAADG" 인스턴스(UNKNOWN 상태)는 이 서비스에 대해 1 처리기를 가집니다.
명령이 성공적으로 수행되었습니다
접속까지 잘 되는것을 확인하였습니다.
$ sqlplus system@LSNR2_ORAADG
SQL*Plus: Release 19.0.0.0.0 - Production on Thu May 8 15:36:11 2025
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
Enter password:
Last Successful login time: Thu May 08 2025 15:30:17 +09:00
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
끝.
'Oracle > 운영' 카테고리의 다른 글
Online DDL(add column default + not null) 시나리오 (0) | 2025.05.14 |
---|---|
[PL/SQL] 동적 SQL과 정적 SQL로 각각 컬럼 명만 변경하여 수행되는 프로시저 작성 (2) | 2024.12.26 |
[SGA] library cache lock&pin 발생원인과 재현하기 (2) | 2024.12.13 |
Lob Partition 의 partition과 lob partition의 default attributes 설정 변경하여 자동으로 추가되는 파티션 압축되게 하기 (2) | 2024.11.22 |
[23ai] ai벡터검색 - ChatGPT를 이용하여 실시간 응답을 받기(RAG) (2) | 2024.11.15 |
댓글