
도커 환경에서 PostgreSQL, Oracle, MySQL 간의 DB 링크(Database Link)를 설정하는 방법은 데이터베이스 간의 특성 차이로 인해 일반적으로 Foreign Data Wrapper (FDW)나 Gateway/Heterogeneous Services를 사용합니다.
도커 환경이므로, 컨테이너들이 서로 통신할 수 있도록 동일한 도커 네트워크에 있거나 컨테이너 IP 및 포트가 노출되어야 합니다.
PostgreSQL은 외부 데이터베이스에 연결하기 위해 Foreign Data Wrapper (FDW) 확장을 사용하는 것이 일반적입니다.
컨테이너 접속:
docker exec -it <postgresql_container_name> /bin/bash
필수 패키지 및 클라이언트 설치:
oracle_fdw 확장을 사용하며, 이를 위해서는 PostgreSQL 컨테이너 내부에 Oracle Instant Client가 설치되어야 합니다.mysql_fdw 확장을 사용하며, 이를 위해서는 MySQL 클라이언트 라이브러리가 설치되어야 합니다.참고: FDW 설치 및 클라이언트 라이브러리 설정은 도커 이미지의 베이스 OS와 버전에 따라 매우 복잡할 수 있습니다. 이미지를 커스텀하여 빌드하거나 필요한 패키지를 컨테이너 내에서 직접 설치해야 할 수 있습니다.
여기서는 PostgreSQL Oracle 연결을 예시로, oracle_fdw를 사용한 방법을 설명합니다. (MySQL 연결은 mysql_fdw를 사용하며 과정은 유사합니다.)
-- PostgreSQL 접속 후
CREATE EXTENSION oracle_fdw;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 주소 또는 호스트 이름 (도커 네트워크 내 이름)CREATE USER MAPPING FOR <local_user>
SERVER <server_name>
OPTIONS (user '<remote_oracle_user>', password '<remote_oracle_password>');
-- <local_user>는 PostgreSQL에서 쿼리를 실행할 사용자CREATE FOREIGN TABLE <local_table_alias> (
column1 data_type,
column2 data_type
-- ... 원격 테이블의 컬럼 구조와 일치해야 합니다.
)
SERVER <server_name>
OPTIONS (table '<remote_oracle_table_name>');Oracle에서 다른 이기종(Heterogeneous) DB로 연결할 때는 Oracle Gateway 또는 Heterogeneous Services (HS)를 사용해야 합니다.
Oracle이 PostgreSQL 또는 MySQL에 접속하려면, Oracle 홈 디렉토리 내에 Generic Connectivity (DG4ODBC)를 설정해야 하며, 이를 위해 Oracle 컨테이너 내부에 ODBC 드라이버를 설치해야 합니다.
ODBC 드라이버 설치:
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';
DB 링크 설정이 완료되었다면, 원격 DB의 데이터를 조회하여 연결을 확인합니다.
PostgreSQL에서 외래 테이블 별칭을 사용하여 일반 쿼리처럼 조회합니다.
-- 외래 테이블 별칭을 통해 원격 Oracle의 데이터를 조회
SELECT * FROM <local_table_alias> LIMIT 10;
또는 dblink 확장(PostgreSQL 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;
*_fdw 확장 및 해당 클라이언트 라이브러리도커 이미지를 직접 수정하거나 필요한 패키지를 컨테이너 실행 후 수동으로 설치하는 방법을 고려해야 합니다.