:meta-keywords: cubrid dblink :meta-description: CUBRID supports DBLink, which can connect to an external server and search information. *********************** CUBRID DBLink *********************** .. _dblink-introduction: CUBRID DBLink 소개 ============================================== ë°ì´í„°ë² ì´ìФì—서 ì •ë³´ë¥¼ 조회하다 ë³´ë©´ 종종 외부 ë°ì´í„°ë² ì´ìŠ¤ì˜ ì •ë³´ 조회가 필요한 경우가 있다. ì´ë ‡ê²Œ 외부 ë°ì´í„°ë² ì´ìŠ¤ì˜ ì •ë³´ë¥¼ 조회하기 위해서 CUBRID DBLink를 ì´ìš©í•˜ë©´ 타 ë°ì´í„°ë² ì´ìŠ¤ì˜ ì •ë³´ë¥¼ ì¡°íšŒí• ìˆ˜ 있다. CUBRID DBLink는 ë™ì¼ ê¸°ì¢…ì¸ CUBRID와 ì´ê¸°ì¢…ì¸ Oracle, MySQL, MariaDBì˜ ë°ì´í„°ë² ì´ìŠ¤ì˜ ì •ë³´ë¥¼ ì¡°íšŒí• ìˆ˜ 있ë„ë¡ ê¸°ëŠ¥ì„ ì œê³µí•˜ê³ ìžˆë‹¤. 외부 ë°ì´í„°ë² ì´ìŠ¤ì˜ ì •ë³´ë¥¼ 마치 í•˜ë‚˜ì˜ ë°ì´í„°ë² ì´ìФì—서 조회하는 것과 ê°™ì€ íš¨ê³¼ë¥¼ 발휘한다. 단 외부 ë°ì´í„°ë² ì´ìŠ¤ë¥¼ 여러 ê°œ ì„¤ì •ì€ ê°€ëŠ¥ 하나, ì •ë³´ë¥¼ ì¡°íšŒí• ë•ŒëŠ” 한 ê°œì˜ íƒ€ ë°ì´í„°ë² ì´ìŠ¤ì˜ ì •ë³´ë§Œ ì¡°íšŒí• ìˆ˜ 있다. CUBRID DBLink는 SELECTì˜ FROMì ˆì— ì—°ê²°ë 서버와 실행ë 질ì˜ë¥¼ 명시한 DBLINK 구문 형ì‹ê³¼ ì›ê²© í…Œì´ë¸” (í…Œì´ë¸” 확장명) 형ì‹ìœ¼ë¡œ 사용 가능하며, INSERT/REPLACE/UPDATE/DELETE/MERGEêµ¬ë¬¸ì€ ì›ê²© í…Œì´ë¸” 형ì‹ë§Œ ì‚¬ìš©í• ìˆ˜ 있다. .. _dblink-diagram: CUBRID DBLink êµ¬ì„±ë„ ============================================== CUBRID DBLink는 ë™ì¼ê¸°ì¢… ê°„ì— DBLink와 ì´ê¸°ì¢… ê°„ì˜ DBLink를 ì§€ì›í•œë‹¤. ë™ì¼ê¸°ì¢… ê°„ì˜ DBLink êµ¬ì„±ë„ ----------------------------- ë™ì¼ê¸°ì¢…ì˜ ì™¸ë¶€ ë°ì´í„°ë² ì´ìŠ¤ì˜ ì •ë³´ë¥¼ 조회하기 위한 구성ë„를 ë³´ë©´ Database Serverì—서 CCI를 ì´ìš©í•˜ì—¬ ë™ì¼ê¸°ì¢…ì˜ Brokersì— ì ‘ì†í•˜ì—¬ 외부 ë°ì´í„°ë² ì´ìŠ¤ì˜ ì •ë³´ë¥¼ ì¡°íšŒí• ìˆ˜ 있다. .. image:: /images/dblink_homo.png ì´ê¸°ì¢… ê°„ì˜ DBLink êµ¬ì„±ë„ ----------------------------- ì´ê¸°ì¢… ë°ì´í„°ë² ì´ìŠ¤ì˜ ì •ë³´ë¥¼ 조회하기 위한 구성ë„를 ë³´ë©´ 게ì´íŠ¸ì›¨ì´ë¥¼ 통해서 ì´ê¸°ì¢… ë°ì´í„°ë² ì´ìŠ¤ì˜ ì •ë³´ë¥¼ ì¡°íšŒí• ìˆ˜ 있다. 게ì´íŠ¸ì›¨ì´ëŠ” 연결하는 ë°ì´í„°ë² ì´ìŠ¤ì˜ ODBC(Open DataBase Connectivity) 드ë¼ì´ë²„를 ì´ìš©í•˜ê³ 있다. .. image:: /images/dblink_heter.png .. _gateway-info: DBLink를 위한 게ì´íŠ¸ì›¨ì´ ============================================== 게ì´íŠ¸ì›¨ì´ëŠ” CUBRID ë°ì´í„°ë² ì´ìŠ¤ì™€ ì´ê¸°ì¢… ë°ì´í„°ë² ì´ìФ ê°„ì˜ ì¤‘ê°œí•˜ëŠ” 미들웨어로 브로커(Broker)와 ìœ ì‚¬í•˜ë‹¤. 게ì´íŠ¸ì›¨ì´ëŠ” ì´ê¸°ì¢… ë°ì´í„°ë² ì´ìФ 서버 (Oracle/MySQL/MariaDB 등)ì— ì—°ê²°í•˜ê³ ë°ì´í„°ë¥¼ 조회하여 CUBRID ë°ì´í„°ë² ì´ìФ ì„œë²„ì— ì „ë‹¬í•˜ëŠ” ì—í• ì„ í•œë‹¤. 게ì´íŠ¸ì›¨ì´ë¥¼ í¬í•¨í•˜ëŠ” í브리드 ì‹œìŠ¤í…œì€ ì•„ëž˜ 그림과 ê°™ì´ cub_gateway, cub_cas_cgw를 í¬í•¨í•œ 다중 계층 구조를 가진다. .. image:: /images/gateway.png cub_cas_cgw ---------------- cub_cas_cgw(CAS Gateway)는 CUBRID Database Serverì—서 ì™¸ë¶€ì˜ Databaseì˜ ì—°ê²°ì„ ìš”ì²í•˜ëŠ” 공용 서버 ì—í• ì„ í•œë‹¤. ë˜í•œ, cub_cas_cgw는 ë°ì´í„°ë² ì´ìФ ì„œë²„ì˜ í´ë¼ì´ì–¸íŠ¸ë¡œ ë™ìž‘하여 CUBRID Database Serverì˜ ìš”ì²ì— ì˜í•´ 외부 ë°ì´í„°ë² ì´ìФ 서버와 ì—°ê²°ì„ ì œê³µí•œë‹¤. 서비스 í’€(service pool) ë‚´ì—서 구ë™ë˜ëŠ” cub_cas_cgwì˜ ê°œìˆ˜ëŠ” cubrid_gateway.conf ì„¤ì • 파ì¼ì— ì§€ì •í• ìˆ˜ 있으며, cub_gatewayì— ì˜í•´ ë™ì 으로 ì¡°ì •ëœë‹¤. cub_gateway ---------------- cub_gateway는 CUBRID Database Server와 cub_cas_cgw 사ì´ì˜ ì—°ê²°ì„ ì¤‘ê°œí•˜ëŠ” ê¸°ëŠ¥ì„ ìˆ˜í–‰í•œë‹¤. 즉, CUBRID Database Serverê°€ ì ‘ê·¼ì„ ìš”ì²í•˜ë©´, cub_gateway는 ê³µìœ ë©”ëª¨ë¦¬(shared memory)를 통해 cub_cas_cgwì˜ ìƒíƒœë¥¼ 파악하여 í• ë‹¹ 가능한 cub_cas_cgwì—게 ìš”ì²ì„ ì „ë‹¬í•˜ê³ , 해당 cub_cas_cgw로부터 ì „ë‹¬ë°›ì€ ìš”ì²ì— 대한 처리 결과를 CUBRID Database Serverì—게 반환한다. ë˜í•œ, cub_gateway는 서비스 í’€ ë‚´ì˜ cub_cas_cgw 개수를 ì¡°ì •í•˜ì—¬ 서버 부하를 ê´€ë¦¬í•˜ê³ , cub_cas_cgwì˜ êµ¬ë™ ìƒíƒœë¥¼ ëª¨ë‹ˆí„°ë§ ë° ê´€ë¦¬í•œë‹¤. 만약, CUBRID Database Serverì˜ ìš”ì²ì„ cub_cas_cgw 1ì—게 ì „ë‹¬í•˜ì˜€ëŠ”ë°, ë¹„ì •ìƒì ì¸ ì¢…ë£Œë¡œ ì¸í•´ cub_cas_cgw 1ê³¼ì˜ ì—°ê²°ì´ ì‹¤íŒ¨í•˜ë©´, cub_gateway는 CUBRID Database Serverì—게 ì—°ê²° ì‹¤íŒ¨ì— ê´€í•œ ì—러 메시지를 ì „ì†¡í•˜ê³ cub_cas_cgw 1ì„ ìž¬êµ¬ë™í•œë‹¤. 새ë¡ê²Œ 구ë™ëœ cub_cas_cgw 1ì€ ì •ìƒì ì¸ ëŒ€ê¸° ìƒíƒœê°€ ë˜ì–´, 새로운 ì‘ìš© í´ë¼ì´ì–¸íŠ¸ì˜ ìš”ì²ì— ì˜í•´ 재연결ëœë‹¤. ê³µìœ ë©”ëª¨ë¦¬ ----------------- ê³µìœ ë©”ëª¨ë¦¬ì—는 cub_cas_cgwì˜ ìƒíƒœ ì •ë³´ê°€ ì €ìž¥ë˜ë©°, cub_gateway는 ê³µìœ ë©”ëª¨ë¦¬ì— ì €ìž¥ëœ cub_cas_cgwì˜ ìƒíƒœ ì •ë³´ë¥¼ 참조하여 CUBRID Database Serverì™€ì˜ ì—°ê²°ì„ ì¤‘ê°œí•œë‹¤. ê³µìœ ë©”ëª¨ë¦¬ì— ì €ìž¥ëœ cub_cas_cgwì˜ ìƒíƒœ ì •ë³´ë¥¼ 통해 시스템 관리ìžëŠ” ì–´ë–¤ cub_cas_cgwê°€ 현재 ìž‘ì—…ì„ ìˆ˜í–‰ 중ì¸ì§€ 확ì¸í• 수 있다. 게ì´íŠ¸ì›¨ì´ êµ¬ë™ --------------- 게ì´íŠ¸ì›¨ì´ë¥¼ 구ë™í•˜ê¸° 위하여 다ìŒê³¼ ê°™ì´ ìž…ë ¥í•œë‹¤. :: $ cubrid gateway start ì´ë¯¸ 게ì´íŠ¸ì›¨ì´ê°€ êµ¬ë™ ì¤‘ì´ë¼ë©´ 다ìŒê³¼ ê°™ì€ ë©”ì‹œì§€ê°€ ì¶œë ¥ëœë‹¤. :: $ cubrid gateway start @cubrid gateway is running. 게ì´íŠ¸ì›¨ì´ ì¢…ë£Œ --------------- 게ì´íŠ¸ì›¨ì´ê°€ë¥¼ 종료하기 위하여 다ìŒê³¼ ê°™ì´ ìž…ë ¥í•œë‹¤. :: $ cubrid gateway stop ì´ë¯¸ 게ì´íŠ¸ì›¨ì´ê°€ 종료ë˜ì—ˆë‹¤ë©´ 다ìŒê³¼ ê°™ì€ ë©”ì‹œì§€ê°€ ì¶œë ¥ëœë‹¤. :: $ cubrid gateway stop @ cubrid gateway stop ++ cubrid gateway is not running. 게ì´íŠ¸ì›¨ì´ ìž¬ì‹œìž‘ ----------------------------- 게ì´íŠ¸ì›¨ì´ë¥¼ 재시작하기 위하여 다ìŒê³¼ ê°™ì´ ìž…ë ¥í•œë‹¤. :: $ cubrid gateway restart .. _gateway-status-command: 게ì´íŠ¸ì›¨ì´ ìƒíƒœ í™•ì¸ ------------------------------- **cubrid gateway status** 는 다양한 ì˜µì…˜ì„ ì œê³µí•˜ë©°, ê° ê²Œì´íŠ¸ì›¨ì´ì˜ 처리 ì™„ë£Œëœ ìž‘ì—… 수, 처리 ëŒ€ê¸°ì¤‘ì¸ ìž‘ì—… 수를 í¬í•¨í•œ 게ì´íŠ¸ì›¨ì´ ìƒíƒœ ì •ë³´ë¥¼ 확ì¸í• 수 있ë„ë¡ í•œë‹¤. 게ì´íŠ¸ì›¨ì´ ìƒíƒœ ì •ë³´ëŠ” 브로커와 ë™ì¼í•˜ë¯€ë¡œ :ref:`broker-status`\ì„ ì°¸ì¡° 한다. :: cubrid gateway status [options] [expr] CUBRID 서비스 시작시 게ì´íŠ¸ì›¨ì´ í•¨ê»˜ 시작 ---------------------------------------------- CUBRID 서비스 시작(**cubrid service start**) 시 *게ì´íŠ¸ì›¨* 를 ê°™ì´ ì‹œìž‘ë˜ê²Œ í•˜ë ¤ë©´, **cubrid.conf** 파ì¼ì˜ **service** 파ë¼ë©”í„°ì— *gateway* 를 ì„¤ì •í•œë‹¤. :: # cubrid.conf [service] service=server,broker,gateway,manager ... CUBRID DBLINK ì„¤ì • ============================================== CUBRID DBLink를 사용하기 위한 ì„¤ì •ì€ ë™ì¼ê¸°ì¢… DBLink와 ì´ê¸°ì¢… DBLinkì˜ ì„¤ì •ì´ ë‹¤ë¥´ë‹¤. ë™ì¼ê¸°ì¢… DBLink ì„¤ì • ----------------------- ìœ„ì˜ ë™ì¼ê¸°ì¢… 구성ë„를 ë³´ë©´ ì›ê²©ì§€ ë°ì´í„°ë² ì´ìŠ¤ì˜ Brokerì— ì—°ê²°ì„ í•´ì•¼ 하므로 ì›ê²©ì§€ ë°ì´í„°ë² ì´ìŠ¤ì˜ Broker ì„¤ì •ì´ í•„ìš” 하다. ì´ ì„¤ì •ì€ ì¼ë°˜ì ì¸ Broker ì„¤ì •ê³¼ ë™ì¼í•˜ë‹¤. ì´ê¸°ì¢… DBLink ì„¤ì • ------------------------ ì´ê¸°ì¢… ë°ì´í„°ë² ì´ìФ(Oracle/MySQL/MariaDB)와 연결하기 위해서는 cubrid_gataway.conf 와 unixODBC 설치, ODBC Driver ì •ë³´ ì„¤ì •ì´ í•„ìš” 하다. .. _gatewayconf-info: 게ì´íŠ¸ì›¨ì´ ì„¤ì • íŒŒì¼ ------------------------------------------------ CUBRID 설치 시 ìƒì„±ë˜ëŠ” 기본 게ì´íŠ¸ì›¨ì´ ì„¤ì • 파ì¼ì¸ cubrid_gataway.conf ì—서 사용ë˜ëŠ” 파ë¼ë©”터는 브로커 파ë¼ë©”터와 ê±°ì˜ ë™ì¼ 하며, 추가로 반드시 변경해야 í• ì¼ë¶€ 파ë¼ë©”í„°ê°€ í¬í•¨ëœë‹¤. 기본으로 í¬í•¨ë˜ì§€ 않는 파ë¼ë©”í„°ì˜ ê°’ì€ ì§ì ‘ 추가/편집해서 사용하면 ëœë‹¤. 다ìŒì€ 설치 시 기본으로 ì œê³µë˜ëŠ” cubrid_gateway.conf íŒŒì¼ ë‚´ìš©ì´ë‹¤. :: [gateway] MASTER_SHM_ID =50001 ADMIN_LOG_FILE =log/gateway/cubrid_gateway.log [%oracle_gateway] SERVICE =OFF SSL =OFF APPL_SERVER =CAS_CGW BROKER_PORT =53000 MIN_NUM_APPL_SERVER =5 MAX_NUM_APPL_SERVER =40 APPL_SERVER_SHM_ID =53000 LOG_DIR =log/gateway/sql_log ERROR_LOG_DIR =log/gateway/error_log SQL_LOG =ON TIME_TO_KILL =120 SESSION_TIMEOUT =300 KEEP_CONNECTION =AUTO CCI_DEFAULT_AUTOCOMMIT =ON APPL_SERVER_MAX_SIZE =256 CGW_LINK_SERVER =ORACLE CGW_LINK_SERVER_IP =localhost CGW_LINK_SERVER_PORT =1521 CGW_LINK_ODBC_DRIVER_NAME =Oracle_ODBC_Driver CGW_LINK_CONNECT_URL_PROPERTY = [%mysql_gateway] SERVICE =OFF SSL =OFF APPL_SERVER =CAS_CGW BROKER_PORT =56000 MIN_NUM_APPL_SERVER =5 MAX_NUM_APPL_SERVER =40 APPL_SERVER_SHM_ID =56000 LOG_DIR =log/gateway/sql_log ERROR_LOG_DIR =log/gateway/error_log SQL_LOG =ON TIME_TO_KILL =120 SESSION_TIMEOUT =300 KEEP_CONNECTION =AUTO CCI_DEFAULT_AUTOCOMMIT =ON APPL_SERVER_MAX_SIZE =256 CGW_LINK_SERVER =MYSQL CGW_LINK_SERVER_IP =localhost CGW_LINK_SERVER_PORT =3306 CGW_LINK_ODBC_DRIVER_NAME =MySQL_ODBC_Driver CGW_LINK_CONNECT_URL_PROPERTY ="charset=utf8;PREFETCH=100;NO_CACHE=1" [%mariadb_gateway] SERVICE =OFF SSL =OFF APPL_SERVER =CAS_CGW BROKER_PORT =59000 MIN_NUM_APPL_SERVER =5 MAX_NUM_APPL_SERVER =40 APPL_SERVER_SHM_ID =59000 LOG_DIR =log/gateway/sql_log ERROR_LOG_DIR =log/gateway/error_log SQL_LOG =ON TIME_TO_KILL =120 SESSION_TIMEOUT =300 KEEP_CONNECTION =AUTO CCI_DEFAULT_AUTOCOMMIT =ON APPL_SERVER_MAX_SIZE =256 CGW_LINK_SERVER =MARIADB CGW_LINK_SERVER_IP =localhost CGW_LINK_SERVER_PORT =3306 CGW_LINK_ODBC_DRIVER_NAME =MariaDB_ODBC_Driver CGW_LINK_CONNECT_URL_PROPERTY = 게ì´íŠ¸ì›¨ì´ íŒŒë¼ë©”í„° ------------------------ ì´ê¸°ì¢… ë°ì´í„° ë² ì´ìŠ¤ì™€ DBLink를 사용하기 위해서 ì„¤ì •í•˜ëŠ” 파ë¼ë©”í„°ì´ë‹¤. ê°ê°ì˜ 파ë¼ë©”í„° ì˜ë¯¸ëŠ” ì´ê¸°ì¢… ë°ì´í„°ë² ì´ìФ 별로 약간 ì°¨ì´ê°€ 있다. +-------------------------------+-------------+------------------------------------------------------------+ | Parameter Name | Type | Value | +===============================+=============+============================================================+ | APPL_SERVER | string | | +-------------------------------+-------------+------------------------------------------------------------+ | CGW_LINK_SERVER | string | | +-------------------------------+-------------+------------------------------------------------------------+ | CGW_LINK_SERVER_IP | string | | +-------------------------------+-------------+------------------------------------------------------------+ | CGW_LINK_SERVER_PORT | int | | +-------------------------------+-------------+------------------------------------------------------------+ | CGW_LINK_ODBC_DRIVER_NAME | string | | +-------------------------------+-------------+------------------------------------------------------------+ | CGW_LINK_CONNECT_URL_PROPERTY | string | | +-------------------------------+-------------+------------------------------------------------------------+ **APPL_SERVER** **APPL_SERVER** 는 게ì´íŠ¸ì›¨ì´ì˜ ì‘ìš© 서버 ì´ë¦„ì„ ì„¤ì •í•˜ëŠ” 부분으로 반드시 CAS_CGW 로 ì„¤ì •í•´ì•¼ 한다. **CGW_LINK_SERVER** **CGW_LINK_SERVER** 는 CAS_CGW로 연결하여 ì‚¬ìš©í• ì´ê¸°ì¢… ë°ì´í„°ë² ì´ìŠ¤ì˜ ì´ë¦„ì„ ì„¤ì •í•´ì•¼ 한다. 현재 ì§€ì›í•˜ëŠ” ë°ì´í„°ë² ì´ìŠ¤ëŠ” Oracle, MySQL, MariaDBì´ë‹¤. **CGW_LINK_SERVER_IP** **CGW_LINK_SERVER_IP** 는 CAS_CGW와 ì—°ê²°í• ì´ê¸°ì¢… ë°ì´í„°ë² ì´ìŠ¤ì˜ IP 주소를 ì„¤ì •í•´ì•¼ 한다. .. note:: * Oracleì¸ ê²½ìš°, tnsnames.oraì˜ net_service_nameì„ ì´ìš©í•˜ë¯€ë¡œ 해당 파ë¼ë©”터는 사용하지 않는다. * ìžì„¸í•œ ë‚´ìš©ì€ :ref:`Oracle Databaseì— ì—°ê²°ì„ ìœ„í•œ ì—°ê²°ì •ë³´ ì„¤ì • <tnsnames-info>`\ ì„ ì°¸ê³ í•œë‹¤. **CGW_LINK_SERVER_PORT** **CGW_LINK_SERVER_PORT** 는 CAS_CGW와 ì—°ê²°í• ì´ê¸°ì¢… ë°ì´í„°ë² ì´ìŠ¤ì˜ Port 번호를 ì„¤ì •í•´ì•¼ 한다. .. note:: * Oracleì¸ ê²½ìš°, tnsnames.oraì˜ net_service_nameì„ ì´ìš©í•˜ë¯€ë¡œ 해당 파ë¼ë©”터는 사용하지 않는다. * ìžì„¸í•œ ë‚´ìš©ì€ :ref:`Oracle Databaseì— ì—°ê²°ì„ ìœ„í•œ ì—°ê²°ì •ë³´ ì„¤ì • <tnsnames-info>`\ ì„ ì°¸ê³ í•œë‹¤. **CGW_LINK_ODBC_DRIVER_NAME** **CGW_LINK_ODBC_DRIVER_NAME** 는 CAS_CGW와 ì—°ê²°í• ë•Œ ì´ê¸°ì¢… ë°ì´í„°ë² ì´ìФì—서 ì œê³µí•˜ëŠ” ODBC Driver ì´ë¦„ì„ ì„¤ì •í•´ì•¼ 한다. .. note:: * Windowsì—서는 해당 ì´ê¸°ì¢… ë°ì´í„°ë² ì´ìŠ¤ì˜ ODBC Driverê°€ ì„¤ì¹˜ëœ ê²½ìš°, ODBC ë°ì´í„° ì›ë³¸ 관리ìžë¥¼ 통해 Driver ì´ë¦„ì„ í™•ì¸í• 수 있다. * Linux는 odbcinit.iniì— ì§ì ‘ Driver ì´ë¦„ì„ ëª…ì‹œí•´ì•¼ 한다. * ìžì„¸í•œ ë‚´ìš©ì€ :ref:`ODBC Driver ì •ë³´ ì„¤ì • <odbcdriver-info>`\ ì„ ì°¸ê³ í•œë‹¤. **CGW_LINK_CONNECT_URL_PROPERTY** **CGW_LINK_CONNECT_URL_PROPERTY** 는 ì´ê¸°ì¢… ë°ì´í„°ë² ì´ìФ ì—°ê²°ì„ ìœ„í•œ ì—°ê²° 문ìžì—´(Connection String)ì— ì‚¬ìš©ë˜ëŠ” ì—°ê²° ì†ì„±(property)ì„ ìž‘ì„±í•œë‹¤. .. note:: * ì—°ê²° ì†ì„±(property)는 ë°ì´í„°ë² ì´ìŠ¤ë³„ë¡œ ê°ê° 다르므로 ì•„ëž˜ì˜ ì‚¬ì´íŠ¸ë¥¼ 참조한다. * Oracle : https://docs.oracle.com/cd/B19306_01/server.102/b15658/app_odbc.htm#UNXAR418 * MySQL : https://dev.mysql.com/doc/connector-odbc/en/connector-odbc-configuration-connection-parameters.html#codbc-dsn-option-flags * MariaDB : https://mariadb.com/kb/en/about-mariadb-connector-odbc/#general-connection-parameters unixODBC 설치 ------------------------------------------------ unixODBC 드ë¼ì´ë²„ 관리ìžëŠ” Linux ë° UNIX ìš´ì˜ ì²´ì œì—서 ODBC 드ë¼ì´ë²„ 와 함께 ì‚¬ìš©í• ìˆ˜ 있는 오픈 소스 ODBC 드ë¼ì´ë²„ 관리ìžì´ë‹¤. 게ì´íŠ¸ì›¨ì´ì—서는 ODBC를 사용하기 위해서 unixODBC를 반드시 설치해야 한다. .. note:: Winodwsì—서는 기본으로 ì„¤ì¹˜ëœ Microsoft® ODBC ë°ì´í„° ì›ë³¸ ê´€ë¦¬ìž ë¥¼ 사용하면 ëœë‹¤. unixODBC 설치 방법 :: $ wget http://www.unixodbc.org/unixODBC-2.3.9.tar.gz $ tar xvf unixODBC-2.3.9.tar.gz $ cd unixODBC-2.3.9 $ ./configure $ make $ make install .. note:: unixODBC 드ë¼ì´ë²„ ê´€ë¦¬ìž ì„¤ì¹˜ ë°©ë²•ì€ ì•„ëž˜ì˜ url를 ì°¸ê³ ë°”ëž€ë‹¤. unixODBC 홈페ì´ì§€ : http://www.unixodbc.org/ .. _odbcdriver-info: ODBC Driver ì •ë³´ ì„¤ì • ------------------------------------------------ unixODBCê°€ 설치한 후, ì—°ê²°í• ë°ì´í„°ë² ì´ìŠ¤ì˜ ODBC Driver ì •ë³´ë¥¼ 등ë¡í•´ì•¼ 한다. ODBC Driver ì •ë³´ëŠ” odbcinst.ini를 ì§ì ‘ ìˆ˜ì •í•´ì„œ 등ë¡í•œë‹¤. ì•„ëž˜ì˜ ë‚´ìš©ì€ MySQL, Oracle, MariaDB ODBC Driver ì •ë³´ë¥¼ ì„¤ì •í•œ ì˜ˆì œì´ë‹¤. :: [MySQL ODBC 8.0 Unicode Driver] Description = MySQL ODBC driver v8.0 Driver=/usr/lib64/libmyodbc8w.so [Oracle 11g ODBC driver] Description = Oracle ODBC driver v11g Driver = /home/user/oracle/instantclient/libsqora.so.19.1 [mariadb odbc 3.1.13 driver] Description= mariadb odbc driver 3.1.13 Driver=/home/user/mariadb-odbc-3.1.13/lib64/mariadb/libmaodbc.so .. note:: ì°¸ê³ ë¡œ, ìœ„ì˜ ì˜ˆì œì—서 드ë¼ì´ë²„ ì´ë¦„ì€ ê°ê° "MySQL ODBC 8.0 Unicode Driver", "Oracle 11g ODBC driver" 와 "mariadb odbc 3.1.13 driver" ì´ë‹¤. DBLink를 위한 Oracle ì„¤ì • ============================================== Oracle í™˜ê²½ì„¤ì • ---------------------------- DBLinkì—서 Oracleì„ ì‚¬ìš©í•˜ê¸° 위해서는 Oracle Instant Client 설치 ë° ì„¤ì •, ì—°ê²° ì •ë³´ ì„¤ì •, Oracle Database 환경변수 ì„¤ì • ë° ê²Œì´íŠ¸ì›¨ì´ ì„¤ì •ì„ ë°˜ë“œì‹œ 해야 한다. **오ë¼í´ ì¸ìŠ¤í„´íŠ¸ í´ë¼ì´ì–¸íЏ ODBC 설치** Oracle Instant Client 다운로드 사ì´íЏì—서 ODBC Package와 Basic Package 다운받아 ë™ì¼í•œ ë””ë ‰í† ë¦¬ì— ì••ì¶•ì„ í’‰ë‹ˆë‹¤. :: unzip instantclient-basic-linux.x64-19.20.0.0.0dbru.zip unzip instantclient-odbc-linux.x64-19.20.0.0.0dbru.zip Oracle Instant Client 다운로드 사ì´íЏ: https://www.oracle.com/database/technologies/instant-client/downloads.html **오ë¼í´ ì¸ìŠ¤í„´íŠ¸ í´ë¼ì´ì–¸íЏ 환경변수 ì„¤ì •** :: export ORACLE_INSTANT_CLIENT=/home/user/oracle/instantclient export PATH=$ORACLE_INSTANT_CLIENT:$PATH export LD_LIBRARY_PATH=$ORACLE_INSTANT_CLIENT:$LD_LIBRARY_PATH .. _tnsnames-info: **Oracle Databaseì— ì—°ê²°ì„ ìœ„í•œ ì—°ê²°ì •ë³´ ì„¤ì •** Oracle Databaseì— ì—°ê²°ì„ í•˜ê¸° 위해서는 ì—°ê²°ì •ë³´ë¥¼ ê°€ì§€ê³ ìžˆëŠ” tnsnames.ora 파ì¼ì„ ìˆ˜ì •í•´ì•¼ 한다. ì•„ëž˜ì˜ ê¸°ë³¸ 형ì‹ì— HOST, PORT, SERVICE_NAME ì´ ì„¸ í•ëª©ì— ì—°ê²°ì •ë³´ë¥¼ 작성해야 한다. ì—°ê²°ì •ë³´ë¥¼ 작성한 tnsnames.ora 파ì¼ì€ TNS_ADMIN 환경변수ì—서 ë””ë ‰í† ë¦¬ 경로를 ì„¤ì •í•´ì•¼ 한다. TNS_ADMINì„¤ì • ë°©ë²•ì€ :ref:`TNS_ADMIN 환경변수 ì„¤ì • <tns_admin-info>`\ì„ ì°¸ê³ í•œë‹¤. tnsnames.ora 파ì¼ì˜ 기본 í˜•ì‹ :: net_service_name = (DESCRIPTION= (ADDRESS = (PROTOCOL = TCP)(HOST = xxx.xxx.xxx.xxx)(PORT = 1521) ) (CONNECT_DATA = (SERVICE_NAME=service_name) ) ) * net_service_name: ë°ì´í„°ë² ì´ìФ ì—°ê²°ì„ ìœ„í•œ 네트 서비스 ì´ë¦„ì´ë©°, connection urlì˜ db_nameì— ì‚¬ìš©í•˜ëŠ” ì´ë¦„ì´ë‹¤. * HOST: ë°ì´í„°ë² ì´ìŠ¤ì— ì—°ê²°í•˜ë ¤ëŠ” IP 주소 ë˜ëŠ” 서버 ì´ë¦„ì´ë‹¤. * PORT: ì—°ê²°ì— í•„ìš”í•œ í¬íЏì´ë‹¤. ëŒ€ë¶€ë¶„ì˜ ê²½ìš° 기본 í¬íŠ¸ëŠ” 1521ì´ë‹¤. * SERVICE_NAME: ì—°ê²°í•˜ë ¤ëŠ” ë°ì´í„°ë² ì´ìŠ¤ì˜ ì´ë¦„ì´ë‹¤. .. note:: ì°¸ê³ ë¡œ, net_service_name ì´ ì¤‘ë³µìœ¼ë¡œ ìž‘ì„±ì´ ë˜ì–´ë„ ì—러가 ë°œìƒë˜ì§€ 않는다. 하지만 ì¤‘ë³µëœ ë‹¤ë¥¸ ì„œë²„ì— ì—°ê²°ë 수 있으므로, net_service_name ì´ ë°˜ë“œì‹œ 중복ë˜ì§€ 않게 ì„¤ì •í•´ì•¼ 한다. **Oracle Database 환경변수 ì„¤ì •** Oracle database server ì— ì•„ëž˜ì˜ í™˜ê²½ë³€ìˆ˜ë¥¼ ì„¤ì •í•´ì•¼ 한다. :: export ORACLE_SID=XE export ORACLE_BASE=/u01/app/oracle export ORACLE_HOME=$ORACLE_BASE/product/11.2.0/xe export PATH=$ORACLE_HOME/bin:$PATH * ORACLE_SID는 시스템 ì‹ë³„ìžì´ë‹¤. * ORACLE_BASEì€ ì˜¤ë¼í´ 기본 ë””ë ‰í† ë¦¬ 구조ì´ë‹¤. * ORACLE_HOMEì€ ì˜¤ë¼í´ ë°ì´í„°ë² ì´ìŠ¤ê°€ ì„¤ì¹˜ëœ ê²½ë¡œì´ë‹¤. .. _tns_admin-info: **TNS_ADMIN 환경변수 ì„¤ì •** TNS_ADMIN는 tnsnames.ora 파ì¼ì´ 있는 ë””ë ‰í† ë¦¬ 경로를 가리킨다. 만약 /home/user/myconfigs ì— tnsnames.ora 파ì¼ì´ 있다면 아래와 ê°™ì´ ì„¤ì • í• ìˆ˜ 있다. :: export TNS_ADMIN=/home/user/myconfigs **Oracleì„ ìœ„í•œ cubrid_gataway.conf ì„¤ì •** 게ì´íŠ¸ì›¨ì´ì—서 oracleì— ì—°ê²°í•˜ê¸° 위해서는 아래와 ê°™ì´ ëª‡ 가지 ì„¤ì •ì´ í•„ìš”í•˜ë‹¤. ìžì„¸í•œ ë‚´ìš©ì€ :ref:`게ì´íŠ¸ì›¨ì´ ì„¤ì • íŒŒì¼ <gatewayconf-info>`\ ì„ ì°¸ê³ í•œë‹¤. 게ì´íŠ¸ì›¨ì´ëŠ” oracleì— ì—°ê²°í•˜ê¸° 위해서 tnsnames.ora ì˜ ì •ë³´ë¥¼ ì´ìš©í•˜ê¸° ë•Œë¬¸ì— CGW_LINK_SERVER_IP, CGW_LINK_SERVER_PORT 는 작성하지 ì•Šì•„ë„ ëœë‹¤. 해당 ì •ë³´ë¥¼ 작성한 경우ì—ë„ ê²Œì´íŠ¸ì›¨ì´ëŠ” 참조하지 않는다. :: APPL_SERVER =CAS_CGW . . . CGW_LINK_SERVER =ORACLE CGW_LINK_ODBC_DRIVER_NAME =Oracle 19c ODBC driver CGW_LINK_CONNECT_URL_PROPERTY = DBLink를 위한 MySQL ì„¤ì • ======================================= MySQL í™˜ê²½ì„¤ì • ------------------------- **MySQL ODBC Driver 설치** 게ì´íŠ¸ì›¨ì´ì—서 MySQL ì—°ê²°ì„ í•˜ê¸°ìœ„í•´ì„œëŠ” MySQL Unicode ODBC Driverê°€ í•„ìš” 하다. ì•„ëž˜ì˜ ë‚´ìš©ì€ MYySQL ODBC Drvier 설치 방법ì´ë‹¤. MySQL Yum ì €ìž¥ì†Œ 를 사용하여 Connector/ODBC RPM 패키지를 ì œê³µí•©ë‹ˆë‹¤. ì‹œìŠ¤í…œì˜ ë¦¬í¬ì§€í† 리 목ë¡ì— MySQL Yum ì €ìž¥ì†Œê°€ 있어야 하며, 없는경우 MySQL Yum ì €ìž¥ì†Œ 다운로드 페ì´ì§€( https://dev.mysql.com/downloads/repo/yum/ ) ì—서 플랫í¼ì— 대한 패키지를 ì„ íƒí•˜ê³ 다운로드한다. 다운로드한 릴리스 패키지를 설치한다. :: $ sudo yum install mysql80-community-release-el6-{version-number}.noarch.rpm Yumì„ ì‚¬ìš©í•˜ì—¬ ì €ìž¥ì†Œë¥¼ ì—…ë°ì´íŠ¸í•œë‹¤. :: $ sudo yum update mysql-community-release ì•„ëž˜ì˜ ëª…ë ¹ìœ¼ë¡œ Connector/ODBC 를 설치한다. :: $ sudo yum install mysql-connector-odbc ìžì„¸í•œ 설치 ë°©ë²•ì€ https://dev.mysql.com/doc/connector-odbc/en/connector-odbc-installation-binary-yum.html ì„ ì°¸ê³ í•œë‹¤. **MySQLì„ ìœ„í•œ cubrid_gataway.conf ì„¤ì •** 게ì´íŠ¸ì›¨ì´ì—서 MySQLì— ì—°ê²°í•˜ê¸° 위해서는 아래와 ê°™ì´ ëª‡ 가지 ì„¤ì •ì´ í•„ìš”í•˜ë‹¤. ìžì„¸í•œ ë‚´ìš©ì€ :ref:`게ì´íŠ¸ì›¨ì´ ì„¤ì • íŒŒì¼ <gatewayconf-info>`\ ì„ ì°¸ê³ í•œë‹¤. :: APPL_SERVER =CAS_CGW . . . CGW_LINK_SERVER =MYSQL CGW_LINK_SERVER_IP =localhost CGW_LINK_SERVER_PORT =3306 CGW_LINK_ODBC_DRIVER_NAME =MySQL ODBC 8.0 Unicode Driver CGW_LINK_CONNECT_URL_PROPERTY ="charset=utf8;PREFETCH=100;NO_CACHE=1" DBLink를 위한 MariaDB ì„¤ì • ======================================= MariaDB í™˜ê²½ì„¤ì • ------------------------- **MariaDB ODBC Driver 설치** 게ì´íŠ¸ì›¨ì´ì—서 MariaDB ì—°ê²°ì„ í•˜ê¸°ìœ„í•´ì„œëŠ” MariaDB ODBC Driverê°€ 필요하다. ì•„ëž˜ì˜ ë‚´ìš©ì€ MariaDB ODBC Drvier 설치 방법ì´ë‹¤. MariaDB Connector/ODBC 패키지는 ì•„ëž˜ì˜ íŽ˜ì´ì§€ì—서 ë²„ì „ì„ ì„ íƒí•˜ì—¬ ë‹¤ìš´ë¡œë“œí• ìˆ˜ 있다. https://mariadb.com/downloads/connectors/ 다운로드한 tarball 패키지ì—서 파ì¼ì„ 추출한다. ê·¸ë¦¬ê³ ë“œë¼ì´ë²„ì˜ ê³µìœ ë¼ì´ë¸ŒëŸ¬ë¦¬ë¥¼ ì‹œìŠ¤í…œì˜ ì ì ˆí•œ ìœ„ì¹˜ì— ì„¤ì¹˜ 한다. 설치한 드ë¼ì´ë²„는 odbcinst.iniì— ë“œë¼ì´ë²„ ì •ë³´ë¥¼ ì„¤ì •í•´ì•¼ 한다. ì„¤ì • ë°©ë²•ì€ :ref:`ODBC Driver ì •ë³´ ì„¤ì • <odbcdriver-info>`\ ì„ ì°¸ê³ í•œë‹¤. :: $ mariadb-connector-odbc-3.1.13-centos7-amd64.tar.gz -C mariadb-odbc-3.1.13 ìžì„¸í•œ 설치 ë°©ë²•ì€ https://mariadb.com/kb/en/about-mariadb-connector-odbc/#installing-mariadb-connectorodbc-on-linux ì„ ì°¸ê³ í•œë‹¤. **MariaDB 위한 cubrid_gataway.conf ì„¤ì •** 게ì´íŠ¸ì›¨ì´ì—서 MariaDBì— ì—°ê²°í•˜ê¸° 위해서는 아래와 ê°™ì´ ëª‡ 가지 ì„¤ì •ì´ í•„ìš”í•˜ë‹¤. ìžì„¸í•œ ë‚´ìš©ì€ :ref:`게ì´íŠ¸ì›¨ì´ ì„¤ì • íŒŒì¼ <gatewayconf-info>`\ ì„ ì°¸ê³ í•œë‹¤. :: APPL_SERVER =CAS_CGW . . . CGW_LINK_SERVER =MARIADB CGW_LINK_SERVER_IP =localhost CGW_LINK_SERVER_PORT =3306 CGW_LINK_ODBC_DRIVER_NAME =mariadb odbc 3.1.13 driver Cubrid DBLink 사용 방법 ============================================== DBLinkì„ ì‚¬ìš©í•˜ê¸° 위해 ì—°ê²°í• CUBRIDì˜ broker들 ì •ë³´ 파악 ë˜ëŠ” ì´ê¸°ì¢… ë°ì´í„°ë² ì´ìŠ¤ë¥¼ 위한 게ì´íŠ¸ì›¨ì´ ì„¤ì •ì´ ì™„ë£Œë˜ì—ˆë‹¤ë©´, DBLinkì„ ì´ìš©í•œ Query문 작성 ë°©ë²•ì— ëŒ€í•´ì„œ 알아본다. ë°ì´í„° 조회를 위한 DBLINK Query문 작성 ë°©ë²•ì€ ë‘가지ì´ë‹¤. **첫번째**, FROMì ˆì— DBLINK êµ¬ë¬¸ì„ ìž‘ì„±í•˜ì—¬ 타 ë°ì´í„°ë² ì´ìŠ¤ì˜ ì •ë³´ë¥¼ 조회하는 방법 ì•„ëž˜ì˜ Queryë¬¸ì€ IP 192.xxx.xxx.xxxì˜ íƒ€ ë°ì´í„°ë² ì´ìŠ¤ì˜ remote_t í…Œì´ë¸” ì •ë³´ë¥¼ 조회하는 Query문ì´ë‹¤. :: SELECT * FROM DBLINK ('192.xxx.xxx.xxx:53000:testdb:user:password:','SELECT col1, col2 FROM remote_t') AS t(col1 int, col2 varchar(32)); .. note:: Oracleì˜ ê²½ìš° ì›ê²©ì ‘ì† ì •ë³´ 중 ip와 port는 게ì´íŠ¸ì›¨ì´ ì ‘ì† ì •ë³´ì´ê³ , db_name í•목ì—는 tnsnames.oraì˜ net_service_name ì„ ë„£ì–´ì•¼ 한다. 만약 net_service_nameì´ ora_test ì´ë¼ë©´ 아래와 ê°™ì´ ìž‘ì„±í•˜ë©´ ëœë‹¤. SELECT * FROM DBLINK ('192.xxx.xxx.xxx:53000:ora_test:user:password:','SELECT col1, col2 FROM remote_t') AS t(col1 int, col2 varchar(32)); **ë‘번째**, Query를 ìž‘ì„±í• ë•Œ 마다 매번 ì—°ê²° ì •ë³´ë¥¼ 작성해야 하는 번거로움과 ì‚¬ìš©ìž ì •ë³´(id, password)ì˜ ì •ë³´ 보호를 위해 CREATE SERVERêµ¬ë¬¸ì„ ì´ìš©í•œë‹¤.CREATE SERVER êµ¬ë¬¸ì„ ì´ìš©í•˜ëŠ” 경우 Queryë¬¸ì´ ê°„ê²°í•´ì§€ê³ ì‚¬ìš©ìž ì •ë³´ ë³´í˜¸ì— ë„ì›€ì´ ëœë‹¤. :: CREATE SERVER remote_srv ( HOST='192.xxx.xxx.xxx', PORT=53000, DBNAME=testdb, USER=user, PASSWORD='password'); SELECT * FROM DBLINK (remote_srv, 'SELECT col1 FROM remote_t') AS t(col1 int); .. note:: DBLINK는 ì ‘ì† URLì— ì¶”ê°€ ì—°ê²° ì†ì„±(Properties)ì„ ì„¤ì •í• ìˆ˜ 있다. ìƒì„¸í•œ ì†ì„± ë‚´ìš©ì€ :ref:`CCI드ë¼ì´ë²„ì˜ cci_connect_with_url 함수<cci_connect_with_url>`\를 참조한다. DBLINK ëŒ€ìƒ ë°ì´í„°ë² ì´ìŠ¤ê°€ HA 환경으로 êµ¬ì„±ëœ ê²½ìš° altHosts ì†ì„±ì„ ì´ìš©í•´ì„œ 아래 ì˜ˆì œì²˜ëŸ¼ ì„¤ì •ì„ í• ìˆ˜ 있다. 192.168.0.1:53000:testdb:user:password::?altHosts=192.168.0.2:33000,192.168.0.3:33000 ì˜ˆì œëŠ” 192.168.0.1 서버가 Active ë°ì´í„°ë² ì´ìФì´ê³ 해당 ì„œë²„ì— ì—°ê²°í• ìˆ˜ 없는 경우, 192.168.0.2 ì„œë²„ì— ì—°ê²° ìš”ì²í•˜ëŠ” ì„¤ì •ì´ë‹¤. ìœ„ì˜ ì˜ˆì‹œì²˜ëŸ¼ ì—¬ëŸ¬ê°œì˜ altHosts를 ì§€ì •í• ìˆ˜ 있으며, 나열한 순서대로 ì—°ê²°ì„ ì‹œë„한다. CREATE SERVER êµ¬ë¬¸ì˜ PROPERTIES í•ëª©ì— ì—°ê²° ì†ì„±ì„ ì„¤ì •í• ìˆ˜ 있다. ìžì„¸í•œ ë‚´ìš©ì€ :doc:`/sql/query/select` 와 :doc:`/sql/schema/server_stmt` ì„ ì°¸ê³ í•œë‹¤. ìœ ì˜ ì‚¬í• ================== * ë™ì˜ì–´ ìƒì„± : ì›ê²© í…Œì´ë¸”ê³¼ ì›ê²© ë™ì˜ì–´ë¥¼ 대ìƒìœ¼ë¡œ 로컬 ë™ì˜ì–´ê°€ ìƒì„±ì´ 가능하다. 단, CUBRIDê°€ 아닌 타 DBMSì˜ ê²½ìš°, user명ì´ë‚˜ dbëª…ì„ ë³‘ê¸°í•´ì•¼ 한다. .. code-block:: sql -- for CUBRID create synonym synonym_1 for t1@srv1; create synonym synonym_2 for remote_synonym@srv1; -- for ORACLE create synonym synonym_ora for user_ora.t1@srv_ora; -- for MySQL and MariaDB create synonym synonym_my for my_db.t1@srv_mysql; create synonym synonym_maria for maria_db.t1@srv_maria; * 예약어 처리 : ì›ê²©DBì˜ ì˜ˆì•½ì–´ë¥¼ ì‹ë³„ìžë¡œ 사용하는 경우 예약어 처리 문ìžì™€ 함께 반드시 대괄호 ([ ])로 ê°ì‹¸ì•¼ 한다. CUBRIDì˜ ì˜ˆì•½ì–´ 처리 문ìžëŠ” í°ë”°ì˜´í‘œ(" ")문ìžì´ë‹¤. .. code-block:: sql SELECT ["COLUMN"],["ADD"],["ALTER"] FROM ["TABLE"]@srv1 ; SELECT * FROM dblink(srv1, 'select "COLUMN","ADD","ALTER" from "TABLE" ') AS t(a varchar, b varchar, c varchar ); * 오ë¼í´ì˜ 예약어 처리 문ìžëŠ” í°ë”°ì˜´í‘œ(" ")문ìžì´ë‹¤. .. code-block:: sql SELECT ["COLUMN"],["ADD"],["ALTER"] FROM ["TABLE"]@srv1 ; SELECT * FROM dblink(srv1, 'select "COLUMN","ADD","ALTER" from "TABLE" ') AS t(a varchar, b varchar, c varchar ); * MySQL, MariaDB 예약어 처리 문ìžëŠ” 백쿼트(\` \`) ì´ë‹¤. .. code-block:: sql SELECT [`COLUMN`],[`ADD`],[`ALTER`] FROM [`TABLE`]@srv1 ; SELECT * FROM dblink(srv1, 'select `COLUMN`,`ADD`,`ALTER` from `TABLE` ') AS t(a varchar, b varchar, c varchar ); ì œì•½ ì‚¬í• ================== 공통 ì œì•½ ì‚¬í• ----------------------- * ì›ê²© DBì˜ ë¬¸ìžì…‹(charset)ì€ ìœ ë‹ˆì½”ë“œ(utf-8) 문ìžì…‹ë§Œ ì§€ì›í•œë‹¤. * í…Œì´ë¸” 확장 í˜•ì‹ (object@server) ì§€ì› - í…Œì´ë¸”, ë·°, ë™ì˜ì–´ë§Œ ì§€ì› - 시리얼, 내장함수, ì €ìž¥í•¨ìˆ˜ì€ ë¯¸ì§€ì› (예 : ì›ê²©ì„œë²„(server1)ì˜ sp_func() ì €ìž¥ 함수는 sp_func@server1(arg1, …) 형ì‹ìœ¼ë¡œ ì‚¬ìš©í• ìˆ˜ ì—†ìŒ) * SELECT 질ì˜ì˜ ëª¨ë“ í•¨ìˆ˜ë“¤(SYSDATE를 í¬í•¨í•œ 내장 함수, ì €ìž¥ 함수), serial ê´€ë ¨ 함수 ë° ì‹œìŠ¤í…œ ìƒìˆ˜ëŠ” ëª¨ë‘ ë¡œì»¬ì—서 실행ëœë‹¤. (ì›ê²©DBì—서 함수 ë˜ëŠ” serial ìˆ˜í–‰ì´ í•„ìš”í•œ 경우ì—는 DBLINK êµ¬ë¬¸ì„ ì‚¬ìš©í•´ì•¼ 한다.) 예를 들어 아래와 ê°™ì´ ì›ê²© í…Œì´ë¸” ëŒ€ìƒ select 질ì˜ì— 대해 옵티마ì´ì €ê°€ 재작성한 질ì˜ë¥¼ ë³´ë©´ DBLINK() ì•ˆì˜ ì§ˆì˜ë§Œ ì›ê²©DBì—서 실행ëœë‹¤. .. code-block:: sql SELECT A.*, rownum rn, '' empty, null null_col, SYSDATE FROM t1@srv1 A ; -- rewritten query SELECT A.id, A.parentid, A.[text], rownum, '', null, SYS_DATE -- at local FROM ( SELECT [_dbl].id, [_dbl].parentid, [_dbl].[text] FROM DBLINK( srv1 /* '192.168.1.125:33000:remotedb1:dba::' */, 'SELECT * FROM tree A') AS [_dbl](id integer, parentid integer, [text] varchar(32)) -- at remote ) A (id, parentid, [text]) * INSERT/UPDATE/DELETE/MERGE 질ì˜ì—서 사용하는 ëª¨ë“ í•¨ìˆ˜ì™€, serial ê´€ë ¨ 함수 ë° ì‹œìŠ¤í…œ ìƒìˆ˜ëŠ” ëª¨ë‘ ì›ê²© 서버ì—서 실행ë˜ë¯€ë¡œ 사용 시 주ì˜ê°€ 필요하다. (즉, CUBRIDì˜ ë‚´ìž¥í•¨ìˆ˜ê°€ ì›ê²© DBMSì—서는 ì§€ì›í•˜ì§€ 않거나 ì‚¬ìš©ë²•ì´ ë‹¬ë¼ ì˜¤ë¥˜ ë“±ì˜ ì˜¤ë™ìž‘ì´ ë°œìƒí• 수 있으므로 ì£¼ì˜ ìš”ë§) * 트랜ìžì…˜ : 로컬DB와 ì›ê²©DBì˜ íŠ¸ëžœìžì…˜(commit, rollback)ì€ í•˜ë‚˜ì˜ íŠ¸ëžœìžì…˜ìœ¼ë¡œ 처리ë˜ì§€ 않는다. ì›ê²©DBì˜ DML(INSERT/UPDATE/DELETE/MERGE 구문) 질ì˜ëŠ” 로컬 DBì˜ íŠ¸ëžœìžì…˜ê³¼ 별개로 auto commit으로 ë™ìž‘한다. 아래 예시 처럼 트랜ìžì…˜ì„ 수행하는 경우, ì›ê²©DBì—는 insert 수행과 함께 커밋 처리ë˜ì–´ ë°ì´í„°ê°€ ìž…ë ¥ë˜ê³ , 로컬DBì—는 명시ì 롤백 질ì˜ì— ì˜í•´ insert ìˆ˜í–‰í–ˆë˜ ë°ì´í„°ê°€ 롤백ë˜ì–´ ìž…ë ¥ë˜ì§€ 않는다. .. code-block:: sql -- local input INSERT INTO t1(a, b) VALUES (1, 'local'); -- remote input INSERT INTO t2@srv1(a, b) VALUES (1, 'remote'); rollback; SELECT a, b FROM t1, t2@srv1 t2 WHERE t1.a = t2.a; there’s no result * TRUNCATE 구문 ë¯¸ì§€ì› * CREATE TABLE … LIKE í…Œì´ë¸”명@server명 구문 ë¯¸ì§€ì› (ì°¸ê³ ë¡œ CREATE TABLE … AS SELECT FROM í…Œì´ë¸”명@server명 êµ¬ë¬¸ì€ ì§€ì›) * TRIGGER 구문ì—서 DBLINK() í˜¹ì€ ì›ê²© í…Œì´ë¸”(@server)ì„ ì‚¬ìš©í•œ 질ì˜ëŠ” 오류가 ë°œìƒí•œë‹¤. * predicate push 처리: í…Œì´ë¸” 확장 형ì‹(@server) 구문으로 ìž‘ì„±ëœ SELECT êµ¬ë¬¸ì€ ì˜µí‹°ë§ˆì´ì €ê°€ DBLINK()구문으로 재작성하는ë°, 성능 í–¥ìƒì„ 위해 ì›ê²© DBì—서 처리 가능한 ì¡°ê±´ì ˆì„ í•¨ê»˜ push 하여 재작성한다. 단, ì¡°ê±´ì ˆì—서 사용한 내장함수와 ì‚¬ìš©ìž ì •ì˜í•¨ìˆ˜ëŠ” pushì—서 ì œì™¸ë˜ê³ , 로컬DBì—서 실행ëœë‹¤. * 성능 ìœ ì˜ ì‚¬í• .. note:: í…Œì´ë¸” 확장 형ì‹(@server)ì˜ SELECT 구문ì—서 connect byì ˆ, group byì ˆ, havingì ˆ ë° limitì ˆì„ ì‚¬ìš©í•œ 경우, whereì¡°ê±´, group byì ˆ, havingì ˆ ë° limitì ˆì´ ì›ê²©DBì—서 실행ë˜ì§€ ì•Šê³ , ì „ì²´ ë°ì´í„°ë¥¼ 로컬DB로 ê°€ì ¸ì˜¨ 후 해당 ì¡°ê±´ 처리를 수행함으로 ì„±ëŠ¥ì´ ì €í•˜ë 수 있다. 아래는 count()를 처리하기 위해서 ì›ê²©DBì˜ tree í…Œì´ë¸”ì˜ ì „ì²´ ë°ì´í„°ë¥¼ 로컬DB로 ê°€ì ¸ì˜¨ í›„ì— group byì ˆì„ ì²˜ë¦¬í•˜ëŠ” 예시ì´ë‹¤. .. code-block:: sql -- original query SELECT A.parentid, count() FROM tree@srv1 A GROUP BY A.parentid ; -- rewritten query SELECT A.parentid, count() FROM ( SELECT [_dbl].parentid FROM DBLINK( srv1 /* '192.168.1.125:33000:remotedb1:dba::' */, 'SELECT parentid FROM tree A' ) AS [_dbl](parentid integer) ) A (parentid) GROUP BY A.parentid * í…Œì´ë¸” 확장 형ì‹(@server)구문ì—서 사용하는 sysdate 함수는 로컬DBì—서 수행ë˜ë¯€ë¡œ ì„œë²„ê°„ì˜ ì‹œê°„ì´ ë‹¤ë¥¸ 경우 주ì˜ê°€ 필요하다. .. code-block:: sql -- original query SELECT * FROM tbl@srv1 WHERE col1 >= sysdate; -- rewritten query SELECT * FROM ( SELECT col1, col2 FROM DBLINK( srv1 /* '192.168.1.125:33000:remotedb1:dba::' */, 'SELECT col1, col2 FROM tbl' ) AS [_dbl](col1 date, col2 varchar) ) tbl (col1, col2) WHERE col1>= SYS_DATE * í…Œì´ë¸” 확장 형ì‹(@server)구문으로 co-related ì¡°ê±´ì˜ ìŠ¤ì¹¼ë¼ ì„œë¸Œì¿¼ë¦¬, 서브쿼리 ë° EXIST êµ¬ë¬¸ì˜ ë¶€ì§ˆì˜ ì‚¬ìš©í•˜ëŠ” 경우, 반복ë˜ëŠ” ì›ê²© ì§ˆì˜ ìˆ˜í–‰ì‹œ ì „ì²´ ë°ì´í„°ë¥¼ 로컬 DB로 ê°€ì§€ê³ ì˜¨ 후 ì¡°ì¸ ì¡°ê±´ì— ë§žëŠ” ë°ì´í„°ë¥¼ 찾는 ìž‘ì—…ì„ ìˆ˜í–‰í•˜ê²Œ ë˜ì–´ 급격한 성능 ì €í•˜ê°€ ë°œìƒí• 수 있다. 아래 예시는 ìŠ¤ì¹¼ë¼ ì„œë¸Œ í€´ë¦¬ì˜ ì¡°ê±´ìœ¼ë¡œ T1.a를 ì‚¬ìš©í•˜ê³ ìžˆì–´, T1.a < 4 ë§Œí¼ì˜ svr1ì˜ tree tableì˜ ë°ì´í„°ë¥¼ 로컬 DB로 ê°€ì§€ê³ ì™€ì„œ ì 합한 ë°ì´í„°ë¥¼ 찾는 ìž‘ì—…ì„ í•˜ê¸° ë•Œë¬¸ì— ìˆ˜í–‰ì´ ëŠë ¤ì§ˆ 수 있다. .. code-block:: sql -- original query SELECT T1.a, (SELECT A.text FROM tree@srv1 A WHERE A.id = T1.a ) remote_text FROM hangul_t1 T1 WHERE T1.a < 4; -- rewritten query SELECT T1.a, (SELECT A.[text] from (select [_dbl].[text], [_dbl].id FROM DBLINK(srv1 /* '192.168.1.125:33000:remotedb1:dba::' */, 'SELECT [text], id FROM tree A' ) AS [_dbl]([text] varchar(32), id integer) WHERE [_dbl].id=T1.a) A ([text], id)) FROM hangul_t1 T1 WHERE (T1.a< ?:0 ) CUBRID ì œì•½ ì‚¬í• -------------------------- * SELECT 구문ì—서 ENUM, BLOB, CLOB, SET 타입 ë¯¸ì§€ì› * 로컬 DB와 ì›ê²© DBì˜ ì„¤ì •ëœ íŒŒë¼ë¯¸í„°ê°€ 다른 경우 ì›í•˜ì§€ 않는 결과가 ë°œìƒí• 수 있다. .. _heterogen-restrict: **ì´ê¸°ì¢… DBMS 공통 ì œì•½ 사í•** * 게ì´íŠ¸ì›¨ì´ì—서는 반드시 ì´ê¸°ì¢… ì›ê²© ë°ì´í„°ë² ì´ìФ(Oracle/MySQL/MariaDB)ì˜ ìœ ë‹ˆì½”ë“œ ì „ìš© ODBC Driver를 사용해야 한다. * ODBC 타입 중 SQL_INTERVAL,SQL_GUID,SQL_BIT,SQL_BINARY,SQL_VARBINARY,SQL_LONGVARBINARY, SQL_LONGVARCHAR, SQL_WLONGVARCHAR 는 ë¯¸ì§€ì› íƒ€ìž…ì´ë‹¤. +-----------------------+------------------------+------------------------+------------------------+ | ODBC SQL Type | Oracle Data Type | MySQL Data Type | MariaDB Data Type | +=======================+========================+========================+========================+ | SQL_LONGVARCHAR | LONG, CLOB | LONGTEXT | LONGTEXT | +-----------------------+------------------------+------------------------+------------------------+ | SQL_WLONGVARCHAR | NCLOB | | | +-----------------------+------------------------+------------------------+------------------------+ | SQL_BIT | | BIT | BIT | +-----------------------+------------------------+------------------------+------------------------+ | SQL_BINARY | | BINARY | BINARY | +-----------------------+------------------------+------------------------+------------------------+ | SQL_VARBINARY | RAW | VARBINARY | VARBINARY | +-----------------------+------------------------+------------------------+------------------------+ | SQL_LONGVARBINARY | LONG RAW | LONG VARBINARY | LONG VARBINARY | | +------------------------+------------------------+------------------------+ | | BLOB | BLOB | BLOB | | +------------------------+------------------------+------------------------+ | | BFILE | TINYBLOB | TINYBLOB | | +------------------------+------------------------+------------------------+ | | | MEDIUMBLOB | MEDIUMBLOB | | +------------------------+------------------------+------------------------+ | | | LONGBLOB | LONGBLOB | | +------------------------+------------------------+------------------------+ | | | GEOMETRY | GEOMETRY | | +------------------------+------------------------+------------------------+ | | | POINT | POINT | | +------------------------+------------------------+------------------------+ | | | POLGON | POLGON | | +------------------------+------------------------+------------------------+ | | | GEOMETRYCOLLECTION | GEOMETRYCOLLECTION | | +------------------------+------------------------+------------------------+ | | | MULTILINESTRING | MULTILINESTRING | | +------------------------+------------------------+------------------------+ | | | MULTIPOINT | MULTIPOINT | | +------------------------+------------------------+------------------------+ | | | MULTIPOLYGON | MULTIPOLYGON | +-----------------------+------------------------+------------------------+------------------------+ | SQL_INTERVAL | INTERVAL YEAR TO MONTH | | | | +------------------------+------------------------+------------------------+ | | INTERVAL DAY TO SECOND | | | +-----------------------+------------------------+------------------------+------------------------+ * 1ê°œ ì»¬ëŸ¼ì˜ ë¬¸ìžì—´ 최대 길ì´ëŠ” 16Mì´ë‹¤. ì•„ëž˜ì˜ í‘œëŠ” DBMS별 Dataì˜ ê¸¸ì´ê°€ 16M ì´ìƒì¸ Data Type ì´ë‹¤. +------------------+---------------------------+ | DBMS Name | Data Type | +==================+===========================+ | Oracle | LONG, NCLOB, CLOB | +------------------+---------------------------+ | MySQL | LONGTEXT | +------------------+---------------------------+ | MariaDB | LONGTEXT | +------------------+---------------------------+ * INSERT, UPDATE, DELETE, MERGE 와 ê°™ì€ DML 구문ì—서 CUBRIDê°€ 미지ì›í•˜ëŠ” 내장 함수 중 function(파ë¼ë¯¸í„°1, …, 파ë¼ë¯¸í„°N)ì˜ í˜•ì‹ì´ 아닌 경우ì—는 ì§ˆì˜ ì˜¤ë¥˜ê°€ ë°œìƒí•œë‹¤. 예시: MySQL, MariaDBì˜ convert 함수 : convert('binary' using binary) -- 오류 ë°œìƒ .. note:: Oracle ì œì•½ ì‚¬í• * SELECT 구문ì—서 LONG, INTERVAL DAY TO SECOND, INTERVAL YEAR TO MONTH, BLOB, CLOB íƒ€ìž…ì€ ì§€ì›í•˜ì§€ 않는다. ìžì„¸í•œ ë‚´ìš©ì€ :ref:`ì´ê¸°ì¢… DBMS 공통 ì œì•½ 사í•ì˜ ë¯¸ì§€ì› íƒ€ìž…<heterogen-restrict>`\ì„ ì°¸ê³ í•œë‹¤. * INTERVAL DAY TO SECOND, INTERVAL YEAR TO MONTH íƒ€ìž…ì€ Oracle ODBCì—서 ì§€ì›í•˜ì§€ 않는 타입ì´ë‹¤. ìžì„¸í•œ ë‚´ìš©ì€ "Using the Oracle ODBC Driver"(https://docs.oracle.com/en/database/oracle/oracle-database/19/adfns/odbc-driver.html#GUID-3FE69BEF-F8D2-4152-9B1A-877186C47028)를 ì°¸ê³ í•œë‹¤. * Oracle ODBC는 타임존 ë°ì´í„° 조회시 timestamp íƒ€ìž…ì˜ ë¡œì»¬ 시간으로 변환하여 반환ëœë‹¤. (타임존 ë°ì´í„° 타입 미지ì›) 아래는 Oracle DBì˜ íƒ€ìž„ì¡´ ë°ì´í„°ë¥¼ ODBC로 조회시 로컬타임존으로 변환ë˜ëŠ” 예시ì´ë‹¤. ìž…ë ¥í•œ 타임존 "+02:00"ì´ì§€ë§Œ, DBLinkì„ í†µí•´ select 하는 경우 로컬타임존 "+09:00"로 변환하여 "PM 08시"로 ì¶œë ¥ëœë‹¤. .. code-block:: sql -- oracle input INSERT INTO tbl VALUES (to_timestamp_tz('2021-07-25 12:34:56 +02:00', 'yyyy-mm-dd hh24:mi:ss tzh:tzm')); -- local SELECT t_timestamp_timezone2 FROM tbl@server; 07:34:56.000 PM 07/25/2021 SELECT to_char(t_timestamp_timezone2, 'yyyy-mm-dd hh24:mi:ss.ff tzh:tzm') FROM tbl@server; 2021-07-25 19:34:56.000 +09:00 * ë¯¸ì§€ì› êµ¬ë¬¸ì¸ REPLACE êµ¬ë¬¸ì€ ì‚¬ìš©ì‹œ 오류 ë°œìƒ * CUBRIDì˜ íƒ€ìž… 범위를 벗어나는 오ë¼í´ì˜ date, number 타입 ë°ì´í„°ëŠ” ìž…ë ¥ì€ ê°€ëŠ¥í•˜ë‚˜ 조회 시ì—는 오류가 ë°œìƒí•œë‹¤. .. note:: MySQL/MariaDBì œì•½ ì‚¬í• * MySQLì—서 cache를 사용하는 경우 게ì´íŠ¸ì›¨ì´ í”„ë¡œì„¸ìŠ¤(cub_cas_cgw)ì˜ ë©”ëª¨ë¦¬ ì‚¬ìš©ëŸ‰ì´ ì¦ê°€í•˜ë¯€ë¡œ PREFETCH, NO_CACHE=1 ì‚¬ìš©ì„ ê¶Œìž¥í•œë‹¤. * MySQL/MariaDBì—서 repeat() 함수가 í¬í•¨ëœ ì§ˆì˜ ìˆ˜í–‰ 시 문ìžì—´ì˜ ì¼ë¶€ê°€ 잘리거나, 문ìžì—´ì„ ì½ì–´ì˜¤ì§€ ëª»í• ìˆ˜ 있다. * SELECT 구문ì—서 LONGTEXT, BIT, BLOB, LONGBLOB íƒ€ìž…ì€ ì§€ì›í•˜ì§€ 않는다. ìžì„¸í•œ ë‚´ìš©ì€ :ref:`ì´ê¸°ì¢… DBMS 공통 ì œì•½ 사í•ì˜ ë¯¸ì§€ì› íƒ€ìž… <heterogen-restrict>`\ì„ ì°¸ê³ í•œë‹¤.