FDW/Gateway로 도커 컨테이너 DB Link 설정부터 연결 확인까지

궁금하면 500원·2025년 6월 26일

데이터 저장하기

목록 보기
20/23

도커 환경에서 PostgreSQL, Oracle, MySQL 간의 DB 링크(Database Link)를 설정하는 방법은 데이터베이스 간의 특성 차이로 인해 일반적으로 Foreign Data Wrapper (FDW)Gateway/Heterogeneous Services를 사용합니다.

도커 환경이므로, 컨테이너들이 서로 통신할 수 있도록 동일한 도커 네트워크에 있거나 컨테이너 IP 및 포트가 노출되어야 합니다.


1. PostgreSQL에서 다른 DB로 연결 (Oracle 또는 MySQL)

PostgreSQL은 외부 데이터베이스에 연결하기 위해 Foreign Data Wrapper (FDW) 확장을 사용하는 것이 일반적입니다.

1.1. 연결 준비 (PostgreSQL 컨테이너 내)

  1. 컨테이너 접속:

    docker exec -it <postgresql_container_name> /bin/bash
  2. 필수 패키지 및 클라이언트 설치:

    • PostgreSQL rightarrow\\rightarrow Oracle: oracle_fdw 확장을 사용하며, 이를 위해서는 PostgreSQL 컨테이너 내부에 Oracle Instant Client가 설치되어야 합니다.
    • PostgreSQL rightarrow\\rightarrow MySQL: mysql_fdw 확장을 사용하며, 이를 위해서는 MySQL 클라이언트 라이브러리가 설치되어야 합니다.

    참고: FDW 설치 및 클라이언트 라이브러리 설정은 도커 이미지의 베이스 OS와 버전에 따라 매우 복잡할 수 있습니다. 이미지를 커스텀하여 빌드하거나 필요한 패키지를 컨테이너 내에서 직접 설치해야 할 수 있습니다.

여기서는 PostgreSQL rightarrow\\rightarrow Oracle 연결을 예시로, oracle_fdw를 사용한 방법을 설명합니다. (MySQL 연결은 mysql_fdw를 사용하며 과정은 유사합니다.)

  1. PostgreSQL 접속 및 확장 생성:
    -- PostgreSQL 접속 후
    CREATE EXTENSION oracle_fdw;
  2. 외부 서버 정의 (CREATE SERVER):
    CREATE SERVER <server_name>
    FOREIGN DATA WRAPPER oracle_fdw
    OPTIONS (dbserver '//<oracle_host>:<oracle_port>/<service_name>');
    -- 예시: OPTIONS (dbserver '//oracle-container:1521/XEPDB1');
    • <oracle_host>: Oracle 컨테이너의 IP 주소 또는 호스트 이름 (도커 네트워크 내 이름)
  3. 사용자 매핑 (CREATE USER MAPPING):
    CREATE USER MAPPING FOR <local_user>
    SERVER <server_name>
    OPTIONS (user '<remote_oracle_user>', password '<remote_oracle_password>');
    -- <local_user>는 PostgreSQL에서 쿼리를 실행할 사용자
  4. 외래 테이블 생성 (CREATE FOREIGN TABLE):
    이제 원격 DB의 테이블을 PostgreSQL 로컬 테이블처럼 정의합니다.
    CREATE FOREIGN TABLE <local_table_alias> (
        column1 data_type,
        column2 data_type
        -- ... 원격 테이블의 컬럼 구조와 일치해야 합니다.
    )
    SERVER <server_name>
    OPTIONS (table '<remote_oracle_table_name>');

2. Oracle에서 다른 DB로 연결 (PostgreSQL 또는 MySQL)

Oracle에서 다른 이기종(Heterogeneous) DB로 연결할 때는 Oracle Gateway 또는 Heterogeneous Services (HS)를 사용해야 합니다.

2.1. 연결 준비 (Oracle Gateway/HS)

