오라클 데이터베이스에서 'SID'와 'Service Name'은 헷갈릴 수 있는 개념이지요. 이 두 개념의 차이점을 명확히 알고 있으면 데이터베이스 연결이나 설정에 관련된 이해가 쉬워질 텐데요, 하나씩 자세히 알아볼까요?
SID (System Identifier)
- SID는 'System Identifier'의 약자로, 오라클 인스턴스를 구분하기 위한 고유 식별자 역할을 합니다.
- 오라클 데이터베이스의 인스턴스는 데이터 파일, 메모리, 프로세스 등을 포함하는 독립적인 데이터베이스 환경을 말합니다.
- 하나의 서버에 여러 개의 오라클 인스턴스가 있을 수 있기 때문에, 각 인스턴스를 고유하게 식별하기 위해 SID를 사용합니다. 예를 들어, 서버에서 여러 데이터베이스를 운영할 때
PROD,DEV,TEST등의 SID를 각각 설정하여 인스턴스를 구분합니다. - SID는 인스턴스 자체를 특정하는 역할을 하므로, 데이터베이스의 내부 환경과 관련이 깊습니다. 데이터베이스 인스턴스를 구동하거나 관리할 때 SID는 매우 중요한 정보입니다.
서비스 이름 (Service Name)
- Service Name은 사용자가 접속할 때 참조하는 데이터베이스 서비스의 이름입니다.
- Service Name은 사용자가 연결할 때 필요한 논리적인 이름으로 네트워크를 통해 여러 데이터베이스 또는 여러 인스턴스를 묶는 역할을 할 수 있습니다.
- 일반적으로 오라클 클라이언트에서 데이터베이스에 연결할 때는 TNS (Transparent Network Substrate) 프로토콜을 사용하여 Service Name을 통해 연결합니다. 즉, 사용자는 Service Name을 통해 데이터베이스에 접근하고, 오라클 네트워킹은 이를 적절한 인스턴스나 데이터베이스로 연결합니다.
- 하나의 인스턴스에 여러 Service Name을 부여할 수 있기 때문에, Service Name은 논리적인 연결과 관련된 개념이라고 할 수 있습니다.
정리하자면.
- SID는 데이터베이스 서버 내에서 오라클 인스턴스를 구분하는 고유한 식별자입니다. 주로 오라클 인스턴스 자체의 관리를 위한 용도로 사용됩니다.
- Service Name은 데이터베이스 사용자나 클라이언트가 네트워크를 통해 인스턴스나 데이터베이스에 연결할 때 사용하는 논리적인 이름입니다.
따라서 오라클 환경에서 SID와 서비스 이름은 서로 다른 목적을 위해 사용되며, 인스턴스의 고유 식별자로 SID를, 네트워크 상의 연결 이름으로 서비스 이름을 사용한다고 이해하면 됩니다.
TNS에서 SID와 Service Name
TNS를 구성할 때 SID와 서비스 이름은 자주 혼동되는 요소인데요, TNS 설정 파일에서 SID와 SERVICE_NAME은 각각 다른 용도로 사용할 수 있어요. 오라클 환경에서는 tnsnames.ora 파일을 통해 클라이언트가 데이터베이스에 연결할 때의 정보를 설정할 수 있는데, 이때 SID와 SERVICE_NAME을 올바르게 사용하는 것이 중요해요.
tnsnames.ora 파일 구성 예시
먼저, TNS 구성 파일의 예시를 보면 다음과 같이 되어 있을 수 있습니다
ORCL_DB =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = mydbhost)(PORT = 1521))
(CONNECT_DATA =
(SERVICE_NAME = myservice) -- 또는 (SID = mydb)
)
)
위 예시에서 SERVICE_NAME과 SID는 선택적으로 사용되며, 환경에 따라 둘 중 하나를 사용하거나 특정 목적에 따라 설정하세요.
SID와 SERVICE_NAME의 차이점
- SID
- SID는 데이터베이스 인스턴스의 고유한 이름입니다.
- 데이터베이스 인스턴스를 특정할 때 SID를 통해 연결할 수 있습니다.
- 주로 싱글 인스턴스 환경이나 테스트 및 개발 환경에서 사용되며, 단일 인스턴스에 직접 접근할 때 사용되는 경우가 많습니다.
- 예를 들어
(SID = mydb)와 같이 설정하여 특정 인스턴스로 직접 연결할 수 있습니다.
SERVICE_NAME
- SERVICE_NAME은 논리적인 데이터베이스 서비스의 이름으로, 네트워크에서 여러 인스턴스가 포함된 클러스터나 RAC 환경에서 자주 사용됩니다.
- 서비스 이름을 통해 사용자는 인스턴스를 직접 지정하지 않고, 서비스 이름을 사용해 특정 서비스 그룹으로 연결할 수 있습니다.
- 예를 들어
(SERVICE_NAME = myservice)로 설정하면 클라이언트는myservice라는 논리적 이름으로 데이터베이스에 연결되며, 오라클이 적절한 인스턴스로 라우팅합니다.
실제 사용할 때 어떻게 선택하나?
- 싱글 인스턴스 환경에서는
(SID = mydb)와 같이SID를 사용하는 것이 일반적입니다. - RAC (Real Application Cluster) 환경에서
(SERVICE_NAME = myservice)와 같이SERVICE_NAME을 사용하여 클라이언트가 여러 인스턴스에 연결될 수 있게 하는 것이 권장됩니다.
따라서, TNS를 구성할 때 싱글 인스턴스 환경에서는 SID를, 여러 인스턴스를 운영하는 클러스터 환경에서는 SERVICE_NAME을 사용하는 것이 일반적입니다. (서비스 네임을 사용할 것을 권장해요.)
TNS에서 CONNECT_DATA 섹션 살펴보기
tnsnames.ora 파일에서 CONNECT_DATA 섹션은 데이터베이스에 연결할 때의 구체적인 설정을 정의하는 부분입니다. SERVICE_NAME과 SID는 CONNECT_DATA의 하위 매개변수 중 가장 자주 사용되는 요소로, 각기 다른 목적에 따라 설정되므로 이를 올바르게 이해하는 것이 중요합니다.
CONNECT_DATA 섹션의 구조와 주요 설정 요소
CONNECT_DATA 섹션은 DESCRIPTION 하위에 위치하며, 오라클 클라이언트가 데이터베이스에 연결할 때 사용할 정보를 정의합니다. 이 섹션의 주요 목적은 연결 대상 서비스의 정보를 명확히 지정하는 데 있습니다. SERVICE_NAME과 SID는 각각 다른 유형의 연결을 설정할 때 사용되며, 다음과 같이 작동합니다.
SERVICE_NAME
- SERVICE_NAME은 오라클에서 논리적인 데이터베이스 서비스의 이름을 나타내며, 클라이언트가 연결할 목표 서비스의 이름을 지정합니다.
- RAC (Real Application Cluster) 환경과 같은 멀티 인스턴스 환경에서 자주 사용됩니다. 이 경우 SERVICE_NAME을 통해 여러 인스턴스가 하나의 서비스 이름으로 묶여 있으면, 클라이언트는 인스턴스 하나하나를 지정하지 않고도 연결할 수 있습니다.
- SERVICE_NAME은 장애 조치 등의 기능을 사용할 때 특히 유용하며, 오라클에서 여러 인스턴스를 하나의 서비스로 그룹화하여 라우팅을 최적화할 수 있습니다.
tnsnames.ora에서 SERVICE_NAME을 설정하는 방식(CONNECT_DATA = (SERVICE_NAME = myservice) -- 논리적 데이터베이스 서비스 이름 )- 일반적으로 프로덕션 환경, 특히 다중 인스턴스 구성을 사용하는 환경에서는 SERVICE_NAME을 사용해 클라이언트가 논리적 서비스 이름을 통해 연결되도록 하는 것이 권장됩니다.
SID
- SID는 특정 오라클 인스턴스의 고유한 식별자로, 단일 인스턴스 환경에서 주로 사용됩니다.
SID를 사용해 연결하는 경우, 클라이언트는 특정 인스턴스로 직접 연결하게 되며, RAC 환경에서는 이를 잘 사용하지 않습니다. 일반적으로 개발 환경이나 테스트 환경에서는 SID를 사용해 특정 인스턴스와 직접 연결하도록 설정하는 경우가 많습니다.tnsnames.ora에서 SID를 설정하는 방식(CONNECT_DATA = (SID = mydb) -- 특정 데이터베이스 인스턴스 이름 )- 단일 인스턴스 데이터베이스에서
SID는 해당 인스턴스를 식별하는 데 유용하며, 개별 인스턴스에 직접 연결할 때 유리합니다.
tnsnames.ora 파일의 전체 예시
아래는 tnsnames.ora 파일에서 SERVICE_NAME과 SID를 각각 사용하여 설정한 예시입니다.
SERVICE_NAME 사용
MYDB_SERVICE =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = mydbhost)(PORT = 1521))
(CONNECT_DATA =
(SERVICE_NAME = myservice) -- 논리적 서비스 이름을 사용해 연결
)
)
SID 사용
MYDB_SID =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = mydbhost)(PORT = 1521))
(CONNECT_DATA =
(SID = mydb) -- 특정 인스턴스에 직접 연결
)
)
요약
- SERVICE_NAME은 멀티 인스턴스 환경에서 서비스 그룹으로 연결을 설정할 때 적합합니다. 특히, 클러스터나 로드 밸런싱이 필요한 환경에서 자주 사용됩니다.
- SID는 단일 인스턴스 환경에서 특정 인스턴스로 직접 연결할 때 유용합니다.
따라서 tnsnames.ora 파일을 구성할 때, 클러스터링된 환경이나 고가용성 구성이 필요한 경우 SERVICE_NAME을, 단일 인스턴스와의 연결이 필요한 경우 SID를 설정하는 것이 좋습니다.
CONNECT_DATA 안에 있는 SERVICE_NAME과 아까 설명한 SERVICE_NAME 개념은 같은 개념이에요.
오라클 데이터베이스 환경에서 SERVICE_NAME과 SID는 두 가지 다른 방식으로 데이터베이스 연결을 설정하기 위한 옵션일 뿐, CONNECT_DATA 안에 설정된 SERVICE_NAME은 여전히 클라이언트가 접근하려는 오라클 서비스(또는 데이터베이스 서비스)의 논리적 이름을 나타냅니다. 다시 말해, tnsnames.ora 파일의 CONNECT_DATA에 포함된 SERVICE_NAME과 앞서 설명한 SERVICE_NAME은 동일한 개념입니다.
SERVICE_NAME
- CONNECT_DATA 내의 SERVICE_NAME: TNS 구성 파일에서 논리적 데이터베이스 서비스를 식별할 때 사용하는 이름으로, 클라이언트가 데이터베이스에 연결할 때 사용하는 논리적 이름입니다.
- 기본적인 SERVICE_NAME의 개념: 오라클 인스턴스가 제공하는 서비스의 논리적 이름으로, RAC와 같은 클러스터 환경에서 여러 인스턴스를 통합하여 하나의 서비스로 연결할 때도 사용됩니다.
그러므로 TNS 설정 파일의 CONNECT_DATA 안에서 쓰이든, 오라클 내부 개념으로 쓰이든 SERVICE_NAME은 오라클 데이터베이스의 논리적인 서비스 이름을 의미하며, 용도와 의미가 동일합니다.
net_service_name과 SERVICE_NAME의 차이
net_service_name(네트 서비스 이름)tnsnames.ora파일의 항목을 식별하기 위해 사용되는 사용자 정의 별칭입니다.- 클라이언트가 데이터베이스에 연결할 때 사용할 TNS 엔트리의 이름입니다.
- 예를 들어, 위 예시에서
net_service_name으로 지정한 이름은 데이터베이스에 연결할 때 클라이언트가 사용하는 이름이 됩니다. - 클라이언트는
net_service_name을 통해DESCRIPTION블록 내부의SERVICE_NAME이나SID정보에 접근할 수 있습니다.
SERVICE_NAMECONNECT_DATA안에 정의되며, 오라클 데이터베이스의 논리적 서비스 이름을 의미합니다.- 실제 오라클 인스턴스 또는 클러스터에 대해 정의된 이름으로, 데이터베이스 서비스에 연결할 때 필요한 논리적인 연결 지점입니다.
- 오라클 데이터베이스는 내부적으로
SERVICE_NAME을 사용하여 연결 요청을 특정 인스턴스 또는 인스턴스 그룹으로 라우팅합니다.
예시로 정리
아래와 같은 tnsnames.ora 파일이 있다고 가정하면,
sales_db =
(DESCRIPTION=
(ADDRESS=...)
(ADDRESS=...)
(CONNECT_DATA=
(SERVICE_NAME=sales.us.example.com)))
sales_db:net_service_name. 클라이언트가 사용할 때sales_db라는 별칭으로 데이터베이스에 연결할 수 있습니다. 예를 들어, SQL*Plus에서 다음과 같이 연결할 수 있습니다:sqlplus user/password@sales_dbsales.us.example.com:SERVICE_NAME. 오라클 인스턴스가 제공하는 실제 데이터베이스 서비스 이름으로, 클라이언트가sales_db라는net_service_name을 사용할 때 이SERVICE_NAME으로 실제 데이터베이스 서비스에 연결됩니다.
요약
net_service_name: TNS 엔트리의 사용자 정의 이름, 클라이언트가 사용할 때tnsnames.ora에서 참조하는 별칭입니다.SERVICE_NAME: 실제 오라클 데이터베이스 서비스의 논리적 이름으로, 연결할 대상 데이터베이스를 정의합니다.
따라서 net_service_name과 SERVICE_NAME은 용도와 역할이 다르며, net_service_name은 오라클의 데이터베이스에 접근할 때 사용하는 별칭이고, SERVICE_NAME은 그 별칭이 가리키는 실제 서비스 이름입니다.
net_service_name?
tnsnames.ora 파일에 설정된 각 연결 엔트리를 식별하는 사용자 정의 이름을 가리킵니다. 이는 클라이언트가 연결할 때 사용하는 별칭입니다.
오라클 공식 문서에 따르면,
- Net Service Name (네트 서비스 이름)은 네트워크에서 데이터베이스 서비스에 접근하기 위해 사용하는 이름으로,
tnsnames.ora파일에서 정의됩니다. 클라이언트는net_service_name을 통해 설정된SERVICE_NAME이나SID에 연결합니다. SERVICE_NAME과SID는 오라클 데이터베이스의 실제 인스턴스나 서비스를 특정하는 반면,net_service_name은 클라이언트가 이 특정 서비스에 연결하기 위해 사용하는 이름입니다.
공식 문서 예시
오라클의 공식 문서에서는 Net Service Name과 Service Name을 구분하여 설명하며, tnsnames.ora 파일의 설정에서 각각이 어떻게 사용되는지 다룹니다.
예시:
SALES =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = sales-server)(PORT = 1521))
(CONNECT_DATA =
(SERVICE_NAME = sales.example.com)
)
)
여기서:
SALES는tnsnames.ora에서 정의한 Net Service Name입니다.(SERVICE_NAME = sales.example.com)은 오라클 데이터베이스 인스턴스의 Service Name입니다.
CONNECT_DATA 는 SERVICE_NAME 을 권장하는 편
특정 버전의 오라클에서는 SERVICE_NAME과 SID의 사용 권장 사항이 조금 다릅니다. 문서 내용에 따르면, 오라클9i나 8버전에서는 SERVICE_NAME을 선호하며, 8버전 이하의 특정 구버전에서는 SID를 사용하는 방식이 주로 쓰였습니다.
문서 내용 요약 및 해석
SERVICE_NAME:- 오라클 8과 9i 버전에서는
SERVICE_NAME을 통해 접속할 데이터베이스 서비스를 지정하도록 권장합니다. SERVICE_NAME의 값은 초기화 파라미터 파일의SERVICE_NAMES와 일치해야 하며, 오라클 인스턴스 또는 서비스에 대한 논리적인 이름을 나타냅니다.- TNS 설정 파일의
CONNECT_DATA에 포함되어야 합니다.
- 오라클 8과 9i 버전에서는
SID:SID는 오라클 인스턴스의 고유 식별자로, 주로 특정 인스턴스와 직접 연결하기 위한 용도입니다.- 문서에서는 오라클 8 및 9i 버전의 데이터베이스에서는
SERVICE_NAME을 사용하는 것이 바람직하다고 명시하고 있습니다. - 따라서 새로운 버전으로 갈수록
SERVICE_NAME을 사용해 논리적 서비스 연결을 설정하는 방식이 더욱 권장됩니다.
문서의 권장 사항을 반영한 tnsnames.ora 구성 예시
문서의 권장 사항에 따라 최신 오라클 환경에서는 주로 SERVICE_NAME을 사용하여 설정합니다. 예를 들어,
SALES_DB =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = sales-server)(PORT = 1521))
(CONNECT_DATA =
(SERVICE_NAME = sales.example.com) -- 서비스 이름을 통한 연결
)
)
구버전이나 단일 인스턴스 환경이라면 SID를 사용할 수도 있지만, 최신 오라클 설정에서는 SERVICE_NAME을 사용하는 것이 표준 방식이며, SID는 특정 인스턴스와의 직접 연결이 필요한 경우에만 사용됩니다.
따라서, 오라클 9i 이후부터는 SERVICE_NAME을 표준 연결 방식으로 사용하고, SID는 단일 인스턴스나 테스트 용도에서만 제한적으로 사용하는 것이 좋다는 것이 문서의 핵심 권장 사항입니다.
