CUBRID DBLink란
데이터베이스에서 정보를 조회하다 보면 종종 외부 데이터베이스의 정보 조회가 필요한 경우가 있습니다.이렇게 외부 데이터베이스의 정보를 조회하기 위해서 CUBRID DBLink를 이용하면 CUBRID, Oracle, MySQL의 데이터베이스의 정보를 조회할 수 있도록 기능을 제공하며, 타 데이터베이스의 정보를 마치 하나의 데이터베이스에서 조회하는 것과 같은 효과를 발휘합니다.
이 글에서는 CUBRID DBLink와 Oracle의 데이터베이스의 정보를 조회하는 방법을 가이드합니다.
적용 환경
- OS 버전 : Centos7 Linux 7
- CUBRID 버전 : CUBRID 11.2.1
- Oracle 버전 : Oracle21.3.0.0.0
CUBRID DBLink 설정
다음은 CUBRID에서 Oracle DBLink를 위한 설정 방법입니다.
설정에 필요한 부분들은 다음과 같이 설정하였습니다.
- Oracle Server IP : 192.168.64.152
- Oracle Server Port : 1521
- Oracle SID : orcl
- Oracle 계정 : c##test
- Oracle 계정 암호 : test
- CUBRID Server IP : 192.168.64.153
- CUBRID DB명 : demodb
* Oracle 테이블 정보
create table code( s_name char(1), f_name varchar(6) ); |
1. Oracle 설정
1-1) Oracle Client, ODBC Driver 설치
Oracle Instant Clien, Oracle ODBC Drivert를 CUBRID가 설치된 서버에 cubrid계정으로 설치합니다.
Oracle 버전에 맞는 Basic Package (ZIP), ODBC Package (ZIP)을 다운받아 동일 폴더에 압축을 풉니다.
- Oracle Client 설치 예시)
[cubrid@localhost]$ unzip instantclient-basic-linux.x64-21.7.0.0.0dbru.zip
- Oracle ODBC Driver 설치 예시)
[cubrid@localhost]$ unzip instantclient-odbc-linux.x64-21.7.0.0.0dbru.zip
- Oracle 다운로드 홈페이지 : https://www.oracle.com/kr/database/technologies/instant-client/downloads.html
1-2) tnsnames.ora 파일 설정
Oracle Client, ODBC Driver 설치된 경로에 tnsnames.ora 파일을 생성합니다.
-
ALIAS명 : DB 연결정보명
-
HOST : Oracle이 설치된 IP
-
PORT : Oracle server Port 번호
-
SERVICE_NAME : DB명
ALIAS명= (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST =HOST)(PORT = PORT)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = SERVICE_NAME) ) ) |
tnsnames.ora파일 설정 예시)
#[cubrid@localhost]$ vi /home/user/oracle/instantclient/tnsnames.ora (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.64.152)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcl) ) ) |
1-3) 환경변수 설정
cubrid 계정에서 환경변수 설정 후 설정값을 적용합니다.
- 환경변수 설정 예시)
#[cubrid@localhost]$ vi $HOME/.bash_profile
export ORACLE_HOME=/home/user/oracle/instantclient #oracle client가 설정된 경로
export PATH=$PATH:$ORACLE_HOME
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME
export TNS_ADMIN=$ORACLE_HOME
[cubrid@localhost]$ source $HOME/.bash_profile
1-4) ODBC Driver Name 확인 및 설정
Linux의 경우, Oracle ODBC Driver Name을 설정하기 위해서는 unixODBC를 설치 한 후 /etc/odbcinit.ini 파일에 Driver name을 작성해야 합니다.
unixODBC 드라이버 관리자는 Linux 및 UNIX 운영 체제에서 ODBC 드라이버 와 함께 사용할 수 있는 오픈 소스 ODBC 드라이버 관리자입니다.
- unixODBC 설치 예시
[root@localhost]$ yum install unixODBC.x86_64
설치 관련 자세한 내용은 http://www.unixodbc.org의 download를 참고
- unixODBC 설치 확인 및 odbcinst.ini 위치를 알 수 있다.
[root@localhost ~]# odbcinst -j
unixODBC 2.3.1
DRIVERS............: /etc/odbcinst.ini
SYSTEM DATA SOURCES: /etc/odbc.ini
FILE DATA SOURCES..: /etc/ODBCDataSources
USER DATA SOURCES..: /root/.odbc.ini
SQLULEN Size.......: 8
SQLLEN Size........: 8
1-5) odbcinst.ini 설정
-
odbcinst.ini 설정 예시
#[cubrid@localhost]$ vi /etc/odbcinst.ini
# 세션의 이름이 driver 이름입니다.
# cubrid_gateway.conf의 CGW_LINK_ODBC_DRIVER_NAME 세션의 이름을 작성해야 합니다.
[Oracle ODBC driver]
Driver=/home/user/oracle/instantclient_21_6/libsqora.so.21.1
2. CUBRID 설정
CUBRID gateway
게이트웨이는 CUBRID 데이터베이스 서버가 타 데이터베이스 서버에 연결할 수 있도록 중계하는 미들웨어 이다.
cubrid_gateway.conf 설정
-
SERVICE 를 ON으로 변경
-
CGW_LINK_SERVER_IP 에 oracle database 서버의 ip주소 설정
-
CGW_LINK_SERVER_PORT 에 oracle database 서버의 port 설정
-
CGW_LINK_ODBC_DRIVER_NAME 에 odbcinst.ini에서 설정한 세션의 이름(Oracle ODBC driver)
* Oracle DBLink 시 TNS를 사용하여 CGW_LINK_SERVER_IP,CGW_LINK_SERVER_PORT를 사용하지 않으므로 설정할 필요 없습니다.
* 추가적인 GATEWAY 파라메터 설명은 메뉴얼을 참고
https://www.cubrid.org/manual/ko/11.2/sql/dblink.html
[gateway]
|
cubrid_gateway.conf 확인
gateway 설정값을 확인 시 cubrid_gateway.conf 파일 열기 또는 cubrid gateway info 명령어를 통해 확인할 수 있습니다.
- cubrid gateway info 예시)
[cubrid@localhost]$ cubrid gateway info
#
# cubrid_gateway.conf
## gateway parameters were loaded from the files
# /home/cubrid/CUBRID-11.2.1.0677-82f461a-Linux.x86_64/conf/cubrid_gateway.conf# gateway parameters
[gateway]
MASTER_SHM_ID =50001[%oracle_gateway]
SERVICE =ON
APPL_SERVER =CAS_CGW
MIN_NUM_APPL_SERVER =5
MAX_NUM_APPL_SERVER =40
APPL_SERVER_SHM_ID =53000
SSL =OFF
APPL_SERVER_MAX_SIZE =256
SESSION_TIMEOUT =300
LOG_DIR =/home/cubrid/CUBRID-11.2.1.0677-82f461a-Linux.x86_64/log/gateway/sql_log
SLOW_LOG_DIR =/home/cubrid/CUBRID-11.2.1.0677-82f461a-Linux.x86_64/log/gateway/sql_log
ERROR_LOG_DIR =/home/cubrid/CUBRID-11.2.1.0677-82f461a-Linux.x86_64/log/gateway/error_log
LOG_BACKUP =OFF
SOURCE_ENV =
SQL_LOG =ALL
SLOW_LOG =ON
SQL_LOG_MAX_SIZE =10240
LONG_QUERY_TIME =60.00
LONG_TRANSACTION_TIME =60.00
AUTO_ADD_APPL_SERVER =ON
JOB_QUEUE_SIZE =1024
TIME_TO_KILL =120
ACCESS_LOG =OFF
ACCESS_LOG_MAX_SIZE =10240K
ACCESS_LOG_DIR =/home/cubrid/CUBRID-11.2.1.0677-82f461a-Linux.x86_64/log/gateway
ACCESS_LIST =
MAX_STRING_LENGTH =-1
KEEP_CONNECTION =AUTO
STATEMENT_POOLING =ON
CCI_PCONNECT =OFF
ACCESS_MODE =RW
CONNECT_ORDER =SEQ
MAX_NUM_DELAYED_HOSTS_LOOKUP =-1
RECONNECT_TIME =600
REPLICA_ONLY =OFF
TRIGGER_ACTION =ON
MAX_QUERY_TIMEOUT =0
ENABLE_MONITOR_HANG =OFF
ENABLE_MONITOR_SERVER =ON
REJECTED_CLIENTS_COUNT =0
STRIPPED_COLUMN_NAME =ON
CACHE_USER_INFO =OFF
SQL_LOG2 =0
BROKER_PORT =53000
APPL_SERVER_NUM =5
APPL_SERVER_MAX_SIZE_HARD_LIMIT =1024
MAX_PREPARED_STMT_COUNT =2000
PREFERRED_HOSTS =
JDBC_CACHE =OFF
JDBC_CACHE_HINT_ONLY =OFF
JDBC_CACHE_LIFE_TIME =1000
CCI_DEFAULT_AUTOCOMMIT =ON
MONITOR_HANG_INTERVAL =60
HANG_TIMEOUT =60
REJECT_CLIENT_FLAG =ON
CGW_LINK_SERVER =ORACLE
CGW_LINK_SERVER_IP =
CGW_LINK_SERVER_PORT =1521
CGW_LINK_ODBC_DRIVER_NAME =Oracle ODBC driver
CGW_LINK_CONNECT_URL_PROPERTY =
gateway 상태 확인
cubrid gateway status 명령어를 통하여 현재 gateway 상태를 확인할 수 있습니다.
- cubrid gateway info 예시)
[cubrid@localhost]$ cubrid gateway status
@ cubrid gateway status
% oracle_gateway
----------------------------------------------------------------------
ID PID QPS LQS PSIZE STATUS
----------------------------------------------------------------------
1 13492 0 0 50928 IDLE
2 13493 0 0 50928 IDLE
3 13494 0 0 50928 IDLE
4 13495 0 0 50928 IDLE
5 13496 0 0 50928 IDLE
CUBRID DBLink 사용 예시
1. Oracle 데이터 조회
타 데이터베이스의 데이터 조회를 위한 DBLINK Query문 작성 방법은 2가지이며 그 중 FROM절에 DBLINK 구문을 작성하여 데이터를 조회하는 방법입니다.
SELECT * FROM DBLINK ('Target CUBRID IP:broker-port:db-name:user:password:','SELECT select-list FROM remote_table') AS t(column-name column-type, …);
* Oracle DBLink 시 db-name을 tnsnames.ora 파일에서 명시한 ALIAS명으로 사용해야 합니다.
다음 구문은 CUBRID에서 Oracle의 code 테이블 정보를 조회하는 예시입니다.
csql> SELECT * FROM DBLINK ('192.168.64.153:53000:orcl:c##test:test:','select s_name, f_name from code') AS O(s_name varchar(10), f_name varchar(10)); === <Result of SELECT Command in Line 1> === s_name f_name |
2. Oracle 서버 등록 후 데이터 조회
타 데이터베이스의 데이터 조회를 위한 DBLINK Query문 중 SERVER를 활용하여 데이터를 조회하는 방법입니다.
DBLINK Query를 작성할 때 마다 매번 작성해야 하는 번거로움과 사용자 정보(id, password) 가 외부로 노출될 우려가 있습니다. 이런 번거로움과 정보 보호를 위해 CREATE SERVER문을 이용하면, Query문 보다 간단하고, 사용자 정보 보호에 도움이 됩니다.
2-1) 서버 등록
CREATE SERVER문을 사용하여 원격 접속 정보를 생성합니다. 생성된 서버는 DBLINK를 이용하는 SELECT 질의를 수행 할 때 원격 서버를 지정하는데 사용합니다.
CREATE SERVER server-name(HOST,PORT,DBNAME,USER,PASSWORD,PROPERTIES,COMMENT);
*option: PASSWORD,PROPERTIES,COMMENT
다음 구문은 "remote_oracle"라는 이름으로 서버를 등록하는 예시입니다.
#서버 등록 ( HOST='192.168.64.153', PORT=53000, DBNAME=orcl, USER=c##test, PASSWORD='test'); |
2-2) 서버 등록 확인
다음 구문은 DB_SERVER 테이블에 서버가 등록된 것을 확인하는 예시입니다.
csql> SELECT * FROM DB_SERVER WHERE link_name='remote_oracle'; link_name host port db_name user_name properties owner comment ===================================================================================================================== 'remote_oracle' '192.168.64.153' 53000 'orcl' 'c##test' NULL 'PUBLIC' NULL |
2-3) 서버 등록 후 데이터 조회
다음은 Create server 구문으로 만든 remote_oracle(서버명)을 조회하는 예시입니다.
SELECT * FROM DBLINK (서버명,'SELECT select-list FROM remote_table') AS t(column-name column-type, …);
#데이터 조회 FROM DBLINK (remote_oracle,'select s_name, f_name from code') AS O(s_name varchar(10), f_name varchar(10)); === <Result of SELECT Command in Line 1> === s_name f_name |
3. Oracle VIEW 등록 및 조회
3-1) Oracle VIEW 등록
Oracle 데이터 조회 구문을 view로 생성하여 사용가능합니다.
다음 구문은 Oracle의 code 테이블을 조회하는 구문을 View(test_view) 등록하는 예시입니다.
csql> create view test_view as select * from dblink('192.168.64.153:53000:orcl:c##test:test:','SELECT * FROM TBL1') AS O(COL1 VARCHAR(10), COL2 VARCHAR(10)); |
3-2) Oracle VIEW 등록 후 조회
다음 구문은 View(test_view) 등록 후 조회 시 예시입니다.
csql> select * from test_view; === <Result of SELECT Command in Line 1> === s_name f_name |
4. HA 환경에서 DBLink
HA 환경에서 절체되었을 경우 기존 슬레이브에서 Oracle 연결을 위해 gateway로 접속을 해야합니다. 일반적으로 gateway는 CUBRID DB 서버상에 설정하는데, 절체되었을 때 기존 master가 shutdown 된 경우, 기존 master의 gateway로는 접속이 불가능해지므로 Oracle DBLink 연결을 위해 접속할 gateway는 slave 상의 gateway로 접속을 해야 합니다.
따라서, HA 환경에서 master/slave 모두 동일하게 gateway를 설정하여야 하며, DBLink를 위한 서버 설정 시 gateway 서버의 주소를 localhost로 해줘야, 절체 후 자신의 서버의 gateway를 통해 Oracle과 연결이 가능해집니다.
DBLink 시 사용하는 server는 master에서 등록 시 slave에도 복제가 됩니다.
csql> CREATE SERVER remote_oracle ( HOST='localhost', PORT=53000, DBNAME=orcl, USER=c##test, PASSWORD='test'); |
master/slave는 동일하게 적용된것을 확인할 수 있습니다.
# master 결과 FROM DB_SERVER WHERE link_name='remote_oracle'; link_name host port db_name user_name properties owner comment ==================================================================================================================== 'remote_oracle' 'localhost' 53000 'orcl' 'c##test' NULL 'PUBLIC' NULL
# slave 결과 csql> SELECT * FROM DB_SERVER WHERE link_name='remote_oracle'; link_name host port db_name user_name properties owner comment ==================================================================================================================== 'remote_oracle' 'localhost' 53000 'orcl' 'c##test' NULL 'PUBLIC' NULL |
DBLink 사용 시 볼 수 있는 에러 메시지
- ERROR: dblink - Cannot connect to CUBRID CAS
- 원인 : ip,port 정보 불일치
- ERROR: dblink - Connection timed out
- 원인 : Oracle Listener 중지 상태, Listener 구동 후 정상동작