1. 용어 개념 잡기
내용을 다루기에 앞서 용어에 대한 이해가 선행되어야 할 것 같다.
- DB 서버 : 실제 데이터가 저장되는 위치로 여러 인스턴스가 연결될 수 있음
- Instance(인스턴스) : DB 서버에 접속하기 위한 것으로 오직 하나의 DB에만 연결됨
- RAC(Real Application Cluster) : 하나의 DB에 접속하기 위해 여러 인스턴스가 연결된 구조
- HA(High Availability) : 동일한 DB 서버를 2대 구성하여 서비스 중단이 발생하지 않도록 하는 구조
보통 개인이 사용하는 간단한 형태에서는 하나의 DB 서버가 있고 이에 접속하기 위한 인스턴스도 역시 하나만 존재한다. 그렇기 때문에 이 개념을 다룰 일이 딱히 있지는 않을 것이다. 그러나 실제 서비스를 운영하는 경우에는 만약 이러한 구조를 사용했다면 하나의 인스턴스에서 오류가 발생한다면 DB에 접속할 수 있는 방법이 없어지는 것이다. 그렇기 때문에 서비스를 운영할 땐 RAC(Real Application Cluster)이나 HA(High Availability) 구조로 DB를 구성하곤 한다.
RAC와 HA에 대한 추가 내용은 아래 포스팅 참고!
[Oracle] RAC(Real Application Cluster)와 HA(High Availability)
1. 등장 배경 - 하나의 DB, 하나의 Instance 구조의 문제점일반적으로 사람들이 사용하는 DB는 하나의 DB, 그리고 하나의 Instance 형태다. 여기서 Instance란 DB에 접속하기 위한 창구 역할을 하는 것으로
semin1127.tistory.com
2. SID(System Identifier)
SID란 각 고유 인스턴스의 이름으로, 이 이름을 통해 RAC 환경의 DB에서 각 인스턴스를 식별할 수 있다. 그렇기 때문에 같은 DB 서버에서는 SID는 중복으로 설정할 수 없다. 서로 다른 DB 서버에서는 SID를 중복으로 설정할 수 있지만 이는 혼란을 야기할 수 있으므로 권장되지는 않는다. SID는 Oracle DB를 설치할 때 설정할 수 있는데, 보통은 XE 또는 ORCL이 기본값으로 설정된다.
아래 쿼리를 통해 현재 인스턴스의 SID를 확인할 수 있다.
SELECT instance FROM v$thread;
Java에서 JDBC로 DB Connection을 획득할 때 사용하는 url을 다음과 같이 사용했을텐데 여기서 마지막 부분이 SID에 해당했던 것이다.
// 이 부분이 SID! ↓
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe");
3. SNAME(Service Name)
클라이언트가 DB에 접속할 때 사용할 수 있는 논리적 이름으로, 하나의 DB를 뜻하며 여러 인스턴스를 포괄할 수 있다. 즉, 여러 인스턴스가 하나의 SNAME에 포함될 수 있다는 것이다. 그렇다면 여기서 한 가지 궁금증을 가질 수 있다.
인스턴스는 고유한 SID로 식별한다고 했는데 SNAME을 여러 인스턴스에 동일하게 설정하면 인스턴스를 고유하게 식별하는 것이 불가능하지 않나?
분명 SID를 통해 각 인스턴스를 고유하게 식별한다고 했는데 이렇게 되면 각 인스턴스를 식별하지 못할 것 같다는 생각이 들었다. 관련 내용을 찾아보니 클라이언트가 접속을 요청하는 시점에 DB Listener가 알아서 해당 시점에 가용한 여러 인스턴스 중에서 최적의 인스턴스를 반환(=로드밸런싱 Load Balancing)해준다고 한다.
💡DB 리스너란 : 클라이언트의 DB 접속 요청을 처리하는 요소
💡로드밸런싱 : 부하를 최적화하기 위한 기술로 트래픽을 균등하게 배포하는 방법
현재 설정된 SNAME은 아래 쿼리로 확인할 수 있다.
SHOW PARAMETER service_names;
마찬가지로 JDBC에서 DB Connection을 획득할 때 사용하는 url 부분에 SNAME을 다음과 같이 //와 /를 사용하여 나타낼 수 있다.
// // ↓ / ↓
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@//localhost:1521/xe");
3-1. SNAME 변경해보기
SNAME은 다음 쿼리를 통해 변경할 수 있다.
ALTER SYSTEM SET SERVICE_NAMES='TEMPNAME';
SNAME을 변경하고 cmd에서 lsnrctl status 명령어를 입력하여 확인해보면 다음과 같이 바뀐 것을 확인할 수 있다.
JDBC를 통해 DB 커넥션을 얻을 땐 다음과 같이 바뀐 SNAME으로 작성하면 된다.
conn = DriverManager.getConnection("jdbc:oracle:thin:@//localhost:1521/tempname", "ORCLSTUDY", "1234");
'[DB] > - Oracle' 카테고리의 다른 글
[Oracle] NVL, NVL2 함수 (0) | 2025.05.27 |
---|---|
[Oracle] 정규식 (일반 문자 - Literal Character, 메타 문자 - Meta Character) (0) | 2025.05.27 |
[Oracle] 숫자 -> 문자 변경 시 포맷 설정 (0) | 2025.05.24 |
[Oracle] RAC(Real Application Cluster)와 HA(High Availability) (0) | 2025.05.22 |
[Oracle] Port 포트 번호 변경하는 방법 (0) | 2025.05.22 |