Oracle이 PostgreSQL 또는 MySQL에 접속하려면, Oracle 홈 디렉토리 내에 Generic Connectivity (DG4ODBC)를 설정해야 하며, 이를 위해 Oracle 컨테이너 내부에 ODBC 드라이버를 설치해야 합니다.

  1. ODBC 드라이버 설치:

    • Oracle rightarrow\\rightarrow PostgreSQL: PostgreSQL ODBC 드라이버 (pgeSQL ODBC) 설치
    • Oracle rightarrow\\rightarrow MySQL: MySQL Connector/ODBC 설치
  2. Gateways 설정:

    • $ORACLE_HOME/hs/admin 디렉토리에 초기화 파일(init<sid>.ora) 생성 및 설정.
    • tnsnames.ora 파일에 Gateway 서비스 정의.
    • listener.ora 파일에 Gateway 프로그램 등록.

    참고: 이 과정은 Oracle 환경 설정에 대한 깊은 이해가 필요하며, 도커 환경에서는 더욱 복잡합니다.

Gateway 설정이 완료되어 TNS Alias(tnsnames.ora에 정의된 별칭)가 준비되었다면, Oracle SQL*Plus 또는 SQL Developer에서 DB Link를 생성합니다.

CREATE DATABASE LINK <link_name>
CONNECT TO <remote_db_user> IDENTIFIED BY <remote_db_password>
USING '<tns_alias>';
-- 예시: CREATE DATABASE LINK PG_LINK CONNECT TO pguser IDENTIFIED BY pgpass USING 'PG_GW_TNS';

3. 연결 확인 방법

DB 링크 설정이 완료되었다면, 원격 DB의 데이터를 조회하여 연결을 확인합니다.

3.1. PostgreSQL (FDW 사용 시)

PostgreSQL에서 외래 테이블 별칭을 사용하여 일반 쿼리처럼 조회합니다.

-- 외래 테이블 별칭을 통해 원격 Oracle의 데이터를 조회
SELECT * FROM <local_table_alias> LIMIT 10;

또는 dblink 확장(PostgreSQL rightarrow\\rightarrow PostgreSQL 연결에 주로 사용)을 설치했다면 아래와 같이 원격 SQL을 직접 실행하여 확인할 수도 있습니다.

-- dblink 확장 설치가 필요하며, FDW 설정과는 별개입니다.
-- CREATE EXTENSION dblink;
SELECT * FROM dblink('host=<remote_host> user=<remote_user> password=<remote_pass> dbname=<remote_db>', 'SELECT * FROM remote_table_name LIMIT 1')
AS t1(col1 text, col2 int); -- 반환 컬럼 구조를 명시해야 함

Oracle에서 DB Link 이름@ 기호와 함께 사용하여 원격 DB의 테이블을 조회합니다.

-- 생성된 DB Link를 사용하여 원격 DB의 테이블 조회
SELECT * FROM <remote_table_name>@<link_name> WHERE ROWNUM <= 10;
-- 예시: SELECT * FROM DEPARTMENTS@PG_LINK;

연결 테스트를 위해 DUAL 테이블(Oracle)이나 원격 DB의 간단한 시스템 테이블을 조회해볼 수도 있습니다.

-- Oracle -> PostgreSQL 연결 확인 예시
SELECT * FROM DUAL@PG_LINK;
-- Oracle -> MySQL 연결 확인 예시
SELECT 'Connection OK' FROM DUAL@MYSQL_LINK;

도커 환경 생각해봐야할 주의점

  1. 네트워크 구성: 모든 컨테이너가 서로 IP나 호스트 이름으로 통신 가능해야 합니다. (동일한 Docker Network에 배치 권장)
  2. 포트 노출: 각 DB 컨테이너의 포트(Oracle: 1521, PostgreSQL: 5432, MySQL: 3306)가 다른 컨테이너에서 접근 가능해야 합니다.
  3. 클라이언트 라이브러리: 연결 주체(Source DB) 컨테이너 내부에 대상 DB의 클라이언트 라이브러리FDW/Gateway/ODBC 관련 설정이 필요하며, 이는 가장 까다로운 부분입니다.
    • PostgreSQL: *_fdw 확장 및 해당 클라이언트 라이브러리
    • Oracle: Generic Connectivity (DG4ODBC) 및 해당 ODBC 드라이버

도커 이미지를 직접 수정하거나 필요한 패키지를 컨테이너 실행 후 수동으로 설치하는 방법을 고려해야 합니다.

profile
에러가 나도 괜찮아 — 그건 내가 배우고 있다는 증거야.

0개의 댓글