본문 바로가기
IT

오라클 커넥션 기본 개념 (ORACLE CONNECTION)

by 힁구띠 2022. 6. 15.

오라클은 네트워크 통신 수단으로 대부분 TCP/IP 소켓을 사용하고 있다. 쉽게 말해 소켓을 전화라고 생각한다면, 소켓을 사용함으로써 타 장비에 있는 프로그램끼리 통신할 수 있다.

프로세스의 측면에서 본다면, 한번 소켓을 만들어 두면 소켓을 읽고 쓰기만 해도 송수신을 구현할 수 있으므로 매우 편리한 기능이라 할 수 있다. 송수신은 실제로 네트워크의 드라이버와 OS의 라이브러리가 수행하고 있다.

 

소켓은 주소와 포트 번호의 조합으로 구분할 수 있다.

오라클에서는 수신을 기다리는 프로세스를 Listener라고 한다. listener로 connection을 하는 프로세스는 업무 Application 프로세스이다.

  1. DB: 자신이 listen 해야 할 포트 번호 등을 listener.ora에서 확인한 뒤 listen 시작
  2. AP 서버: tnsnames.ora 파일을 확인해서 listener의 주소나 포트 번호, 서비스 이름 등을 확인
  3. DB: 소켓이 설정되면 서버 프로세스를 생성한다. 소켓은 서버 프로세스에 전달해 준다. 단, 일부 OS는 소켓을 공유하는 경우도 있다.

1. 커넥션 처리 (리스너 기동)

쉽게 말하자면 listener.ora 파일은 '대표 전화번호', '내선 전화번호' 목록이라 할 수 있다. 리스너는 한 개로 여러 개의 데이터베이스를 안내할 수 있다. (일반적으로는 한 개의 리스너로 한 개의 데이터베이스를 담당하게 한다)

보통 1521번 포트를 사용하지만, 충돌 시 다른 번호를 사용해도 무방하다. 리스너의 설정이 끝나면 'lsnrctl'로 리스너를 기동 한다. 

 

2. 커넥션 처리 (애플리케이션 커넥션)

애플리케이션 내부에서 커넥션 명령이 수행되거나, SQL PLUS에서 connect 명령어가 수행되는 순간에 커넥션을 수행한다. (CONNECT scoot/tiger@ora10g ----> 커넥션 식별자

먼저 커넥션에 필요한 정보를 오라클 클라이언트에 전달해야 한다. (tnsnames.ora에 작성해 놓고 커넥션 디스크립터마다 커넥션 식별자(애칭)를 기입한다. 이때 이 커넥션 식별자를 오라클 클라이언트에 전달하기만 하면 된다. 일종에 단축 다이얼 개념이다.

tnsname.ora 예시

scott/tier가 샘플 계정으로 많이 사용되고 있고, 세계에 널리 알려져 있다. scott은 초기에 오라클을 개발하고 있었던 개발자의 이름인 'Bruce Scott'이다. 그리고 tiger는 그가 기르던 고양이의 이름이라고 한다. 가끔 운영 환경의 사용자와 비밀번호에 scott/tier를 사용하고 있는 DBA들이 보이는데, 많은 사람이 유추해 낼 수 있는 비밀번호는 절대 사용하지 않도록 한다. Bruce Scott은 오라클에서 퇴사했지만 가끔 세미나를 열면서 활동하고 있다.

 

3. 커넥션 처리 (서버 프로세스 생성)

먼저 OS에서 프로세스를 생성해야 하며, 서버 프로세스가 공유 메모리를 사용할 수 있도록 해야 한다. 또한, 서버 프로세스용 메모리도 확보해야 한다. 그 이외에 데이터베이스 내부의 처리도 여러 가지 남아 있다. 따라서 서버 프로세스를 한번 생성하는 데에는 가벼운 SQL이 사용하는 CPU 시간보다 많은 CPU 시간을 사용한다. 리스너는 서버 프로세스 생성이 끝나면 소켓을 서버 프로세스에 인계한다. 인계 후부터는 서버 프로세스와 오라클 클라이언트가 직접 송수신하므로 리스너는 자유로워진다.

 

* 리스너 상태 확인

일반적인 서버 프로세스 종료 방법은, 애플리케이션에 접속을 종료하는 close나 disconnect를 수행하면 서버 프로세스도 종료한다. (프로세스가 없어진다) 

리스너는 lsnrctl 명령어로 정지할 수 있다. 또한, lsnrctl의 status 명령어로 현재 리스너 가동 상태나 포트의 번호, 유지하고 있는 데이터베이스의 정보 등을 알 수 있다.

 

* 강제 접속 중지 명령어

일반적으로 오라클은 TCP/IP를 사용한다. TCP/IP에서 에러가 반환되지 않으면 오라클은 문제가 발생한 것을 모를 수 있다. 예를 들면, 오라클 클라이언트가 이미 비정상 종료되었음에도 서버 프로세스는 데이터베이스 lock을 소유한 채로 클라이언트에서 connect가 되기를 기다리는 경우가 있다. 또한, 처리 도중에 테이블에 lock을 걸어둔 채로 사용자가 잊어버리는 경우도 있다. 이런 행위들이 애플리케이션의 처리 전체를 멈추게 할 수 있다. 그때는 일반적으로 alter system kill session 'sid,serial#' immediate; 명령어로 접속을 kill하고 lock을 해제한다.

 

4. 기타

여러 서버 프로세스가 여러 클라이언트의 SQL을 처리할 수 있도록 하면 효율이 높아진다고 생각할 수 있다. 즉, '서버 프로세스 몇 개를 풀로 만들어 두고 여러 애플리케이션이 사용하고 싶을 때만 풀에서 하나를 꺼내 사용한다.라는 구조를 생각할 수 있다. 즉, 오라클의 '공유 서버 구성'이나 'connection pool'이라고 불리는 구성을 사용할 수 있는데, 최근에는 대부분 사용을 많이 하고 있다.

 

종합하자면,
데이터베이스에 접속하기 위해서는 데이터베이스 서버의 주소, 리스너 포트 번호가 필요하다.
tnsnames.ora라는 파일 안에 접속하기 위한 정보를 기록해 둔다.
리스너가 접속 요청을 받고, 서버 프로세스의 생성도 수행한다.
lisnter.ora라는 파일 안에 리스너의 설정(포트 번호 등)을 기록해 준다.
서버 프로세스의 생성은 매우 무거운 작업이므로 가능하면 줄이는 것이 현명하다.



 

댓글