“ 매주 목요일마다 당신이 항상 하던대로 신발끈을 묶으면 신발이 폭발한다고 생각해보라.
컴퓨터를 사용할 때는 이런 일이 항상 일어나는데도 아무도 불평할 생각을 안 한다. ”- Jef Raskin
맥의 아버지 - 애플컴퓨터의 매킨토시 프로젝트를 주도
DBLINK의 개념과 필요성 이해하기
오라클 DBLINK에 대해서 알아봅시다!
실무에서 단일 오라클 데이터베이스만 사용하는 경우보다 여러 종류의 DBMS(ORACLE, MYSQL, POSTGRESQL 등)을 함께 사용하는 경우가 많습니다.
예를 들어, 현재 시스템에서 타 시스템과 연계하여 자료를 보여주어야 하는 경우가 흔히 많이 있습니다.
이때 DBLINK(Database Link)기능과 게이트웨이(Database Gateway, ODBC 연동)을 활용하면 서로 다른 DB간에도 데이터를 연계할 수 있습니다.
이번에는 오라클 DBLINK 개념과 설정 방법을 설명한 후 연결하는 방법등을 알아보려고 합니다.
목차
DBLINK
DBLINK란?
오라클 DB에서 원격 DB(SQL 실행대상)에 접근할 수 있게 해주는 객체입니다.
용도의 경우 원격 DB 테이블 조회 및 조작, 분산 트랜잭션 처리, 이기종 DB 통합 등의 용도가 있습니다.
오라클에서 오라클 DBLINK
--생성 방법 1
CREATE DATABASE LINK remote_link
CONNECT TO remote_user IDENTIFIED BY password
USING 'tns_alias'; -- tnsnames.ora에 있는 이름과 맞춰야 함.
-- 생성 방법 2
CREATE DATABASE LINK remote_link
CONNECT TO TEST
IDENTIFIED BY "비밀이다"
USING '(DESCRIPTION=
(ADDRESS=(PROTOCOL=TCP)(HOST=127.0.0.1)(PORT=1521))
(CONNECT_DATA=(SERVICE_NAME=TEST))
)';
--확인 및 삭제
SELECT * FROM user_db_links;
DROP DATABASE LINK remote_link;
PUBLIC DBLINK vs PRIVATE DBLINK
Private DBLINK : 생성한 사용자만 사용가능
Public DBLINK : 모든 사용자가 사용 가능 (보안 위협증가)
오라클에서 MYSQL DBLINK
오라클은 MYSQL과 직접 DBLINK라는 것을 지원하지 않습니다. 대신 Oracle Database Gateway for ODBC(DG4ODBC) 또는 hsodbc를 이용합니다.
1. ODBC 드라이버 설치
MYSQL ODBC 드라이버(Connector/ODBC) 설치
2. odbc.ini 등록 (Linux)
[mysql_dsn]
Driver=/usr/lib/libmyodbc5.so
Description=MySQL ODBC Driver
Server=127.0.0.1
Port=3306
Database=testdb
User=testuser
Password=testpwd
3. tnsnames.ora 등록
MYSQL_DBLINK =
(DESCRIPTION =
(ADDRESS = (PROTOCOL=TCP)(HOST=127.0.0.1)(PORT=1521))
(CONNECT_DATA = (SID=dg4odbc))
(HS=OK)
)
4. DBLINK 생성
CREATE DATABASE LINK mysql_link
CONNECT TO "testuser" IDENTIFIED BY "testpwd"
USING 'MYSQL_DBLINK';
5. 조회 & 삭제
-- 조회
SELECT * FROM dba_db_links;
SELECT * FROM user_db_links;
-- 삭제
DROP DATABASE LINK remote_link;
6. 사용예시
SELECT * FROM customers@mysql_link;
오라클에서 PostgreSQL 연결
PostgreSQL도 동일하게 DG4ODBC또는 Oracle Gateway for ODBC를 활용합니다.
1. PostgreSQL ODBC 드라이버 설치
psqlODBC 설치
2. odbc.ini 등록
[pg_dsn]
Driver=/usr/lib/psqlodbcw.so
Description=PostgreSQL ODBC
Servername=127.0.0.1
Port=5432
Database=pgdb
Username=pguser
Password=pgpwd
3. tnsnames.ora 등록
POSTGRES_DBLINK =
(DESCRIPTION =
(ADDRESS = (PROTOCOL=TCP)(HOST=127.0.0.1)(PORT=1521))
(CONNECT_DATA = (SID=dg4odbc))
(HS=OK)
)
4. DBLINK 생성
CREATE DATABASE LINK pg_link
CONNECT TO "pguser" IDENTIFIED BY "pgpwd"
USING 'POSTGRES_DBLINK';
5. 사용예시
SELECT * FROM orders@pg_link;
실제 운영 환경 문제
성능저하 : 이기종 DB는 변환 오버헤드가 크므로 대량 데이터 전송 시 ETL 권장
문자셋 문자 : MYSQL, POSTGRESQL에서 ORACLE 간 UTF-8에서 AL32UTF8 변환 오류 가능 -> HS_LANGUAGE 설정
트랜잭션 문제 : 분산 트랜잭션은 안전성이 떨어지므로 단일 조회 용도로만 DBLINK 권장
DBLINK 사용 시 주의사항
성능 이슈
- 네트워크 지연 발생 가능
- 대량 데이터 전송 시 성능 저하
- JOIN 시 원격 DB에서 실행계획 차이 발생
보안 고려사항
- PUBLIC DBLINK 사용 최소화
- 비밀번호 암호화 문제 (12c 이후부터는 암호화 저장 지원)
- 권한 분리 원칙 적용
대안 기술
- ORACLE GOLDENGATE - 실시간 복제
- ORACLE DATA GUARD - 고가용성 환경
- ETL 도구 - 대용량 데이터 이동
DBLINK 대안 기술
Oracle GoldenGate : 실시간 복제 (이기종 DB 지원)
ETL 도구(Informatica, ODI 등) : 대용량 데이터 이동
Kafka + CDC : 실시간 데이터 스트리밍
마무리
DBLINK는 오라클간 연결뿐 아니라 MYSQL, POSTGRESQL 같은 이기종 DB 연결에도 활용 가능합니다. 하지만 이기종 DB 연결은 성능 저하, 문자셋, 트랜잭션 제약이 있으므로 소규모 조회, 연계 용도에 적합합니다. 운영환경에서는 DBLINK를 남용하기보다 데이터복제-ETL-CDC 같은 전문 솔루션과 함께 고려하는 것이 바람직합니다.