태그 보관물: Oracle

Oracle Start, Stop

개요

Oracle Database의 시작(startup)과 종료(shutdown) 절차를 정리합니다. sqlplus를 통해 DB 인스턴스를 시작/종료하는 방법과 Listener 시작/종료 명령어, 그리고 운영 환경에서 자주 사용하는 startup/shutdown 옵션을 다룹니다.

Oracle 인스턴스 시작/종료 모드

Oracle Database는 단순 시작/종료가 아닌 여러 단계와 모드를 지원합니다. startup에는 NOMOUNT(파라미터 파일만 읽기), MOUNT(컨트롤 파일 읽기), OPEN(전체 운영) 세 단계가 있습니다. 일반 운영은 startup(OPEN)으로 충분하며, 복구 작업이나 리두 로그 변경은 MOUNT 단계가 필요합니다.

shutdown에는 NORMAL(모든 세션 종료 대기), IMMEDIATE(현재 트랜잭션 롤백 후 종료), TRANSACTIONAL(트랜잭션 완료 후 종료), ABORT(강제 종료, DB 불일치 가능성 있음)가 있습니다. 운영 환경에서는 ABORT는 최후 수단으로만 사용하고 IMMEDIATE를 권장합니다.

오라클 서버 시작, 종료

  • 오라클 서버의 MA(Maintenance)를 위해서는 서비스를 종료, 시작 하는 과정이 필요합니다.
  • 당연한 것이지만 오라클 서비스가 종료되기전에 DBMS와 연결된 커넥션을 모두 해제 해야 됩니다. 보통 WAS나 AP를 종료 시키는 것이 일련의 과정입니다.
  • WAS와 AP 종료 후 Client 연결 상태 확인( 기본적으로는 커넥션을 맺은 계정명만 확인이 가능합니다.) 출처>https://stackoverflow.com/questions/1043096/how-to-list-active-open-connections-in-oracle
$ sqlplus / as sysdba
// sysdba 권한을 가진 계정으로 진행

SQL> SELECT username FROM v$session WHERE username IS NOT NULL ORDER BY username ASC;
  • 서비스 종료(오라클 서비스 제어용 계정으로 진행)
$ sqlplus / as sysdba

SQL> shutdown immediate
SQL> exit

$ lsnrctl stop
  • 서비스 시작(MA등의 작업 종료후 오라클 서비스 제어용 계정으로 진행)
$ lsnrctl start

$ sqlplus / as sysdba

SQL> startup
  • WAS나 AP를 기동시켜 검증이 가능하겠지만 보통 정상적으로 데이터 조회가 가능한지 먼저 검증을 해보는 것이 좋습니다.

리스너(Listener) 관리

Oracle Listener는 클라이언트의 접속 요청을 수신하는 네트워크 프로세스입니다. DB 인스턴스와 별도로 동작하므로 DB가 기동되어도 Listener가 중지되면 외부 클라이언트가 접속할 수 없습니다. Listener 설정은 $ORACLE_HOME/network/admin/listener.ora에서 관리합니다.

-- Listener 상태 확인 (Oracle 계정에서 실행)
$ lsnrctl status

-- Listener 로그 확인 (접속 오류 진단)
$ lsnrctl show log_status

-- 동적 서비스 등록 확인 (DB가 기동된 경우 자동 등록)
$ lsnrctl services

Oracle 서비스 시작 순서는 Listener 시작 → DB 인스턴스 시작이며, 종료 순서는 반대입니다. 자동 시작이 필요한 환경에서는 /etc/oratab에 자동 시작 플래그를 Y로 설정하고 dbstart/dbshut 스크립트를 OS 시작/종료 훅에 등록합니다.

현재 세션 및 프로세스 확인

Oracle DB 재기동 전에 현재 접속 중인 세션과 실행 중인 트랜잭션을 확인하면 불필요한 롤백과 데이터 불일치를 예방할 수 있습니다. V$SESSION 뷰에서 활성 세션 수를 확인하고, 필요한 경우 애플리케이션 측에서 연결을 먼저 끊거나 유지보수 모드로 전환한 후 DB를 종료합니다.

-- 현재 활성 세션 수 확인
SELECT COUNT(*) FROM V$SESSION WHERE STATUS = 'ACTIVE';

-- 세션별 사용자 및 프로그램 확인
SELECT SID, SERIAL#, USERNAME, STATUS, PROGRAM FROM V$SESSION
WHERE TYPE = 'USER' ORDER BY STATUS;

참고

참고 문서: Oracle Listener Control Utility (lsnrctl) · Oracle 10g Startup/Shutdown 가이드

Oracle JDBC Connection

개요

Java 애플리케이션에서 Oracle JDBC 드라이버를 사용해 Oracle 데이터베이스에 연결하는 방법을 정리합니다. ojdbc jar 파일 추가, Connection URL 형식, JNDI DataSource 설정 등 Oracle JDBC 연동에 필요한 핵심 설정을 다룹니다.

Oracle JDBC URL 형식

Oracle JDBC 연결 URL은 세 가지 형식을 지원합니다. 가장 일반적인 Thin 드라이버 방식은 순수 Java로 구현되어 Oracle 클라이언트 소프트웨어 없이 동작합니다. SID 기반 URL과 서비스명 기반 URL 중 서버 환경에 맞는 형식을 사용합니다.

// SID 기반 (구형, 단일 인스턴스)
jdbc:oracle:thin:@x.x.x.x:1521:orcl

// 서비스명 기반 (권장, RAC/CDB/PDB 환경 지원)
jdbc:oracle:thin:@x.x.x.x:1521/orclpdb

// TNS 이름 기반 (tnsnames.ora 파일 필요)
jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=x.x.x.x)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=orcl)))

Oracle 11g 이하는 ojdbc6.jar, Oracle 12c 이상은 ojdbc8.jar를 사용합니다. ojdbc는 Oracle 사이트 또는 Maven Central에서 다운로드할 수 있습니다. Maven 프로젝트에서는 pom.xml에 ojdbc 의존성을 추가합니다.

JAVA에서 오라클 JDBC Driver를 연결하는 방법

  • JAVA 어플리케이션에서 드라이버(ojdbc)를 통해 오라클 DBMS와 연결을 가능하게 해줍니다.
  • ojdbc 드라이버는 오라클 DBMS의 설치 경로에서 확인이 가능합니다. (ex> oracle/product/11.2.0/db_1/jdbc/lib/ojdbc6.jar)
  • 해당 ojdbc 드라이버 파일을 JAVA의 Classpath에 복사 또는 별도도 지정해줘야 import가 가능 합니다. (이클립스에서는 해당 프로젝트 > Build Path > Configure Build Path > Add External JARs > 해당 드라이버 추가)
  • JAVA 코드 예시(Oracle 11G 기준)
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Connection;

public class jdbc_connect {

    public static void main(String[] args) {
        String driver = "oracle.jdbc.driver.OracleDriver";
        String url = "jdbc:oracle:thin:@x.x.x.x:1521:orcl";
        String user = "tester";
        String password = "tester";
        Connection conn = null;

        try {
            Class.forName(driver);
            System.out.println("jdbc driver loading success");
            conn = DriverManager.getConnection(url, user, password);
            System.out.println("Oracle connection seccess");

        } catch (ClassNotFoundException e) {
            System.out.println("jdbc driver loading failure");
        } catch (SQLException e) {
            System.out.println("Oracle connection failure");
        }
        try {
            conn.close();
        } catch (SQLException e) {
            System.out.println("connection close failure");
        }
    }
}

Connection Pool (HikariCP) 설정

실제 애플리케이션에서는 매번 Connection을 새로 생성하지 않고 Connection Pool을 사용합니다. Spring Boot 기본 커넥션 풀인 HikariCP에서 Oracle JDBC를 설정하는 방법은 아래와 같습니다. application.yml에 JDBC URL, 계정 정보, 풀 크기를 지정합니다.

spring:
  datasource:
    url: jdbc:oracle:thin:@x.x.x.x:1521/orclpdb
    username: app_user
    password: <REDACTED>
    driver-class-name: oracle.jdbc.OracleDriver
    hikari:
      maximum-pool-size: 10
      minimum-idle: 2
      connection-timeout: 30000

커넥션 풀 크기는 서버의 CPU 코어 수와 쿼리 응답 시간을 고려해 결정합니다. Oracle 세션 수 제한(sessions 파라미터)을 초과하지 않도록 모든 애플리케이션 인스턴스의 pool size 합산을 관리해야 합니다.

주요 예외 처리와 연결 검증

Oracle JDBC 사용 시 자주 발생하는 예외를 이해하면 디버깅 시간을 크게 줄일 수 있습니다. ORA-12541: No listener는 Listener가 중지된 경우, ORA-01017: invalid username/password는 계정 정보 오류, ORA-00942: table or view does not exist는 권한 부족 또는 오브젝트 미존재 상황입니다. 연결 성공 여부는 connection.isValid(timeout)으로 확인할 수 있으며, 커넥션 풀에서는 connectionTestQuery=SELECT 1 FROM DUAL로 주기적으로 연결 상태를 검증합니다.

참고

참고 문서: Oracle JDBC Maven Central 가이드 · Oracle JDBC Connection URL 형식