Altibase Application Development Database Link User s Manual Release 7.1 (August 28, 2018)
----------------------------------------------------------- Altibase Application Development Database Link User s Manual Release 7.1 Copyright c 2001~2018 Altibase Corp. All Rights Reserved. 본문서의저작권은 알티베이스에있습니다. 이문서에대하여당사의동의없이무단으로복제또는전용할수없습니다. 알티베이스 08378 서울시구로구디지털로 306 대륭포스트타워 Ⅱ 10 층전화 : 02-2082-1114 팩스 : 02-2082-1099 고객서비스포털 : http://support.altibase.com homepage: http://www.altibase.com -----------------------------------------------------------
목차 서문... 5 이매뉴얼에대하여... 6 1. 데이터베이스링크소개... 11 관련전문용어... 12 데이터베이스링크정의... 14 Altibase 데이터베이스링크구성요소... 17 2. 지원되는객체, SQL문및데이터타입... 27 데이터베이스링크와 SQL문... 28 접근가능한원격스키마객체... 31 DB Link 지원데이터타입... 36 3. 데이터베이스링크환경설정... 41 DB Link 동작방식... 42 환경설정... 43 4. 데이터베이스링크사용법... 47 CREATE DATABASE LINK... 48 DROP DATABASE LINK... 50 ALTER DATABASE LINKER... 52 ALTER SESSION... 54 SELECT... 55 REMOTE_EXECUTE_IMMEDIATE... 60 바인딩지원 REMOTE 함수... 61 일괄처리 (Batch) 지원 REMOTE 함수... 71 COMMIT FORCE DATABASE LINK... 79 ROLLBACK FORCE DATABASE LINK... 80 A. 부록 : 프로퍼티및데이터딕셔너리... 81 목차 3
DB Link 관련데이터딕셔너리... 82 프로퍼티파일... 83 AltiLinker 프로퍼티... 85 찾아보기... 95 4 Database Link User s Manual
서문 서문 5
이매뉴얼에대하여 이매뉴얼은데이터베이스링크 (Database Link) 의개념및사용 방법에대해서설명한다. 대상사용자 이매뉴얼은다음과같은 Altibase 사용자를대상으로작성되었다. 데이터베이스사용자 데이터베이스관리자 응용프로그램개발자 성능관리자 기술지원부이매뉴얼을읽고이해하기위해다음과같은배경지식이도움이될것이다. 컴퓨터, 운영체제및운영체제유틸리티운용에필요한기본지식 관계형데이터베이스사용경험또는데이터베이스개념에대한이해 컴퓨터프로그래밍과관련된경험또는지식 데이터베이스서버관리, 운영체제관리또는네트워크관리경험 분산환경에서의데이터의저장, 관리및처리와관련된지식 소프트웨어환경 이매뉴얼은데이터베이스서버로 Altibase 버전 7.1 을사용한다는가정하에작성되었다. 이전버전의경우해당버전과일치하는데이터베이스링크매뉴얼을참고하도록한다. 이매뉴얼의구성 이매뉴얼은다음과같이구성되어있다. 제 1 장데이터베이스링크소개이장에서는데이터베이스링크의개념과 Altibase 의 6 Database Link User s Manual
데이터베이스링크구성요소를설명한다. 제 2 장지원되는 SQL 문, 스키마객체및데이터타입이장은데이터베이스링크사용을위해 Altibase 가제공하는 SQL 구문과데이터베이스링크를통해서접근할수있는원격데이터베이스의스키마객체, 그리고데이터베이스링크와함께사용가능한데이터타입에대해설명한다. 제 3 장데이터베이스링크환경설정이장은 Altibase 의데이터베이스링크를사용하기위해필요한환경설정에대해설명한다. 제 4 장데이터베이스링크사용법이장에서는데이터베이스링크제어를위해제공되는 SQL 구문과 REMOTE 함수와함께데이터베이스링크를사용하는방법에대해상세히설명한다. A. 부록 : 데이터딕셔너리및프로퍼티이부록은데이터베이스링크와관련하여사용되는각종프로퍼티및데이터딕셔너리를기술한다. 문서화규칙 이절에서는이매뉴얼에서사용하는규칙에대해설명한다. 이규칙을이해하면이매뉴얼과설명서세트의다른매뉴얼에서정보를쉽게찾을수있다. 여기서설명하는규칙은다음과같다. 구문다이어그램 샘플코드규칙 구문다이어그램 이매뉴얼에서는다음구성요소로구축된다이어그램을사용하여, 명령문의구문을설명한다. 구성요소 예약어 의미명령문이시작한다. 완전한명령문이아닌구문요소는화살표로시작한다. 명령문이다음라인에계속된다. 완전한명령문이아닌구문요소는이기호로종료한다. 명령문이이전라인으로부터계속된다. 완전한명령문이아닌구문요소는이기호로시작한다. ; 명령문이종료한다. 서문 7
SELECT 필수항목 선택적항목 NOT ADD 선택사항이있는필수항목. 한항목만제공해야한다. DROP 선택사항이있는선택적항목. ASC DESC ASC 선택적항목. 여러항목이허용된다. 각반복앞부분에 콤마가와야한다. DESC, 샘플코드규칙 코드예제는 SQL, 저장프로시저, isql 또는다른명령라인 구문들을예를들어설명한다. 아래테이블은코드예제에서사용된인쇄규칙에대해설명한다. 규칙 의미 예제 [ ] 선택항목을표시 VARCHAR [(size)] [[FIXED ] VARIABLE] { } 필수항목표시. 반드시하나이상을선택해야되는표시 { ENABLE DISABLE COMPILE } 선택또는필수항목표시의인자구분표시. 그이전인자의반복표시. 예제코드들의생략되는것을. 표시 { ENABLE DISABLE COMPILE } [ ENABLE DISABLE COMPILE ] SQL> SELECT ename FROM employee; ENAME ----------------------- SWNO HJNO HSCHOI. 8 Database Link User s Manual
그밖에기호기울임꼴소문자대문자 위에서보여진기호이외에기호들구문요소에서사용자가지정해야하는변수, 특수한값을제공해야만하는위치표시자사용자가제공하는프로그램의요소들, 예를들어테이블이름, 칼럼이름, 파일이름등시스템에서제공하는요소들또는구문에나타나는키워드.. 20 rows selected. EXEC :p1 := 1; acc NUMBER(11,2); SELECT * FROM table_name; CONNECT userid/password; SELECT ename FROM employee; DESC SYSTEM_.SYS_INDICES_; 관련자료 자세한정보를위하여다음문서목록을참조하기바란다. Getting Started Guide Installation Guide Administrator s Manual Replication Manual General Reference SQL Reference Stored Procedures Manual isql User s Manual Error Message Reference 온라인매뉴얼 Altibase 고객서비스포털 (http://support.altibase.com) 에서국문및 영문매뉴얼 (PDF, HTML) 을받을수있다. Altibase 는여러분의의견을환영합니다. 이매뉴얼에대한여러분의의견을보내주시기바랍니다. 사용자의 의견은다음버전의매뉴얼을작성하는데많은도움이됩니다. 서문 9
보내실때에는아래내용과함께고객서비스포털 (http://support.altibase.com/kr/) 로보내주시기바랍니다. 사용중인매뉴얼의이름과버전 매뉴얼에대한의견 사용자의성함, 주소, 전화번호이외에도 Altibase 기술지원설명서의오류와누락된부분및기타기술적인문제들에대해서위주소로보내주시면정성껏처리하겠습니다. 또한, 기술적인부분과관련하여즉각적인도움이필요한경우에도고객서비스포털을통해서비스를요청하시기바랍니다. 여러분의의견에항상감사드립니다. 10 Database Link User s Manual
1. 데이터베이스링크소개 이장에서는데이터베이스링크의개념과 Altibase 의데이터베이스 링크구성요소를설명한다. 데이터베이스링크소개 11
관련전문용어 이절은 Altibase 데이터베이스링크를사용하기위해알아야하는용어를소개한다. Altibase 분산데이터베이스시스템 (Altibase Distributed Database System) Altibase 서버노드가최소한한개이상포함된두개이상의데이터베이스서버노드들로구성된시스템을말한다. 원격노드 (Remote Node) 데이터베이스링크로연결된대상서버또는시스템을의미한다. Altibase 서버혹은이기종의데이터베이스시스템을원격노드로사용할수있다. 이때데이터베이스링크로연결되는대상서버또는시스템이반드시물리적으로떨어져있는장비에존재해야할필요는없다. 즉, 하나의장비에로컬서버와대상데이터베이스서버가모두존재할경우에도대상데이터베이스서버를원격노드라고한다. 원격서버 (Remote Server) 원격노드와원격서버의의미를구분하여사용한다. 원격노드는데이터베이스링크로연결된대상데이터베이스서버만을의미하는데반해, 원격서버는데이터베이스링크연결과는상관없이논리적으로구분되는데이터베이스서버를일컫는다. 연결 (Link) 데이터베이스링크를통한서버간의연결을가리킨다. 링크객체 (Link Object) 대상데이터베이스서버에연결하기위해로컬데이터베이스에생성하는데이터베이스링크객체를말한다. 지역서버 (Local Server) 데이터베이스링크의주체가되는 Altibase 서버로써, 데이터베이스링크객체를생성하고사용한다. 링커프로세스 (Linker Process) 이기종 DBMS 들로구성된분산데이터베이스시스템을구축할경우에지역서버와원격서버간의통신을담당한다. 이프로세스는지역서버에서구동되며, AltiLinker 라고도표현한다. 링커세션 (Linker Session) Altibase 서버와 AltiLinker 프로세스간에생성되는 1:1 세션을의미한다. 링커세션은링커제어세션 (Linker Control Session) 과링커데이터세션 (Linker Data Session) 으로구분된다. 12 Database Link User s Manual
위치표시자 (@) (Location Descriptor) SQL 구문에데이터베이스링크를표현하기위해사용되는기호이다. 객체명과데이터베이스링크이름사이에 '@' 기호로위치표시자를쓸수있다. 글로벌트랜잭션 (Global Transaction) 지역서버에서수행되는 SQL 구문과원격노드에서수행되는 SQL 구문으로구성되는트랜잭션이다. 로컬트랜잭션 (Local Transaction) 지역서버에서수행되고완료되는구문들로구성된트랜잭션을의미한다. 원격트랜잭션 (Remote Transaction) 원격노드에서데이터베이스링크로수행중인모든트랜잭션을의미한다. 글로벌커밋노드 (Global Commit Node) 글로벌트랜잭션을 commit 또는 rollback 하는노드이다. 주로사용자가데이터베이스링크를생성하여글로벌트랜잭션을시작하는노드이다. REMOTE 함수 Altibase 데이터베이스링크기능을수행하는 pass-through 스타일의저장함수혹은저장프로시저를의미한다. 원격구문 (Remote Statement) 데이터베이스링크를통해전달되어원격서버에서수행되는 SQL 구문을의미한다. 참여자 (Participant) 데이터베이스시스템간수행되는글로벌트랜잭션에서데이터베이스시스템을의미한다.. 데이터베이스링크소개 13
데이터베이스링크정의 이절은데이터베이스링크의개념과처리방식을소개하고, Altibase 분산데이터베이스시스템에대하여기술한다. 데이터베이스링크의개념 Altibase 의데이터베이스링크란각각독립적으로동작하는둘이상의데이터베이스서버가네트워크로연결되어있으며주어진권한내에서지역서버가원격서버에논리적으로관계가있는데이터를요청하고결과를받아오는기술요소이다. 독립적으로동작한다는것은각데이터베이스시스템이자신의데이터저장영역을갖고있으며, 사용자의요청을독립적으로처리할수있음을의미한다. 네트워크로연결된다는것은논리적으로구분된두시스템혹은서버가서로접근이가능하다는것을의미한다. 또한논리적으로관계가있다는것은개별노드에분산된데이터사이에상관관계가존재함을의미한다. 처리방식 Altibase 데이터베이스링크의처리방식을개략적으로설명하면다음과같다. 링크객체를생성한서버에질의를입력하면, 데이터베이스링크프로세스를거쳐원격서버에서필요한데이터를가져온후, 최종적인질의결과를사용자에게반환한다. 이과정에서최종사용자는논리적으로하나의서버가동작하는것으로인식하게된다. Altibase 데이터베이스링크는크게아래의네가지요소로구성되며, 아래그림에서짙은색으로표시되어있다. DK 모듈과 AltiLinker 프로세스는다음절에서상세히설명한다. DK 모듈 (DB-Link Module) AltiLinker: 자바로구현된링커프로세스 ADLP: Altibase 데이터베이스링크프로토콜 dblink.conf: 데이터베이스링크용프로퍼티파일 14 Database Link User s Manual
Altibase HDB Server Process AltiLinker Process Heterogeneous DBMSs DK Module ADLP JDBC Drivers... dblink.conf [ 그림 1-1] 데이터베이스링크처리방식 (Heterogeneous Link) Altibase 분산데이터베이스시스템개념 Altibase 분산데이터베이스시스템은논리적으로떨어져있는두개이상의데이터베이스서버들로구성되며, 최소한하나는 Altibase 서버이어야한다. 이때데이터베이스링크를생성하고사용하는데이터베이스는반드시 Altibase 이어야한다. 연결대상서버는 Altibase 서버일수도있고타사의이기종데이터베이스시스템일수도있다. 로컬서버의 Altibase 가데이터베이스링크로연결하는원격서버가동일한버전의 Altibase 서버인지아닌지에따라 Homogeneous Link 또는 Heterogeneous Link 로구분된다. 각각의링크는아래의메커니즘을갖는다. Heterogeneous Link Heterogeneous Link 는 Altibase 서버와이기종데이터베이스서버와의연결을의미한다. 원격서버의데이터베이스가 Altibase 이더라도지역서버의 Altibase 와버전이다르면 Heterogeneous Link 로연결된다. 동일한버전의 Altibase 서버간에도 Heterogeneous Link 가가능하다. Homogeneous Link Homogeneous Link 는동일한버전의프로토콜을사용하는 Altibase 서버간의연결을의미한다. Homogeneous Link 는링크프로세스 (AltiLinker) 를거치지않고서버간에직접연결한다. 따라서 Heterogeneous Link 에비해성능이좋으며, 특히원격노드에접근이빈번할수록성능격차가더커진다. 데이터베이스링크소개 15
Altibase 버전 6.5.1 이상은 Homogeneous Link 를지원하지않는다. 아래표는이문서에서사용하는간략한용어에대한정식명칭과그 의미를나타낸다. Notation Full Name Meaning DB-Link Altibase Database Link Altibase 데이터베이스링크 Heterogeneous- Link Homogeneous- Link Heterogeneous DBMS Heterogeneous Database Link Homogeneous Database Link Heterogeneous database management system Altibase 서버와이기종데이터베이스시스템간의데이터베이스링크동일한버전의 Altibase 서버간의데이터베이스링크이질적인데이터베이스관리시스템으로, 지역서버의 Altibase와버전이다른 Altibase 서버도포함 16 Database Link User s Manual
Altibase 데이터베이스링크구성요소 이절은 Altibase DB Link 를구성하는요소들중데이터베이스링크 모듈과 AltiLinker 프로세스에대해상세히설명한다. 데이터베이스링크모듈 데이터베이스링크모듈 ( 이하 DK 모듈로표기 ) 은 Altibase 서버내에서데이터베이스링크를구현한모듈이다. 이모듈은분산데이터베이스시스템환경에서원격서버와의연결을위한세션관리, 원격서버와의연결을의미하는데이터베이스링크객체들의관리, 데이터베이스링크를거쳐수행되는트랜잭션들의관리, 각종성능뷰에제공할정보관리, 원격질의의수행결과로얻은레코드집합관리등을수행한다. 각각에대해서아래의절에상세히설명한다. 링크객체관리 링커세션관리 성능뷰의정보관리 글로벌트랜잭션관리 분산트랜잭션복구 결과집합데이터관리링크객체관리 Altibase 에서링크객체는스키마객체에해당된다. 링크객체의생성과삭제는 SQL 문을사용해서가능하며, 각 SQL 문에대해서는 "4 장데이터베이스링크사용법 " 에서자세히설명한다. Altibase 는링크객체에대해아래의두가지권한을제공한다. 종류허용된사용자설명 PRIVATE Database Link PUBLIC Database Link 링크객체를생성한사용자와 SYS 사용자모든사용자 PRIVATE 링크객체는 SYS 사용자또는해당링크객체를생성한사용자만이사용하거나삭제할수있다. PUBLIC 링크객체는모든사용자가사용할수있다. 단, 삭제는 SYS 사용자또는해당객체를생성한사용자만이할수있다. 링커세션관리 Altibase DK 모듈은 AltiLinker 프로세스에연결하기위해링커 데이터베이스링크소개 17
세션을생성하고, 사용자세션이데이터베이스링크를참조할때마다이링커세션의연결상태를감시한다. 아래그림은클라이언트가데이터베이스링크를사용하는 SQL 구문을실행할때, 이를처리하기위해 DK 모듈및 AltiLinker 프로세스에생성되는세션들을나타낸다. DK Module AltiLinker Process Session Manager Linker Control Session Control Op. AltiLinker Session Linker Data Session List Linker Data Session Data Op. AltiLinker Session Linker Data Session Data Op. AltiLinker Session Remote Server Linker Data Session Data Op. AltiLinker Session Remote Server Linker Data Session Data Op. AltiLinker Session Remote Server [ 그림 1-2] DK 모듈과 AltiLinker 프로세스내의링커세션 성능뷰의정보관리 사용자는성능뷰를조회하여데이터베이스링크관련정보를확인할수있다. Altibase 가데이터베이스링크를위해관리하는성능뷰의정보는아래와같다. 데이터베이스링크객체정보데이터베이스에생성된데이터베이스링크객체에대한정보를의미하며, 이정보는 V$DBLINK_DATABASE_LINK_INFO 성능뷰로사용자에게제공된다. 링커세션정보 18 Database Link User s Manual
DK 모듈에서생성된링커세션에관련된정보를의미하며, 이정보는 V$DBLINK_LINKER_SESSION_INFO 성능뷰로사용자에게제공된다. 링커세션은링커제어세션과링커데이터세션으로구분된다. 링커제어세션은 AltiLinker 프로세스가종료되기전까지 Altibase 서버와 AltiLinker 프로세스사이에유일하게생성되어존재하고, 링커데이터세션은데이터베이스링크를사용하는사용자세션별로하나씩생성된다. 링커제어세션정보 : 링커제어세션의상태정보를의미하며, 이데이터는 V$DBLINK_LINKER_CONTROL_SESSION_INFO 성능뷰로사용자에게제공된다. 링커제어세션은 AltiLinker 프로세스의종료와상태정보의요청및설정변경등을수행한다. 링커데이터세션정보 : 링커데이터세션과관련된정보를의미하며, 이정보는 V$DBLINK_LINKER_DATA_SESSION_INFO 성능뷰로사용자에게제공된다. 트랜잭션정보 글로벌트랜잭션정보 : 글로벌트랜잭션에대한상태정보를의미하며, 이정보는 V$DBLINK_GLOBAL_TRANSACTION_INFO 성능뷰로사용자에게제공된다. 원격트랜잭션정보 : 데이터베이스링크를통해원격노드에서수행중인모든원격트랜잭션에대한상태정보를의미하며, 이정보는 V$DBLINK_REMOTE_TRANSACTION_INFO 성능뷰로사용자에게제공된다. 원격구문 (Remote Statement)) 정보 : 데이터베이스링크를통해원격노드에서수행중인모든구문 (statement) 에대한정보를의미하며, 이데이터는 V$DBLINK_REMOTE_STATEMENT_INFO 성능뷰로사용자에게제공된다. AltiLinker 프로세스의상태정보 AltiLinker 프로세스의동적인상태정보를의미하며, 이정보는 V$DBLINK_ALTILINKER_STATUS 성능뷰로사용자에게제공된다. 이정보에는연결상태뿐만아니라 AltiLinker 프로세스가현재사용중인 JVM 메모리에관련된정보도포함된다. 데이터베이스링크소개 19
글로벌트랜잭션관리 Altibase 데이베이스링크에서트랜잭션의개념은글로벌트랜잭션과원격트랜잭션으로구분된다. 글로벌트랜잭션이란지역서버에존재하는데이터베이스링크를통해원격서버에서수행되는원격트랜잭션을하나이상포함하는트랜잭션을의미한다. Altibase 데이터베이스링크는글로벌트랜잭션을처리하기위하여 ADLP 라는 Altibase 데이터베이스링크용프로토콜을구현하였다. 원격트랜잭션은데이터베이스링크를통해원격서버에서수행되는구문들로구성된트랜잭션으로글로벌트랜잭션을구성한다. ADLP (Altibase Database Link Protocol) ADLP 는 Altibase 서버와 AltiLinker 프로세스사이에데이터교환방식과처리방식을정의한것으로, 다음의내용을포함한다. 링커세션제어 원격트랜잭션제어 원격구문수행 AltiLinker 프로세스제어글로벌트랜잭션완료는글로벌트랜잭션에참여하고있는모든서버 ( 로컬및원격 ) 에서트랜잭션을한꺼번에완료 ( 커밋혹은롤백 ) 해야한다. 따라서어느한서버에문제가발생하면데이터의일관성을유지하지못할수있다. 이러한문제의대처방안으로 Altibase 데이터베이스링크는지역서버와원격서버간의프로토콜공유정도에따라세가지레벨의글로벌트랜잭션수행메커니즘을제공한다. 원격구문실행레벨 (Remote Statement Execution Level) 원격구문실행레벨은글로벌트랜잭션의전역적인일관성을보장하지않는다. 단지데이터베이스링크를통해원격노드에서구문을수행하는것만을보장한다. 즉, 이레벨에서는하나의글로벌트랜잭션내에서로컬서버에서수행되는구문과데이터베이스링크를통해원격서버에서수행되는구문은별개의트랜잭션으로동작한다. DBLINK_GLOBAL_TRANSACTION_LEVEL 프로퍼티를이레벨로설정하면, AltiLinker 가원격서버로연결하는세션은기본적으로 autocommit 모드가 ON 으로설정된다. 단순트랜잭션커밋레벨 (Simple Transaction Commit Level): Altibase 데이터베이스링크중 Heterogeneous Link 는 20 Database Link User s Manual
Altibase 와이기종의데이터베이스시스템간에수행되는글로벌트랜잭션의원자성을보장하기위하여단순트랜잭션커밋의메커니즘을구현한다. 이레벨은 2 단계커밋의동작방식과유사하다. 그러나, 2 단계커밋프로토콜이커밋준비를위해서버간에메시지를주고받는것과는달리, 단순트랜잭션커밋의경우에는서버간에메시지교환없이단지커밋이나롤백명령을원격노드로전달할수있는지만을검사한다. 단순트랜잭션커밋레벨이동작하기위해서는원격노드를구성하는데이터베이스시스템이 auto-commit 모드를 OFF 로설정할수있는시스템이어야한다. DBLINK_GLOBAL_TRANSACTION_LEVEL 프로퍼티를이레벨로설정하면, AltiLinker 가원격서버로연결하는세션은기본적으로 autocommit 모드가 OFF 로설정된다. 2 단계커밋레벨 (Two-Phase Commit Level): 알티베이스서버와이기종데이터베이스시스템간의글로벌트랜잭션정합성을보장하는 2PC 프로토콜을제공한다. DBLINK_GLOBAL_TRANSACTION_LEVEL 프로퍼티를 2(Two- Phase Commit Level) 로설정한후에사용할수있다. 아래그림은 2PC Commit Level 의동작을설명한다. 데이터베이스링크소개 21
Altibase Altilinker Participant1 Participant2 COMMIT Write prepare log REQ PREPARE Prepare Phase Call prepare RESULT Call prepare RESULT PREPARE ACK Write commit log REQ COMMIT Commit Phase Call commit Call commit COMMIT ACK Write end log [ 그림 1-3] 2 단계커밋레벨 (2-PC Commit Level) 준비단계 (Prepare Phase): 사용자가커밋을수행하면알티베이스는준비로그 (prepare log) 를기록하고준비요청메시지를 AltiLinker 에게보낸다. 메시지를받은 AltiLinker 는글로벌트랜잭션에속한모든참여자에게준비요청메시지를보낸다. 그리고참여자가준비를마치면 AltiLinker 는알티베이스에게준비완료메시지를보내고모든참여자에게결과를받은알티베이스는다음단계를진행한다. 커밋단계 (Commit Phase): 알티베이스는커밋로그 (commit log) 를기록하고커밋요청메시지를 AltiLinker 에게보낸다. AltiLinker 는모든참여자에커밋을수행하며모든참여자가커밋에성공할때까지커밋메시지를보낸다. 참여자전원이커밋에성공하면알티베이스에게성공메시지를보낸다. 알티베이스가성공메시지를받으면해당트랜잭션이종료되었다는것을의미하므로종료로그 (end log) 를남기고결과를반영한다. 즉, 종료로그가기록된트랜잭션은장애복구를할수없다. Altibase 는글로벌트랜잭션및원격트랜잭션에대한정보및트랜잭션의처리상태에관한정보를성능뷰로제공한다. 22 Database Link User s Manual
분산트랜잭션복구 (Recovery Of Distributed Transaction) 장애시점은 2PC 를기준으로하고, 장애대상은알티베이스와참여자 ( 원격데이터베이스시스템 ) 로한다. 알티베이스는참여자와메시지를주고받을때 ALTILINKER_RECEIVE_TIMEOUT 에설정한시간동안응답이없으면참여자에장애가발생했다고판단한다. 준비로그의기록이전알티베이스에장애가발생한경우, 분산트랜잭션의시작로그에는기록이남지만준비로그에는기록이남지않았다면참여하고있는모든원격트랜잭션를철회한다. 그리고알티베이스에서수행되고있는로컬트랜잭션도철회되며종료로그를기록한다. 준비로그의기록이후 - 커밋로그의기록이전알티베이스에장애가발생한경우, 분산트랜잭션의준비로그는기록되지만커밋로그및롤백로그는기록되지않는다. 커밋로그가기록되지않은상황에는정합성보장을위해수행하고있는모든원격트랜잭션을복구한다. 이때참여자에장애가발생하면원격트랜잭션의복구를보장하기위해참여자가롤백메시지를받을때까지알티베이스는메시지송신을시도하여복구를수행하고종료로그를기록한다. 참여자에장애가발생한경우, 알티베이스는참여자의트랜잭션이복구하도록메시지를보낸다. AltiLinker 에장애가발생한경우, 모든원격트랜잭션의상태를알수없으며모든트랜잭션에대한커밋로그가기록되지않았으므로롤백을수행하고종료로그를기록한다. 커밋로그의기록이후 - 종료로그의기록이전커밋단계에서장애가발생한경우에는분산트랜잭션에대한커밋및롤백로그가기록되지만종료로그는기록되지않는다. 알티베이스는참여자에게커밋메시지의응답을받지못한상태로참여자의트랜잭션이커밋또는롤백되도록지속적으로시도하고완료되면종료로그를기록한다. 결과집합데이터관리 Altibase DK 모듈은데이터베이스링크를통해로컬서버와원격서버간에주고받는데이터를처리하는기능을제공한다. DK 모듈은다음과같은데이터를처리한다. 제어데이터 (Control Data): ADLP 에정의되어있는각작업이요구하는데이터로, 내부적으로생성되어 DK 모듈과 데이터베이스링크소개 23
AltiLiker 프로세스간에주고받는데이터를의미한다. 사용자데이터 (User Data): 프로퍼티설정값, 원격서버에서수행할구문의문자열및바인딩변수의설정값등이해당된다. 원격데이터 (Remote Data): 원격서버에서수행된결과데이터로, DK 모듈이수신하는데이터를의미한다. 이러한데이터에대한처리는크게 Altibase 서버와 AltiLinker 프로세스사이에주고받는모든데이터의타입변환과원격서버에서수행한쿼리의결과로받는원격데이터의버퍼링으로구분된다. 타입변환은 ADLP 에정의된작업별데이터명세에따라변환이수행되며, 원격데이터의경우원격서버가수행한쿼리의결과집합내의각타입을거기에대응하는 Altibase 서버타입으로변환한다. 원격데이터의버퍼링은 DK 모듈내부적으로관리하는고정된크기의메모리버퍼 ( 이후 DK 버퍼로표현 ) 와디스크임시테이블을이용한다. 사용자는데이터베이스링크를위해사용할 DK 버퍼의크기를프로퍼티로조절할수있다. 한번설정된버퍼의크기는 Altibase 운영중에는변경할수없으므로, 메모리자원과성능을고려하여서버시작전에결정하도록한다. DK 버퍼는한개이상의데이터버퍼블록으로구성되며, 데이터버퍼블록의최소크기와개수는프로퍼티로조절할수있다. AltiLinker 프로세스 AltiLinker 는 Altibase 패키지내에포함되어배포되는자바응용프로그램이다. AltiLinker 프로세스는 Heterogeneous Link 용으로동작하며, 링크객체가존재하는 Altibase 서버와해당링크객체에의해연결되는이기종데이터베이스시스템혹은원격서버와의통신을담당한다. Altibase 데이터베이스링크에서 Heterogeneous Link 에대해제공하는 AltiLinker 는아래와같은몇가지특징이있다.. 데이터베이스링크로연결된이기종데이터베이스서버에서발생한오류가 Altibase 서버에영향을주지않는다. AltiLinker 는 JDBC 인터페이스로원격데이터베이스에접근하므로 JDBC 를지원하는모든데이터베이스시스템에 Altibase 데이터베이스링크로접근이가능하다. AltiLinker 프로세스를활성화하려면, 아래의두프로퍼티를설정해야한다. 24 Database Link User s Manual
프로퍼티 설정값 프로퍼티파일 DBLINK_ENABLE 1 (0이면 disable) altibase.properties ALTILINKER_ENABLE 1 (0이면 disable) dblink.conf AltiLinker 프로세스의역할을간략히정리하면아래와같다. JDBC 드라이버를통해이기종데이터베이스시스템에연결 ADLP 프로토콜을통해 Altibase 서버에서요청받은작업 수행 원격노드에서수행한쿼리의결과를 Altibase 서버로전달 주의사항 AltiLinker 프로세스는 JDBC 인터페이스를사용하여원격서버의데이터베이스에접근하므로해당데이터베이스벤더가제공하는 JDBC 드라이버가반드시필요하다. AltiLinker 프로세스는지역서버와동일한장비에서만동작한다. 데이터베이스링크소개 25
2. 지원되는객체, SQL 문및 데이터타입 이장은데이터베이스링크사용을위해 Altibase 가제공하는 SQL 구문과데이터베이스링크를통해서접근할수있는원격데이터베이스의스키마객체, 그리고데이터베이스링크와함께사용가능한데이터타입에대해설명한다. 지원되는객체, SQL 문및데이터타입 27
데이터베이스링크와 SQL 문 이절은데이터베이스링크와함께사용할수있는 SQL 구문에대해 설명한다. Altibase 데이터베이스링크는원격스키마객체접근을위해크게 두종류의방식을제공한다. 하나는이전까지의버전처럼위치 표시자 (@) 를사용해서원격서버의테이블이나뷰에접근하는 방식이고, 다른하나는 SQL 문전체를원격서버로직접전송하는 pass-through 방식 (style) 이다. Altibase 데이터베이스링크는 pass-through 방식을지원하기위해 REMOTE_TABLE 키워드와내장 (built-in) 된 REMOTE 프로시저와 함수들 ( 이하 REMOTE 함수로표기 ) 을제공한다. REMOTE_TABLE 키워드또는 REMOTE 함수들을사용하면 SQL 문자체가원격 서버로전송되어원격서버가직접해당 SQL 문을수행한다. REMOTE 함수들은 SQL 문내의파라미터마커에값을바인딩할수 있는함수와그렇지않은함수로구분된다. 아래는 SQL 구문종류별로 RETMOTE_TABLE 키워드와 REMOTE 함수들의사용가능여부를표로나타낸것이다. REMOTE_TABLE 키워드 REMOTE_EXECUTE_ IMMEDIATE 바인딩지원 REMOTE 함수들 DDL 문 X O O DCL 문 X O O DML 문 X O O (INSERT, UPDATE, DELETE) SELECT 문 O X O REMOTE_TABLE REMOTE_TABLE 은지역서버에서입력되는 SELECT 구문의 FROM 절에만사용할수있는키워드이다. REMOTE_TABLE 키워드뒤에는원격서버에서수행할 SELECT 구문만지정할수있다. 또한, REMOTE_TABLE 키워드는파라미터마커가포함된 SQL 문, 즉바인딩과함께사용할수없다. SQL 문에 REMOTE_TABLE 키워드를사용하는문법은 "4 장 28 Database Link User s Manual
데이터베이스링크사용법 " 에서기술한다. REMOTE_EXECUTE_IMMEDIATE REMOTE_EXECUTE_IMMEDIATE 입력한 SQL 문을데이터베이스링크를통해원격서버에서수행하는내장된저장프로시저다. 이프로시저는 SELECT 문을제외한 Altibase 데이터베이스링크에서지원하는모든 DML 문, DDL 문과 DCL 문을수행할수있다. 또한, 이프로시저로는파라미터마커가포함된 SQL 문의수행, 즉바인딩의사용이불가능하다. 이프로시저의문법은 "4 장데이터베이스링크사용법 " 을참고하기바란다. 바인딩지원 REMOTE 함수 데이터베이스링크를통해파라미터마커가포함된 SQL 문을실행할수있는 REMOTE 함수들에대해설명한다. 파라미터마커가포함된 SQL 문을실행하고각파라미터에값을바인딩하기위해서는아래의 REMOTE 함수들을사용하면된다. 단, 아래의 REMOTE 함수들은저장프로시저내에서만사용할수있고, 호출순서도지켜야한다. REMOTE_ALLOC_STATEMENT REMOTE_BIND_VARIABLE REMOTE_EXECUTE_STATEMENT REMOTE_NEXT_ROW REMOTE_GET_COLUMN_VALUE_type REMOTE_FREE_STATEMENT 아래는저장프로시저내에서파라미터마커가포함된 SELECT 문을수행하기위해 REMOTE 함수를호출하는순서이다. 1. REMOTE_ALLOC_STATEMENT 2. REMOTE_BIND_VARIABLE 3. REMOTE_EXECUTE_STATEMENT 4. REMOTE_NEXT_ROW 5. REMOTE_GET_COLUMN_VALUE_type 6. REMOTE_FREE_STATEMENT 아래는저장프로시저내에서 SELECT 문이외의파라미터마커가 지원되는객체, SQL 문및데이터타입 29
포함된 DML, DDL 문을수행하기위해 REMOTE 함수를호출하는순서이다. 7. REMOTE_ALLOC_STATEMENT 8. REMOTE_BIND_VARIABLE 9. REMOTE_EXECUTE_STATEMENT 10. REMOTE_FREE_STATEMENT 각 REMOTE 함수에대한문법과상세한설명은 "4 장데이터베이스링크사용법 " 을참고하기바란다. 30 Database Link User s Manual
접근가능한원격스키마객체 이절에서는데이터베이스링크로접근할수있는원격스키마 객체들을설명한다. 원격스키마객체 위치표시자 @ 로접근가능한가? REMOTE 함수로접근가능한가? 테이블 O O 인덱스 X O 뷰 O O 저장프로시저 X O 시퀀스 X O 큐 X O 트리거 X O 시노님 X O 제약조건 X O [ 표 2-1] 데이터베이스링크로접근가능한원격스키마객체 위의표에서보듯이데이터베이스링크를위치표시자 (@) 와함께 사용해서원격서버에서접근할수있는객체는테이블과뷰뿐이다. 그러나, pass-through 방식의 REMOTE 함수를사용하면원격 노드의거의모든스키마객체에접근이가능하다. 주의 : 위치표시자 (@) 는이전버전과의호환성을위해지원되며, 위치표시자 (@) 를사용해서는이전버전에서와마찬가지로원격 서버에서 SELECT 구문만수행할수있다. 또한, 위치표시자가 포함된질의는서버에서쿼리최적화가수행되지않기때문에, REMOTE 함수를사용하는것이질의처리속도가더빠르다. 아래의절에서는 REMOTE 함수를사용해서원격스키마객체에 접근하는방법과 SQL 문예제를보여준다. 테이블 데이터베이스링크의핵심기능은데이터가서로다른데이터베이스에분산되어있는테이블간의상호운용 (Interoperation) 을제공하는것이다. Altibase 데이터베이스링크를사용해서원격테이블에 SELECT, INSERT, UPDATE, DELETE 및 DDL 문을수행할수있다. 지원되는객체, SQL 문및데이터타입 31
SELECT 질의의경우, 아래와같이 FROM 절에 REMOTE_TABLE 키워드를사용해서원격테이블을조회할수있다. SELECT * FROM REMOTE_TABLE( link1, 'select * from t1' ); 만약 WHERE 절에서원격객체를참조하려면아래예제와같이 부질의를사용하면된다. SELECT * FROM t1 WHERE t1.c1 = ( SELECT * FROM REMOTE_TABLE( link1, 'select c2 from t2' ) ); 원격서버에 DML 또는 DDL 문을수행하려면아래예제와같이 REMOTE_EXECUTE_IMMEDIATE 프로시저를사용하면된다. REMOTE_EXECUTE_IMMEDIATE( 'link1', 'insert into t1 values(1)' ); REMOTE_EXECUTE_IMMEDIATE( 'link1', 'create table t1(c1 integer primary key, c2 integer)' ); 파라미터마커가포함된 SELECT 문의경우위의 " 바인딩지원 REMOTE 함수 " 절에기술한순서로바인딩지원 REMOTE 함수들을 순서대로사용하면되고 DML 과 DDL 의경우도이와마찬가지이다. 아래는파라미터마커가포함된 INSERT 문을 REMOTE 함수를 사용해서수행하는저장프로시저예제이다. DECLARE statement_id result row_count BEGIN statement_id := REMOTE_ALLOC_STATEMENT( 'link1', 'insert into T1 values(?)' ); result := REMOTE_BIND_VARIABLE( 'link1', statement_id, 1, '20' ); row_count := REMOTE_EXECUTE_STATEMENT( 'link1', statement_id ); result := REMOTE_FREE_STATEMENT( 'link1', statement_id ); RETURN row_count; END; 아래는위치표시자 '@' 를사용해서원격서버의테이블을조회하는 예제이다. 위치표시자사용방식은기존버전과의호환성을 유지하기위해지원된다. SELECT * FROM t1@link1; 인덱스 Altibase 데이터베이스링크를사용해서원격서버에인덱스를 생성할수있다. REMOTE_EXECUTE_IMMEDIATE( 'link1', 'create index index1 on t1 (c1 asc, c2 desc)' ); 32 Database Link User s Manual
뷰 뷰에대해서도테이블과마찬가지로 SELECT, DML, DDL 문의수행을 지원하고사용법도테이블과동일하다. 아래는 REMOTE 함수를사용해서원격서버의뷰를조회하는 예제이다. SELECT * FROM REMOTE_TABLE( link1, 'select * from v1' ); 아래는 REMOTE 함수를사용해서원격서버에뷰를생성하는 예제이다. REMOTE_EXECUTE_IMMEDIATE( 'link1', 'create view v1 as select c1, c2, c3 from t1' ); 아래는위치표시자 '@' 를사용해서원격서버의뷰를조회하는 예제이다. SELECT * FROM v1@link1; 저장프로시저 Altibase 데이터베이스링크로원격서버의저장프로시저에접근할 수있다. 즉, 지역서버에서원격서버에저장프로시저를생성하고 원격서버에존재하는프로시저를호출할수있다. 지역서버의저장프로시저내에 REMOTE 함수를사용할경우, REMOTE 함수로접근가능한모든원격객체를참조할수있다. 아래는저장프로시저를호출하는 SELECT 문을 REMOTE_TABLE 키워드를사용해서원격서버에서수행하는예제이다. SELECT * FROM REMOTE_TABLE( link1, 'select remote_function1() from dual' ); SELECT * FROM t1 WHERE t1.c1 = ( SELECT * FROM REMOTE_TABLE( link1, 'select remote_function1() from dual' ) ); 아래는 REMOTE_EXECUTE_IMMEDIATE 프로시저를사용해서, 원격서버에저장프로시저를생성하고생성된프로시저를호출하는 예제이다. REMOTE_EXECUTE_IMMEDIATE( 'link1', 'create or replace procedure proc1 as i integer; begin i := 0; while i <> 1000 loop insert into t1 values(i); i := i + 1; end loop; end; /' ); REMOTE_EXECUTE_IMMEDIATE( 'link1', 'execute proc1' ); 지원되는객체, SQL 문및데이터타입 33
제약사항 지역서버의저장프로시저내에서원격서버의테이블에기반한 ROWTYPE 변수선언과커서선언은할수없다. 위치표시자 '@' 를사용하는경우이전버전과동일한제약사항을가진다. 다시말해위치표시자 '@' 를사용해서원격서버에존재하는저장프로시저에대한접근은불가능하나, 지역서버의저장프로시저내에서위치표시자 '@' 를사용해서원격서버의테이블또는뷰에접근하는것은가능하다. 시퀀스 Altibase 데이터베이스링크로원격서버의시퀀스에접근할수있다. 아래는시퀀스를참조하는 SELECT 문을 REMOTE_TABLE 키워드를 사용해서원격서버에수행하는예제이다. SELECT * FROM REMOTE_TABLE( link1, 'select seq1.currval, seq1.nextval from dual' ); 아래는시퀀스를참조하는 INSERT 문을 REMOTE_EXECUTE_IMMEDIATE 프로시저를사용해서원격서버에 수행하는예제이다. REMOTE_EXECUTE_IMMEDIATE( 'link1', 'insert into t1 values(seq1.nextval)' ); 아래는원격서버에시퀀스를생성하는예제이다. REMOTE_EXECUTE_IMMEDIATE( 'link1', 'create sequence seq1 start with 1 increment by 1' ); 큐 Altibase 데이터베이스링크로원격서버의큐에접근할수있다. 아래는 REMOTE_TABLE 키워드를사용해서원격서버의큐를 조회하는예제이다. SELECT * FROM REMOTE_TABLE( link1, 'select message from q1' ); 아래는 REMOTE_EXECUTE_IMMEDIATE 프로시저를사용해서원격 서버의큐에메시지를입력하는예제이다. REMOTE_EXECUTE_IMMEDIATE( 'link1', 'enqueue into q1(message) values(\'test message\')' ); 아래는원격서버에큐를생성하는예제이다. 34 Database Link User s Manual
REMOTE_EXECUTE_IMMEDIATE( 'link1', 'create queue q1(40) maxrows 1000' ); 트리거 Altibase 데이터베이스링크로원격서버의트리거에접근할수있다. 아래는원격서버에트리거를생성하는예제이다. REMOTE_EXECUTE_IMMEDIATE( 'link1', 'create trigger trigger1 after delete on orders referencing old row old_row for each row as begin insert into log1 values( old_row.c1, old_row.c2, old_row.c3, sysdate ); end; /' ); 시노님 Altibase 데이터베이스링크로원격서버의시노님에접근할수있다. 아래는 REMOTE_TABLE 키워드를사용해서원격서버의시노님을 조회하는예제이다. SELECT * FROM REMOTE_TABLE( link1, 'select * from synonym_table' ); SELECT * FROM REMOTE_TABLE( link1, 'select synonym_name from user_synonyms' ); 아래는원격서버의시노님에 DML 문을수행하는예제이다. REMOTE_EXECUTE_IMMEDIATE( 'link1', 'insert into synonym_table values( seq1.nextval )' ); 제약조건 Altibase 데이터베이스링크로원격서버의제약조건에접근할수 있다. 아래는원격서버의제약조건에 DML 문을수행하는예제이다. REMOTE_EXECUTE_IMMEDIATE( 'link1', 'set constraints all differed' ); 아래는원격서버의테이블에제약조건을추가하는 DDL 문을 수행하는예제이다. REMOTE_EXECUTE_IMMEDIATE( 'link1', 'alter table t1 add constraint const1 unique(c1)' ); 지원되는객체, SQL 문및데이터타입 35
DB Link 지원데이터타입 Altibase 데이터베이스링크는 JDBC 인터페이스를사용하므로, JDBC v3.0 에명세화된표준데이터타입을지원한다. 아래그림은지역서버인 Altibase 와 AltiLiker 사이의데이터타입변환과 AltiLinker 와각이기종데이터베이스의 JDBC 드라이버간의데이터타입변환이어떻게이루어지는지를보여준다. ALTIBASE HDB Server Altibase Data Type to Java Data Type AltiLinker Process Java Data Type to JDBC Data Type JDBC Drivers JDBC Drivers JDBC Drivers ALTIBASE HDB Oracle Java Data Type to Altibase Data Type JDBC Data Type to Java Data Type DB2 [ 그림 2-1] 데이터타입변환 아래의표는 Altibase 데이터타입들이어떤 JDBC 데이터타입및 표준 SQL 데이터타입과매핑되는지를보여준다. JDBC 데이터타입 Altibase SQL 데이터타입 표준 SQL 데이터타입 DB- Link 지원여부 비고 java.sql.types. CHAR CHAR CHAR O java.sql.types. VARCHAR VARCHAR VARCHAR O java.sql.types. LONGVARCH AR LONGVARC HAR X java.sql.types. NCHAR NCHAR NCHAR X JDBC v4.0 java.sql.types. NVARCHAR NVARCHA R NVARCHAR X JDBC v4.0 36 Database Link User s Manual
java.sql.types. LONGNVARC HAR java.sql.types. NUMERIC java.sql.types. DECIMAL java.sql.types. BIT java.sql.types. BOOLEAN java.sql.types. TINYINT java.sql.types. SMALLINT java.sql.types. INTEGER java.sql.types. BIGINT java.sql.types. REAL java.sql.types. FLOAT java.sql.types. DOUBLE java.sql.types. BINARY java.sql.types. VARBINARY LONGNVAR CHAR X NUMERIC NUMERIC O DECIMAL DECIMAL O SMALLINT BIT O BIT (bitset) X SMALLINT BOOLEAN O SMALLINT TINYINT O SMALLINT SMALLINT O INTEGER INTEGER O BIGINT BIGINT O REAL REAL O FLOAT FLOAT O DOUBLE DOUBLE O BINARY BINARY X VARBINARY X JDBC v4.0 Altibase의 BIT 타입은한비트만표현가능한표준 BIT 타입과다르므로 SMALLINT 타입으로맵핑된다. Altibase의 BIT 타입은비트집합을저장한다. Altibase는 BOOLEAN 타입을제공하지않으므로, SMALLINT 타입으로맵핑된다. 원격서버가 Altibase일경우이타입에는데이터 INSERT가불가능하다. Altibase는 TINYINT 타입을제공하지않으므로, SMALLINT 타입으로맵핑된다. 원격서버가 Altibase일경우이타입에는데이터 INSERT가불가능하다. 지원되는객체, SQL 문및데이터타입 37
java.sql.types. LONGVARBIN ARY java.sql.types. DATE java.sql.types. TIME java.sql.types. TIMESTAMP java.sql.types. CLOB java.sql.types. NCLOB java.sql.types. BLOB java.sql.types. ARRAY java.sql.types. DISTINCT java.sql.types. STRUCT java.sql.types. REF java.sql.types. DATALINK java.sql.types. JAVA_OBJECT java.sql.types. NUMERIC LONGVARBI NARY X DATE DATE O DATE TIME O DATE TIMESTAMP O CLOB CLOB X NCLOB X BLOB BLOB X X X X X X X NUMERIC NUMERIC O NIBBLE X 년도의값이 0보다작으면 ( 기원전 ), Altibase는 0으로처리한다. Oracle은 TIMESTAMP의최소표현단위가 nano초이나, Altibase는 micro초이므로, nano초가 micro초로변환된다. Oracle은 TIMESTAMP의최소표현단위가 nano초이나, Altibase는 micro초이므로, nano초가 micro초로변환된다. 또한, 년도의값이 0보다작으면 ( 기원전 ), Altibase는 0으로처리한다. JDBC v4.0 38 Database Link User s Manual
VARBIT X INTERVAL X [ 표 2-2] 데이터베이스링크지원데이터타입 지원되는객체, SQL 문및데이터타입 39
3. 데이터베이스링크환경 설정 이장은 Altibase 데이터베이스링크를사용하기위해필요한환경 설정에대해설명한다. 데이터베이스링크환경설정 41
DB Link 동작방식 환경설정에앞서데이터베이스링크가동작하는과정을간략히살펴보면다음과같다. 11. 사용자가원격서버에서수행될질의를포함한 SQL 문을지역서버에요청한다. 12. 지역서버의질의처리기가 SQL 문을파싱하여원격서버로보낼질의를준비한다. 13. 준비된질의를 AltiLinker 로전송한다. 14. AltiLinker 가질의를받아원격서버에질의수행을요청한다. 여기에 JDBC 인터페이스가사용된다. 15. 원격서버는요청받은질의를수행하고결과를 AltiLinker 로반환한다. 16. 원격서버로부터받은질의결과를 AltiLinker 가지역서버로전송한다. 지역서버는받은결과데이터를용도에맞게변환하여이용한다. 위에서 3 번과 6 번단계에서 Altibase 서버와 AltiLinker 간에는 TCP 통신만을지원하며, 데이터교환은 ADLP 프로토콜을따른다. 또한 AltiLinker 는 JDBC 인터페이스를사용하여원격서버의데이터베이스에접근한다. JDBC 관련설정은시스템환경과상황에따라다를수있는데, 이장에서는 Java SE 1.5 환경을기준으로설명한다. 42 Database Link User s Manual
환경설정 이절은 Altibase 데이터베이스링크사용을위한 JDBC 환경설정방법을아래와같이설명한다. JRE 설치 JDBC 드라이버설치 AltiLinker 프로퍼티파일설정 Altibase 프로퍼티파일설정 JRE 설치 AltiLinker 는 JRE 1.5 버전이상에서동작하는자바응용 프로그램이므로, AltiLinker 가동작할장비에 1.5 버전이상의 JRE 가 설치되어있어야한다. AltiLiker 가접속할원격데이터베이스의 JDBC 드라이버가 1.5 이상 버전의 JRE 에서동작한다면, 해당 JDBC 드라이버와호환되는버전의 JRE 를설치해야한다. JRE 설치후에는 JAVA_HOME 과 CLASSPATH 등의환경변수를 설정해야한다. 아래는유닉스계열 OS 에서 JRE 관련환경변수를 설정하는예제이다. $ export JAVA_HOME=JRE 가설치된경로 $ export CLASSPATH=${JAVA_HOME}/lib:${CLASSPATH} $ export PATH=${JAVA_HOME}/bin:${PATH} JDBC 드라이버설치 데이터베이스링크를사용하기위해 AltiLinker 가동작하는장비에 JDBC 드라이버를설치한다. 이때설치하는 JDBC 드라이버는데이터베이스링크로접속할원격데이터베이스에해당하는벤더가제공하는것이다. 예를들어원격데이터베이스가오라클이라면오라클홈페이지에서 Oracle 데이터베이스서버에일치하는버전의 JDBC 드라이버를다운로드하여설치한다. 2PC(Two-Phase Commit) 프로토콜을사용하는경우에는 XA 를지원하는 ODBC Driver 를사용해야한다. 데이터베이스링크환경설정 43
AltiLinker 프로퍼티파일설정 AltiLinker 프로퍼티파일에는 AltiLinker 동작에관련된프로퍼티와 원격서버에접속하는데필요한프로퍼티가설정된다. AltiLinker 프로퍼티파일은 $ALTIBASE_HOME/conf 아래에 dblink.conf 파일로존재한다. 이파일에는아래의프로퍼티등이 설정된다. ALTILINKER_ENABLE ALTILINKER_PORT_NO TARGETS AltiLinker 프로세스를활성화하기위해서는 ALTILINKER_ENABLE 프로퍼티의값을 1 로설정해야한다. ALTILINKER_PORT_NO 프로퍼티에는 AltiLinker 의 TCP 대기 (listen) 포트번호를지정한다. TARGETS 프로퍼티에는 AltiLinker 가원격데이터베이스서버에 접속하는데필요한연결정보가아래와같은하위프로퍼티로 설정된다. JDBC_DRIVER: JDBC 드라이버파일의절대경로 CONNECTION_URL: 접속할원격데이터베이스서버의연결 URL USER: 원격데이터베이스서버에접속할사용자이름 PASSWORD: 원격데이터베이스서버에접속할사용자의암호 XADATASOURCE_CLASS_NAME: XADataSource 클래스 이름, Altibase.jdbc.driver.AltibaseXADataSource 에위치 XADATASOURCE_CLASS_URL_SETTER_NAME: XADataSource 의 URL 을설정 (Set), seturl 로설정가능 위항목중첫번째와두번째항목은프로퍼티파일에반드시 명시되어야한다. 나머지항목은프로퍼티파일에명시하거나 데이터베이스링크객체를생성하는시점에입력할수있다. 프로퍼티파일보다데이터베이스링크객체생성시점에명시한 사용자이름과암호가우선적으로사용된다. TARGETS 프로퍼티는아래의형식으로설정할수있다. 이 프로퍼티에는복수개의원격서버를명시할수있다. TARGETS = ( ( NAME = "alti1" JDBC_DRIVER = "/home/user/altibase_home/lib/altibase.jar" CONNECTION_URL = "jdbc:altibase://127.0.0.1:20300/mydb" USER = "sys" 44 Database Link User s Manual
PASSWORD = "manager" XADATASOURCE_CLASS_NAME= "Altibase.jdbc.driver.AltibaseXADataSource" XADATASOURCE_URL_SETTER_NAME = "seturl" ), ( NAME =.. JDBC_DRIVER =.. CONNECTION_URL =.. ) ) 대한자세한내용은 "A. 부록 : 데이터딕셔너리및프로퍼티 " 를 참고하기바란다. Altibase 프로퍼티파일설정 Altibase 데이터베이스링크를사용하기위해서는먼저 altibase.properties 파일에서 DBLINK_ENABLE 프로퍼티를 1 로설정해야한다. 모든프로퍼티설정후 Altibase 서버를구동시키면, AltiLinker 프로세스가 Altibase 서버프로세스와함께시작된다. 데이터베이스링크와관련된프로퍼티에대한자세한내용은 General Reference 의데이터베이스링크관련프로퍼티를참고한다. 데이터베이스링크환경설정 45
4. 데이터베이스링크사용법 이장에서는데이터베이스링크제어를위해제공되는 SQL 구문과 REMOTE 함수와함께데이터베이스링크를사용하는방법에대해 상세히설명한다. 데이터베이스링크사용법 47
CREATE DATABASE LINK 구문 create_database_link ::= CREATE DATABASE LINK dblink_name PUBLIC PRIVATE CONNECT TO user_id IDENTIFIED BY password USING target_name ; 전제조건 SYS 사용자또는 CREATE DATABASE LINK 시스템권한을가진 사용자만이데이터베이스링크객체를생성할수있다. 설명 사용자는 CREATE DATABASE LINK 문으로데이터베이스링크 객체를생성할수있다. 데이터베이스링크객체는하나의원격 서버만을대상으로한다. PUBLIC PRIVATE 생성할데이터베이스링크객체의 PUBLIC PRIVATE 속성을지정한다. PUBLIC 으로지정하면생성된데이터베이스링크객체를모든사용자가사용할수있으며, PRIVATE 로지정하면데이터베이스링크객체를생성한사용자와 SYS 사용자만사용할수있다. 지정하지않을경우, PUBLIC 으로생성된다. dblink_name 생성할데이터베이스링크객체의이름을명시한다. 데이터베이스 링크의이름은 SQL Reference 1 장의 " 객체이름규칙 " 을따라야 한다. 48 Database Link User s Manual
user_id/password 연결하고자하는원격서버의데이터베이스사용자이름과암호를지정한다. 여기에지정된사용자는데이터베이스링크로접근하는원격서버의대상객체에대한접근권한을가지고있어야한다. 그렇지않을경우, 권한관련오류가발생할것이다. 사용자이름과암호는기본적으로대문자로저장되므로, 대소문자구분을하거나특수문자를사용하기위해서는쌍따옴표 (") 로묶어서사용한다. target_name AltiLinker 프로퍼티파일에 TARGETS 프로퍼티에명시한원격서버들중원하는서버의이름을지정한다. AltiLinker 프로퍼티파일에 TARGETS 프로퍼티를설정하는자세한방법은 3 장의 "AltiLinker 프로퍼티파일설정 " 을참조한다. 예제 < 질의 1> AltiLinker 프로퍼티파일에 Altibase 로명시된원격 데이터베이스서버에사용자이름과암호 applys/applys 로접속하는 데이터베이스링크를생성하려한다. 생성자자신만이사용할수 있는 link1 이라는이름의데이터베이스링크객체를생성하라. CREATE PRIVATE DATABASE LINK link1 CONNECT TO applys IDENTIFIED BY applys USING Altibase; < 질의 2> AltiLinker 프로퍼티파일에 Altibase 로명시된원격 데이터베이스서버에사용자이름과암호 applys/applys 로접속하는 데이터베이스링크를생성하려한다. 시스템의모든사용자가사용할 수있는 link2 라는이름의데이터베이스링크객체를생성하라. 단, 사용자이름과암호가소문자이다. CREATE PUBLIC DATABASE LINK link2 CONNECT TO "applys" IDENTIFIED by "applys" USING Altibase; 또는 CREATE DATABASE LINK link2 CONNECT TO "applys" IDENTIFIED by "applys" USING Altibase; 데이터베이스링크사용법 49
DROP DATABASE LINK 구문 drop_database_link ::= DROP DATABASE LINK dblink_name PUBLIC ; PRIVATE 전제조건 SYS 사용자이거나 DROP DATABASE LINK 시스템권한을가진 사용자만이데이터베이스링크객체를제거할수있다. 설명 데이터베이스링크객체를삭제한다. dblink_name 제거할데이터베이스링크객체의이름을명시한다. 주의사항 제거하고자하는데이터베이스링크객체가사용중이라면, 제거할수없다. 제거할데이터베이스링크객체로수행중인질의가없는상태에서만데이터베이스링크객체제거가가능하다. 데이터베이스링크객체에대해질의수행중인경우에는오류가발생할것이다. 예제 < 질의 1> dblink1 이라는이름의 PRIVATE 데이터베이스링크객체를 제거하라. 50 Database Link User s Manual
DROP PRIVATE DATABASE LINK dblink1; < 질의 2> dblink1 이라는이름의 PUBLIC 데이터베이스링크객체를 제거하라. DROP PUBLIC DATABASE LINK dblink1; 또는 DROP DATABASE LINK dblink1; 데이터베이스링크사용법 51
ALTER DATABASE LINKER 구문 alter_database_linker ::= START ALTER DATABASE LINKER STOP ; FORCE DUMP 전제조건 SYS 사용자가 sysdba 관리자모드로접속해서이구문을수행할수 있다. 설명 AltiLiker 를구동하거나종료한다. START AltiLinker 를시작한다. 단, 실행중인 AltiLinker 프로세스가 존재하지않아야한다. STOP AltiLinker 를종료한다. 단, AltiLinker 종료가성공하려면데이터베이스링크를사용하는트랜잭션이없어야한다. 데이터베이스링크를사용하는트랜잭션이존재하면, 이구문실행은실패한다. STOP FORCE 데이터베이스링크를사용하는트랜잭션이존재하더라도, AltiLinker 프로세스를강제로종료한다. DUMP 52 Database Link User s Manual
AltiLinker 프로세스실행중에이구문을수행하면 AltiLinker 프로세스내의쓰레드들이현재수행하고있는작업들이파일로출력된다. 출력파일은 $ALTIBASE_HOME/trc/altibase_lk_dump.log 로고정되어있으며, ALTER DATABASE LINKER DUMP 구문을수행할때마다이파일을덮어쓴다. 예제 isql(sysdba)> ALTER DATABASE LINKER START; Alter success. isql(sysdba)> ALTER DATABASE LINKER STOP; Alter success. isql(sysdba)> ALTER SESSION LINKER STOP FORCE; Alter success. isql(sysdba)> ALTER SESSION LINKER DUMP; Alter success. 데이터베이스링크사용법 53
ALTER SESSION 구문 close_database_link ::= ALTER SESSION CLOSE DATABASE LINK ALL dblink_name ; 전제조건 모든사용자가이구문을수행할수있다. 설명 Altibase 서버에서 AltiLinker 로연결하고있는링커세션을 종료한다. LINK ALL 모든링커세션을종료한다. LINK dblink_name 지정한이름의데이터베이스링크객체에연결된링커세션들만종료한다. 예제 ALTER SESSION CLOSE DATABASE LINK ALL; ALTER SESSION CLOSE DATABASE LINK link1; 54 Database Link User s Manual
SELECT Altibase 데이터베이스링크를사용해서원격데이터베이스의객체를조회 (SELECT) 하는방법은위치표시자 ( @ ) 를사용하거나 passthrough 방식을사용하는두가지가있다. Altibase 데이터베이스링크는 pass-through 스타일의 REMOTE_TABLE 키워드를사용할것을권장하고있으며, 위치표시자 ( @ ) 는이전버전과의호환성을위해지원한다. 두방식모두 FROM 절에서만데이터베이스링크를사용할수있다. SELECT 절에서사용하는문자열표기법에대한자세한설명은 General Reference 의 " 문자열표기 를참조한다. 위치표시자 위치표시자 '@' 를사용하는구문은이전버전과의호환성을 유지하기위해지원된다. 위치표시자를사용하는방법은아래의예제와같이 @ 기호를 사용하여해당객체가원격서버에존재하는객체임을표시하는 것이다. SELECT * FROM t1@link1; 위치표시자가포함된질의는이전버전과마찬가지로원격서버에서 테이블의모든레코드를로컬서버로가져온다. 따라서, 질의의 성격에따라 REMOTE_TABLE 키워드를사용하는것이처리속도를 높일수있다. 예를들어, 아래과같이위치표시자를사용한질의는원격테이블의 모든레코드를로컬서버로가져오기때문에, 네트워크비용과로컬 서버의연산비용, 그리고경우에따라발생하는디스크 I/O 비용까지추가로수반된다. 그러나, REMOTE_TABLE 키워드를 사용하면, 원격서버에서질의를처리하고로컬서버는결과로 하나의레코드만가져오기때문에, 성능면에서 REMOTE_TABLE 키워드를사용하는것이더효과적이다. 테이블명 : T1 테이블스키마 : C1 VARCHAR(1024), C2 VARCHAR(1024), C3 VARCHAR(1024),... C50 INTEGER, 데이터베이스링크사용법 55
... C100 VARCHAR(1024), 전체레코드수 : 1,000,000 (c50 컬럼값이 50 인레코드는 1 건 ) 17. 위치표시자사용 : SELECT c50, c100 FROM t1@link1 WHERE c50 = 50; 18. REMOTE_TABLE 키워드사용 : SELECT * FROM REMOTE_TABLE( link1, 'select c50, c100 from t1 where c50 = 50' ); 결론적으로, 데이터베이스링크를사용하여동일한결과를가져오는 질의의경우, 위치표시자보다 REMOTE_TABLE 키워드를사용할 것을권장한다. 예제 < 질의 1> 위치표시자를사용해서 link1 이가리키는원격서버에존재하는 t1 테이블전체를조회하라. SELECT * FROM t1@link1; < 질의 2> 위치표시자를사용해서원격테이블의 a1, a2 칼럼을조회하라. SELECT a1, a2 FROM ( SELECT * FROM t1@link1 ); REMOTE_TABLE pass-through 방식의 REMOTE_TABLE 키워드를사용해서원격서버에서 SELECT 문을수행할수있다. REMOTE_TABLE 키워드를사용하여원격서버에서질의를수행하면, 질의결과가메모리버퍼에저장된다. 저장된질의결과는질의처리기에전달된후삭제된다. 만약 JOIN 연산과같이삭제된결과에반복적으로접근해야하는질의가있다면, 원격서버에서질의를다시수행해야한다. REMOTE_TABLE 키워드를사용하는문법은아래와같다. REMOTE_TABLE ( dblink_name IN VARCHAR, statement_text IN VARCHAR ) dblink_name: 데이터베이스링크객체의이름 statement_text: 원격서버에서수행할 SELECT 문 56 Database Link User s Manual
예제 < 질의 1> REMOTE_TABLE 키워드를사용해서 link1 이가리키는 원격서버에존재하는 t1 테이블전체를조회하라. SELECT * FROM REMOTE_TABLE( link1, 'select * from t1' ); < 질의 2> REMOTE_TABLE 키워드를사용해서원격테이블의 a1, a2 칼럼을조회하라. SELECT * FROM REMOTE_TABLE( link1, 'select a1, a2 from t1' ); REMOTE_TABLE_STORE Altibase 는 REMOTE_TABLE 키워드로원격에서질의수행한결과를반복적으로접근할필요가있을때, 수행결과를디스크임시테이블에저장하여반복적으로접근할수있도록한다. WHERE 절 데이터베이스링크를이용하여원격서버에질의하는경우에도지역서버에서 SELECT 문으로질의할때와같은방법으로 WHERE 절을사용할수있다. 단, WHERE 절에는위치표시자또는 REMOTE_TABLE 키워드의사용이허용되지않으므로, FROM 절에별칭 (alias) 을명시하여 WHERE 절에서는이별칭을사용하도록한다. 예제 < 질의 1> link1 이가리키는원격서버의 t1 테이블에서칼럼 a1 의 값이 100 보다큰행을검색하라. SELECT * FROM REMOTE_TABLE( link1, 'select * from t1 where a1 > 100' ); 또는 SELECT * FROM REMOTE_TABLE( link1, 'select * from t1' ) t1_alias WHERE t1_alias.a1 > 100; 또는 SELECT * FROM t1@link1 WHERE a1 > 100; < 질의 2> link1 이가리키는원격서버의 emp2 테이블과지역 서버의 emp1 테이블에저장된모든사원중, rnd 부서에근무하는 사원의이름을검색하라. 데이터베이스링크사용법 57
SELECT emp_name FROM ( SELECT emp_no, emp_name FROM emp1 UNION ALL SELECT emp_no, emp_name FROM REMOTE_TABLE( link1, 'select emp_no, emp_name from emp2' ) ) v1, dept WHERE v1.emp_no = dept.emp_no AND dept.dept_name = 'rnd'; 또는 SELECT emp_name FROM ( SELECT emp_no, emp_name FROM emp1 UNION ALL SELECT emp_no, emp_name FROM emp2@link1 ) v1, dept WHERE v1.emp_no = dept.emp_no AND dept.dept_name = 'rnd'; 그외의 SELECT 기능 데이터베이스링크는 SELECT 구문에조인 (join), 부질의 (subquery), 집합연산자 (set operators), 집계함수 (aggregation functions) 의사용을지원한다. 또한 DDL 또는 DML 구문내에부질의형태로 SELECT 문이있는경우, 이부질의구문에도데이터베이스링크를사용할수있다. 예제 < 질의 1> link1 이가리키는원격서버의 t1 테이블의 a1 칼럼에서 중복을제거한값을검색하라. SELECT * FROM REMOTE_TABLE( link1, 'select distinct a1 from t1' ); 또는 SELECT DISTINCT a1 FROM t1@link1; < 질의 2> link1 이가리키는원격서버의 t_member 테이블과 t_dept 테이블을조인하여전체사원의부서를알아내고, 부서 ID 가 0 보다크거나같은값을갖는부서들을부서 ID 별로묶어각 부서의사원수, 평균나이를구하라. SELECT t1.dept_id, COUNT(*), AVG(age) FROM REMOTE_TABLE( link1, 'select * from t_member' ) t1, REMOTE_TABLE( link1, 'select * from t_dept' ) t2, WHERE t1.dept_id = t2.dept_id GROUP BY t1.dept_id HAVING t1.dept_id >= 0; 또는 SELECT t1.dept_id, COUNT(*), AVG(age) FROM t_member@link1 t1, t_dept@link1 t2 WHERE t1.dept_id = t2.dept_id GROUP BY t1.dept_id HAVING t1.dept_id >= 0; < 질의 3> link1 이가리키는원격서버의 t_member 와 t_dept 테이블을조인하여전체사원을알아내고, 이사원들중나이가 58 Database Link User s Manual
30 세보다작은사원중에서 ID 가큰순으로세명의사원을뽑아 이름, 나이, 전체사원의나이의합을구하라. SELECT t1.name, t1.age ( SELECT * FROM REMOTE_TABLE( link1, 'select sum(age) from t_member' ) ) sum FROM REMOTE_TABLE( link1, 'select dept_id, member_id, dept_name, age from t_member where age < 30' ) t1, REMOTE_TABLE( link1, 'select dept_id, dept_name, from t_dept' ) t2 WHERE t1.dept_id = t2.dept_id AND t1.age < 30 ORDER BY t1.member_id DESC LIMIT 3; 또는 SELECT t1.name, t1.age ( SELECT SUM(age) FROM t_member@link1 ) sum FROM t_member@link1 t1, ( SELECT dept_name, dept_id FROM t_dept@link1 ) t2 WHERE t1.dept_id = t2.dept_id AND t1.age < 30 ORDER BY t1.member_id DESC LIMIT 3; < 질의 4> link1 이가리키는원격서버의 t2 테이블에서이름과 나이를가져와서지역서버의 t1 테이블에삽입하라. INSERT INTO t1 SELECT * FROM REMOTE_TABLE( link1, 'select name, age from t2' ); 또는 INSERT INTO t1 SELECT name, age FROM t2@link1; 데이터베이스링크사용법 59
REMOTE_EXECUTE_IMMEDIATE REMOTE_EXECUTE_IMMEDIATE 프로시저는입력한 SQL 문을데이터베이스링크를통해원격서버에서수행한다. SELECT 를제외한 DML 문이나 DDL 문, DCL 문의수행이가능하다. 이프로시저로는파라미터마커가포함된 SQL 문을수행할수없다. 구문 REMOTE_EXECUTE_IMMEDIATE ( dblink_name IN VARCHAR, statement_text IN VARCHAR ); 파라미터 이름 입출력 데이터타입 설명 dblink_name IN VARCHAR 데이터베이스링크객체의이름 statement_text IN VARCHAR 원격서버에서수행할 SQL 구문 반환값 프로시저이므로반환값이없다. 예제 < 질의 1> link1 이가리키는원격서버에테이블 remote_t 를 생성하고, 레코드를삽입한후테이블을제거한다. exec REMOTE_EXECUTE_IMMEDIATE( 'link1', 'create table remote_t( c1 integer )' ); exec REMOTE_EXECUTE_IMMEDIATE( 'link1', 'insert into remote_t values (10)' ); exec REMOTE_EXECUTE_IMMEDIATE( 'link1', 'insert into remote_t values (20)' ); exec REMOTE_EXECUTE_IMMEDIATE( 'link1', 'insert into remote_t values (30)' ); exec REMOTE_EXECUTE_IMMEDIATE( 'link1', 'drop table remote_t' ); 60 Database Link User s Manual
바인딩지원 REMOTE 함수 이절은파라미터바인딩을지원하는 pass-through 방식의 REMOTE 함수를기술한다. REMOTE_ALLOC_STATEMENT 원격서버에서수행할 SQL 문을준비 (prepare) 한다. 이함수는저장프로시저또는저장함수내에서만사용할수있다. 구문 BIGINT REMOTE_ALLOC_STATEMENT ( dblink_name IN VARCHAR, statement_text IN VARCHAR ); 파라미터이름 입출력 데이터타입 설명 dblink_name IN VARCHAR 데이터베이스링크객체의이름 statement_text IN VARCHAR 원격서버에서수행할 SQL 구문 반환값 예제 함수수행에성공하면 statement ID 가반환되고, 그렇지않으면 음의정수가반환된다. < 질의 1> link1 이가리키는원격서버의 t1 테이블에 c1 칼럼의 값이 20 인레코드의 c2 칼럼값을구하는저장프로시저를생성하라. 단, c1 칼럼값의조건검색에파라미터바인딩을사용하라. CREATE OR REPLACE PROCEDURE proc1 AS statement_id BIGINT; row_cnt INTEGER; result INTEGER; col_value FLOAT(38); BEGIN statement_id := REMOTE_ALLOC_STATEMENT( 'link1', 'select c2 from t1 where c1 =?' ); result := REMOTE_BIND_VARIABLE( 'link1', statement_id, 1, '20' ); IF result > 0 THEN 데이터베이스링크사용법 61
result := REMOTE_EXECUTE_STATEMENT( 'link1', statement_id ); LOOP result := REMOTE_NEXT_ROW( 'link1', statement_id ); EXIT WHEN result < 0; col_value := REMOTE_GET_COLUMN_VALUE_FLOAT( 'link1', statement_id, 1, 38 ); END LOOP; result := REMOTE_FREE_STATEMENT( 'link1', statement_id ); END IF; END; / REMOTE_BIND_VARIABLE SQL 구문의파라미터마커에값을바인딩한다. 이함수는저장프로시저또는저장함수내에서만사용할수있다. 구문 파라미터 INTEGER REMOTE_BIND_VARIABLE ( dblink_name IN VARCHAR, statement_id IN BIGINT, parameter_number IN VARCHAR, value IN VARCHAR ); 이름입출력데이터타입설명 dblink_name IN VARCHAR 데이터베이스링크객체의이름 statement_id IN BIGINT Statement ID parameter_number IN INTEGER SQL 구문에서값을바인딩할 value IN VARCHAR 바인딩할값 반환값 파라미터의번호순서. 1 부터시작 예제 음수가반환되면실패를의미하고, 그렇지않으면성공을의미한다. REMOTE_ALLOC_STATEMENT 의예제를참고하라. 62 Database Link User s Manual
REMOTE_EXECUTE_STATEMENT 준비된 SQL 구문을원격서버에서수행한다. 이함수는저장프로시저또는저장함수내에서만사용할수있다. 구문 INTEGER REMOTE_EXECUTE_STATEMENT ( dblink_name IN VARCHAR, statement_id IN BIGINT ); 파라미터 이름 입출력 데이터타입 설명 dblink_name IN VARCHAR 데이터베이스링크객체의이름 statement_id IN BIGINT 수행할 Statement ID 반환값 음수가반환되면실패를의미한다. 음수가아닌값이반환되면 DML 문을수행한경우에는영향을받은행의개수를, DDL 문이나 SELECT 문의경우에는성공을의미한다. 예제 REMOTE_ALLOC_STATEMENT 의예제를참고하라. REMOTE_FREE_STATEMENT 수행이완료된구문을해제한다. 이함수는저장프로시저또는저장함수내에서만사용할수있다. 구문 INTEGER REMOTE_FREE_STATEMENT ( dblink_name IN VARCHAR, statement_id IN BIGINT ); 파라미터 이름 입출력 데이터타입 설명 dblink_name IN VARCHAR 데이터베이스링크객체의이름 데이터베이스링크사용법 63
statement_id IN BIGINT Statement ID 반환값 예제 음수가반환되면실패를, 음수가아닌값이반환되면성공을 의미한다. REMOTE_ALLOC_STATEMENT 의예제를참고하라. REMOTE_GET_COLUMN_VALUE_CHAR REMOTE_NEXT_ROW 함수로행의위치를정한다음, 행을구성하는칼럼들중 CHAR 타입의칼럼값을얻어오기위해사용된다. 이함수는저장프로시저또는저장함수내에서만사용할수있다. 구문 CHAR(char_size) REMOTE_GET_COLUMN_CHAR ( dblink_name IN VARCHAR, statement_id IN BIGINT, column_number IN INTEGER, char_size IN INTEGER ); 파라미터 이름 입출력 데이터타입 설명 dblink_name IN VARCHAR 데이터베이스링크객체의이름 statement_id IN BIGINT 수행할 Statement ID column_number IN INTEGER 행내에서칼럼의순서. 1부터시작. char_size IN INTEGER 반환받을 CHAR 타입의크기 반환값 지정한칼럼의값이반환된다. REMOTE_GET_COLUMN_VALUE_VARCHAR REMOTE_NEXT_ROW 함수로행의위치를정한다음, 행을 64 Database Link User s Manual
구성하는칼럼들중 VARCHAR 타입의칼럼값을얻어오기위해 사용된다. 이함수는저장프로시저또는저장함수내에서만사용할 수있다. 구문 VARCHAR(char_size) REMOTE_GET_COLUMN_VARCHAR ( dblink_name IN VARCHAR, statement_id IN BIGINT, column_number IN INTEGER, varchar_size IN INTEGER ); 파라미터 이름 입출력 데이터타입 설명 dblink_name IN VARCHAR 데이터베이스링크객체의이름 statement_id IN BIGINT 수행할 Statement ID column_number IN INTEGER 행내에서칼럼의순서. 1부터시작. varchar_size IN INTEGER 반환받을 VARCHAR 타입의크기 반환값 지정한칼럼의값이반환된다. REMOTE_GET_COLUMN_VALUE_FLOAT REMOTE_NEXT_ROW 함수로행의위치를정한다음, 행을구성하는칼럼들중 FLOAT 타입의칼럼값을얻어오기위해사용된다. 이함수는저장프로시저또는저장함수내에서만사용할수있다. 구문 FLOAT(precision) REMOTE_GET_COLUMN_FLOAT ( dblink_name IN VARCHAR, statement_id IN BIGINT, column_number IN INTEGER, precision IN INTEGER ); 파라미터 이름 입출력 데이터타입 설명 dblink_name IN VARCHAR 데이터베이스링크객체의이름 데이터베이스링크사용법 65
statement_id IN BIGINT 수행할 Statement ID column_number IN INTEGER 행내에서칼럼의순서. 1부터시작. precision IN INTEGER 반환받을 FLOAT 타입의 precision 반환값 예제 지정한칼럼의값이반환된다. REMOTE_ALLOC_STATEMENT 의예제를참고하라. REMOTE_GET_COLUMN_VALUE_SMALLINT REMOTE_NEXT_ROW 함수로행의위치를정한다음, 행을구성하는칼럼들중 SMALLILNT 타입의칼럼값을얻어오기위해사용된다. 이함수는저장프로시저또는저장함수내에서만사용할수있다. 구문 SMALLINT REMOTE_GET_COLUMN_SMALLINT ( dblink_name IN VARCHAR, statement_id IN BIGINT, column_number IN INTEGER ); 파라미터 이름 입출력 데이터타입 설명 dblink_name IN VARCHAR 데이터베이스링크객체의이름 statement_id IN BIGINT 수행할 Statement ID column_number IN INTEGER 행내에서칼럼의순서. 1부터시작. 반환값 지정한칼럼의값이반환된다. REMOTE_GET_COLUMN_VALUE_INTEGER REMOTE_NEXT_ROW 함수로행의위치를정한다음, 행을 66 Database Link User s Manual
구성하는칼럼들중 INTEGER 타입의칼럼값을얻어오기위해 사용된다. 이함수는저장프로시저또는저장함수내에서만사용할 수있다. 구문 INTEGER REMOTE_GET_COLUMN_INTEGER ( dblink_name IN VARCHAR, statement_id IN BIGINT, column_number IN INTEGER ); 파라미터 이름 입출력 데이터타입 설명 dblink_name IN VARCHAR 데이터베이스링크객체의이름 statement_id IN BIGINT 수행할 Statement ID column_number IN INTEGER 행내에서칼럼의순서. 1부터시작. 반환값 지정한칼럼의값이반환된다. REMOTE_GET_COLUMN_VALUE_BIGINT REMOTE_NEXT_ROW 함수로행의위치를정한다음, 행을구성하는칼럼들중 BIGINT 타입의칼럼값을얻어오기위해사용된다. 이함수는저장프로시저또는저장함수내에서만사용할수있다. 구문 BIGINT REMOTE_GET_COLUMN_BIGINT ( dblink_name IN VARCHAR, statement_id IN BIGINT, column_number IN INTEGER ); 파라미터 이름 입출력 데이터타입 설명 dblink_name IN VARCHAR 데이터베이스링크객체의이름 statement_id IN BIGINT 수행할 Statement ID column_number IN INTEGER 행내에서칼럼의순서. 1부터시작. 데이터베이스링크사용법 67
반환값 지정한칼럼의값이반환된다. REMOTE_GET_COLUMN_VALUE_REAL REMOTE_NEXT_ROW 함수로행의위치를정한다음, 행을구성하는칼럼들중 REAL 타입의칼럼값을얻어오기위해사용된다. 이함수는저장프로시저또는저장함수내에서만사용할수있다. 구문 REAL REMOTE_GET_COLUMN_REAL ( dblink_name IN VARCHAR, statement_id IN BIGINT, column_number IN INTEGER ); 파라미터 이름 입출력 데이터타입 설명 dblink_name IN VARCHAR 데이터베이스링크객체의이름 statement_id IN BIGINT 수행할 Statement ID column_number IN INTEGER 행내에서칼럼의순서. 1부터시작. 반환값 지정한칼럼의값이반환된다. REMOTE_GET_COLUMN_VALUE_DOUBLE REMOTE_NEXT_ROW 함수로행의위치를정한다음, 행을구성하는칼럼들중 DOUBLE 타입의칼럼값을얻어오기위해사용된다. 이함수는저장프로시저또는저장함수내에서만사용할수있다. 구문 DOUBLE REMOTE_GET_COLUMN_DOUBLE ( dblink_name IN VARCHAR, 68 Database Link User s Manual
statement_id IN BIGINT, column_number IN INTEGER ); 파라미터 이름 입출력 데이터타입 설명 dblink_name IN VARCHAR 데이터베이스링크객체의이름 statement_id IN BIGINT 수행할 Statement ID column_number IN INTEGER 행내에서칼럼의순서. 1부터시작. 반환값 지정한칼럼의값이반환된다. REMOTE_GET_COLUMN_VALUE_DATE REMOTE_NEXT_ROW 함수로행의위치를정한다음, 행을구성하는칼럼들중 DATE 타입의칼럼값을얻어오기위해사용된다. 이함수는저장프로시저또는저장함수내에서만사용할수있다. 구문 DATE REMOTE_GET_COLUMN_DATE ( dblink_name IN VARCHAR, statement_id IN BIGINT, column_number IN INTEGER ); 파라미터 이름 입출력 데이터타입 설명 dblink_name IN VARCHAR 데이터베이스링크객체의이름 statement_id IN BIGINT 수행할 Statement ID column_number IN INTEGER 행내에서칼럼의순서. 1부터시작. 반환값 지정한칼럼의값이반환된다. 데이터베이스링크사용법 69
REMOTE_NEXT_ROW REMOTE_EXECUTE_STATEMENT 함수로 SELECT 문을수행한경우, 결과집합에서행의위치를다음으로이동한다. 이함수는저장프로시저또는저장함수내에서만사용할수있다. 구문 INTEGER REMOTE_NEXT_ROW ( dblink_name IN VARCHAR, statement_id IN BIGINT ); 파라미터 이름 입출력 데이터타입 설명 dblink_name IN VARCHAR 데이터베이스링크객체의이름 statement_id IN BIGINT 수행할 Statement ID 반환값 예제 음수가반환되면실패를의미하고, 그렇지않으면성공을의미한다. REMOTE_ALLOC_STATEMENT 의예제를참고하라. REMOTE 함수 다음에추가 70 Database Link User s Manual
일괄처리 (Batch) 지원 REMOTE 함수 이절은알티베이스데이터베이스링크가일괄처리 (Batch) 할수있는 Remote 함수와관련함수를기술한다. 이함수는저장프로시저 내에서만사용할수있다. 일괄처리방법으로원격서버에쿼리를 수행할때는아래와같은순서대로사용할것을권장한다. 1. REMOTE_ALLOC_STATEMENT_BATCH 2. REMOTE_BIND_VARIABLE_BATCH 3. REMOTE_ADD_BATCH 4. REMOTE_EXECUTE_BATCH 5. REMOTE_GET_RESULT_COUNT_BATCH 6. REMOTE_GET_RESULT_BATCH 7. REMOTE_FREE_STATEMENT_BATCH IS_ARRAY_BOUND 배열타입의인자가바인드되었는지확인한다. 구문 파라미터 BOOLEAN variable: = IS_ARRAY_BOUND (); 없음 반환값 예제 배열타입의인자가바인드되면 TRUE 를반환하며, 그렇지않으면 FALSE 를반환한다. < 질의 > link1 이가리키는원격서버의 t1 테이블에값을삽입하는 저장프로시저를생성하라. 단, 데이터를삽입시파라미터바인딩을 사용하라. isql> CREATE OR REPLACE PROCEDURE PROC1( A1 IN INTEGER, A2 IN INTEGER ) 데이터베이스링크사용법 71
AS result INTEGER; i INTEGER; count INTEGER; sum INTEGER := 0; BEGIN PRINTLN('--- 0 ---'); IF IS_ARRAY_BOUND() = TRUE THEN PRINTLN('--- 1 ---'); /* First bound */ IF IS_FIRST_ARRAY_BOUND() = TRUE THEN pkg1.stmtid := REMOTE_ALLOC_STATEMENT_BATCH( 'link1', 'insert into t1 values(?,?)'); PRINTLN('ALLOC BATCH'); END IF; PRINTLN('--- 2 ---'); /* Main Task */ /* INSERT INTO T1 VALUES (A1, A2); */ result := REMOTE_BIND_VARIABLE_BATCH( 'link1', pkg1.stmtid, 1, A1 ); result := REMOTE_BIND_VARIABLE_BATCH( 'link1', pkg1.stmtid, 2, A2 ); result := REMOTE_ADD_BATCH( 'link1', pkg1.stmtid ); /* Last bound */ IF IS_LAST_ARRAY_BOUND() = TRUE THEN result := REMOTE_EXECUTE_BATCH( 'link1', pkg1.stmtid ); count := REMOTE_GET_RESULT_COUNT_BATCH( 'link1', pkg1.stmtid ); FOR i IN 1.. count LOOP result := REMOTE_GET_RESULT_BATCH( 'link1', pkg1.stmtid, i ); sum := sum + result; END LOOP; PRINTLN('SUM is' sum); result := REMOTE_FREE_STATEMENT_BATCH( 'link1', pkg1.stmtid ); PRINTLN('FREE BATCH'); END IF; PRINTLN('--- 3 ---'); ELSE PRINTLN('NORMAL?'); END IF; END; / IS_FIRST_ARRAY_BOUND 배열타입의변수가처음바인드되었는지확인한다. 구문 BOOLEAN variable: = IS_FIRST_ARRAY_BOUND (); 72 Database Link User s Manual
파라미터 없음 반환값 배열타입의변수가바인드되었고최초수행이면 TRUE 를반환하고, 그렇지않으면 FALSE 를반환한다. 예제 IS_ARRAY_BOUND 의예제를참고하라. IS_LAST_ARRAY_BOUND 배열타입의변수가마지막으로바인드되었는지확인한다. 구문 BOOLEAN variable: = IS_LAST_ARRAY_BOUND (); 파라미터 반환값 없음 예제 배열타입의변수가바인드되었고마지막수행이면 TRUE 를 반환하고, 그렇지않으면 FALSE 를반환한다. IS_ARRAY_BOUND 의예제를참고하라. REMOTE_ADD_BATCH 일괄처리방식으로수행할 SQL 문을추가한다. 구문 INTEGER REMOTE_ADD_BATCH ( dblink_name IN VARCHAR, statement_id IN BIGINT); 데이터베이스링크사용법 73
파라미터 이름 입출력 데이터타입 설명 dblink_name IN VARCHAR 데이터베이스링크객체의이름 statement_id IN BIGINT Statement ID 반환값 예제 음수를반환하면실패를의미하고, 그렇지않으면성공을의미한다. IS_ARRAY_BOUND 의예제를참고하라. REMOTE_ALLOC_STATEMENT_BATCH 일괄처리를위한함수이며, SQL 문을수행하기위해 원격구문 id(statement ID) 를가져오는함수이다. 구문 BIGINT REMOTE_ALLOC_STATEMENT_BATCH ( dblink_name IN VARCHAR, statement_text IN VARCHAR); 파라미터 이름 입출력 데이터타입 설명 dblink_name IN VARCHAR 데이터베이스링크객체의이름 statement_text IN VARCHAR 원격서버에서수행할 SQL 구문 반환값 예제 성공하면 statement ID 를반환하고, 그렇지않으면음수를반환하다. IS_ARRAY_BOUND 의예제를참고하라. REMOTE_BIND_VARIABLE_BATCH 일괄처리를위한함수이며, SQL 구문의파라미터마커에값을 74 Database Link User s Manual
바인딩한다. 구문 INTEGER REMOTE_BIND_VARIABLE_BATCH ( dblink_name IN VARCHAR, statement_id IN BIGINT, parameter_number IN VARCHAR, value IN VARCHAR); 파라미터 이름 입출력 데이터타입 설명 dblink_name IN VARCHAR 데이터베이스링크객체의이름 statement_id IN BIGINT Statement ID parameter_number IN VARCHAR SQL 구문에서값을바인딩할파라미터의번호순서. 1부터시작 Value IN VARCHAR 바인딩할값 반환값 예제 음수를반환하면실패를의미하고, 그렇지않으면성공을의미한다. IS_ARRAY_BOUND 의예제를참고하라. REMOTE_EXECUTE_BATCH REMOTE_ALLOC_STATEMENT_BATCH 함수로얻은 원격구문 id(statement ID) 를이함수의인자값으로사용하여 SQL 문을원격서버에일괄처리방식으로실제수행한다. 파라미터 INTEGER REMOTE_STATEMENT_BATCH ( dblink_name IN VARCHAR, statement_id IN BIGINT ); 파라미터 이름 입출력 데이터타입 설명 dblink_name IN VARCHAR 데이터베이스링크객체의이름 statement_id IN BIGINT Statement ID 데이터베이스링크사용법 75
반환값 음수를반환하면실패를의미하고, 그렇지않으면성공을의미한다. 예제 IS_ARRAY_BOUND 의예제를참고하라. REMOTE_FREE_STATEMENT_BATCH 일괄처리방식으로수행한구문을해제한다. 구문 INTEGER REMOTE_FREE_STATEMENT_BATCH ( dblink_name IN VARCHAR, statement_id IN BIGINT ); 파라미터 이름 입출력 데이터타입 설명 dblink_name IN VARCHAR 데이터베이스링크객체의이름 statement_id IN BIGINT Statement ID 반환값 예제 음수를반환하면실패를의미하고, 그렇지않으면성공을의미한다. IS_ARRAY_BOUND 의예제를참고하라. REMOTE_GET_RESULT_COUNT_BATCH REMOTE_EXECUTE_BATCH 함수를수행한후에일괄처리로수행된 SQL 구문의개수를확인한다. 구문 INTEGER REMOTE_GET_RESULT_COUNT_BATCH ( dblink_name IN VARCHAR, statement_id IN BIGINT); 76 Database Link User s Manual
파라미터 이름 입출력 데이터타입 설명 dblink_name IN VARCHAR 데이터베이스링크객체의이름 statement_id IN BIGINT Statement ID 반환값 예제 음수를반환하면실패를의미하고, 그렇지않으면성공을의미한다. IS_ARRAY_BOUND 의예제를참고하라. REMOTE_GET_RESULT_BATCH REMOTE_EXECUTE_BATCH 함수를수행한후에일괄처리로수행된 SQL 구문의갱신결과를확인한다 구문 INTEGER REMOTE_GET_RESULT_BATCH ( dblink_name IN VARCHAR, statement_id IN BIGINT, index IN INTEGER); 파라미터 이름 입출력 데이터타입 설명 dblink_name IN VARCHAR 데이터베이스링크객체의이름 statement_id IN BIGINT Statement ID index IN INTEGER 일괄처리로수행된 SQL 구문의순서번호 ( 인덱스 ) 반환값 예제 음수를반환하면실패를의미하고, 그렇지않으면입력파라미터인 인덱스가가리키는 SQL 구문의수행결과 (row count) 를반환한다. IS_ARRAY_BOUND 의예제를참고하라. 데이터베이스링크사용법 77
78 Database Link User s Manual
COMMIT FORCE DATABASE LINK 글로벌트랜잭션에서네트워크장애가발생하면, 원격서버의트랜잭션커밋이실패할수있다. 이때 COMMIT FORCE DATABASE LINK 구문을수행하면, 글로벌트랜잭션을커밋실패로처리하지않고커밋가능한서버에만트랜잭션을강제로커밋한다. DBLINK_GLOBAL_TRANSACTION_LEVEL 프로퍼티가 2(Two-Phase Commit) 로설정되어있을때이구문을수행하면 COMMIT 을 수행한것과동일하다. 구문 COMMIT FORCE DATABASE LINK; 예제 isql> COMMIT FORCE DATABASE LINK; 데이터베이스링크사용법 79
ROLLBACK FORCE DATABASE LINK 글로벌트랜잭션에서네트워크장애가발생하면, 원격서버의트랜잭션롤백이실패할수있다. 이때 ROLLBACK FORCE DATABASE LINK 구문을사용하면, 글로벌트랜잭션자체를롤백실패로처리하는대신, 롤백이가능한서버만이라도트랜잭션을강제로롤백한다. DBLINK_GLOBAL_TRANSACTION_LEVEL 프로퍼티가 2(Two-Phase Commit) 로설정되어있을때이구문을수행하면 ROLLBACK 을 수행한것과동일하다. 구문 ROLLBACK FORCE DATABASE LINK; 예제 isql> ROLLBACk FORCE DATABASE LINK; 80 Database Link User s Manual
A. 부록 : 프로퍼티및데이터 딕셔너리 이부록은데이터베이스링크와관련하여사용되는각종프로퍼티및 데이터딕셔너리를기술한다. 부록 A: 프로퍼티및데이터딕셔너리 81
DB Link 관련데이터딕셔너리 데이터베이스링크의현재상태를보여주는메타테이블과성능뷰는 다음과같다. 자세한설명은 General Reference 를참고한다. 메타테이블 SYS_DATABASE_LINKS_ 성능뷰 (Performance View) V$DBLINK_ALTILINKER_STATUS V$DBLINK_DATABASE_LINK_INFO V$DBLINK_GLOBAL_TRANSACTION_INFO V$DBLINK_LINKER_CONTROL_SESSION_INFO V$DBLINK_LINKER_DATA_SESSION_INFO V$DBLINK_LINKER_SESSION_INFO V$DBLINK_NOTIFIER_TRANSACTION_INFO V$DBLINK_REMOTE_STATEMENT_INFO V$DBLINK_REMOTE_TRANSACTION_INFO 82 Database Link User s Manual
프로퍼티파일 Altibase 데이터베이스링크를사용하기위해서는 Altibase 서버의프로퍼티파일인 altibase.properties 와 AltiLinker 의프로퍼티파일인 dblink.conf 를사용목적에맞게수정해야한다. altibase.properties 데이터베이스링크와관련된프로퍼티는다음과같으며, 프로퍼티에대한자세한설명은 General Reference 를참고한다. AUTO_REMOTE_EXEC DBLINK_ENABLE DBLINK_GLOBAL_TRANSACTION_LEVEL DBLINK_RECOVERY_MAX_LOGFILE DBLINK_REMOTE_STATEMENT_AUTOCOMMIT DBLINK_REMOTE_TABLE_BUFFER_SIZE DBLINK_DATA_BUFFER_BLOCK_SIZE DBLINK_DATA_BUFFER_BLOCK_COUNT DBLINK_DATA_BUFFER_ALLOC_RATIO DBLINK_ALTILINKER_CONNECT_TIMEOUT dblink.conf dblink.conf 파일은 AltiLinker 를위한프로퍼티파일이다. 이파일에설정가능한프로퍼티는아래와같다. ALTILINKER_ENABLE ALTILINKER_PORT_NO ALTILINKER_RECEIVE_TIMEOUT ALTILINKER_REMOTE_NODE_RECEIVE_TIMEOUT ALTILINKER_QUERY_TIMEOUT ALTILINKER_NON_QUERY_TIMEOUT ALTILINKER_THREAD_COUNT ALTILINKER_THREAD_SLEEP_TIME ALTILINKER_REMOTE_NODE_SESSION_COUNT ALTILINKER_TRACE_LOG_DIR ALTILINKER_TRACE_LOG_FILE_SIZE ALTILINKER_TRACE_LOGGING_LEVEL 부록 A: 프로퍼티및데이터딕셔너리 83
ALTILINKER_JVM_BIT_DATA_MODEL_VALUE ALTILINKER_JVM_MEMORY_POOL_INIT_SIZE ALTILINKER_JVM_MEMORY_POOL_MAX_SIZE TARGETS/NAME TARGETS/JDBC_DRIVER TARGETS/CONNECTION_URL TARGETS/USER TARGETS/PASSWORD TARGETS/XADATASOURCE_CLASS_NAME TARGETS/XADATASOURCE_URL_SETTER_NAME 다음은 dblink.conf 파일의예제이다. ALTILINKER_ENABLE = 1 ALTILINKER_PORT_NO = 23238 ALTILINKER_RECEIVE_TIMEOUT = 100 ALTILINKER_REMOTE_NODE_RECEIVE_TIMEOUT = 100 ALTILINKER_QUERY_TIMEOUT = 10 ALTILINKER_NON_QUERY_TIMEOUT = 20 ALTILINKER_THREAD_COUNT = 10 ALTILINKER_THREAD_SLEEP_TIME = 200 ALTILINKER_REMOTE_NODE_SESSION_COUNT = 100 ALTILINKER_TRACE_LOG_DIR = "?/trc" ALTILINKER_TRACE_LOG_FILE_SIZE = 30 ALTILINKER_TRACE_LOG_FILE_COUNT = 9 ALTILINKER_TRACE_LOGGING_LEVEL = 3 ALTILINKER_JVM_MEMORY_POOL_INIT_SIZE = 128 ALTILINKER_JVM_MEMORY_POOL_MAX_SIZE = 512 ALTILINKER_JVM_BIT_DATA_MODEL_VALUE = 1 TARGETS = ( ( NAME = "ora1" JDBC_DRIVER = "/home1/applys/work/natc/tc/server/dk/remoteserver/jdbc Drivers/ojdbc1 CONNECTION_URL = "jdbc:oracle:thin:@dbdm.altibase.in:1521:orcl" USER = "new_dblink" PASSWORD = "new_dblink" ), ( NAME = "alti2" JDBC_DRIVER = "/home/user/altibase_home/lib/altibase.jar" CONNECTION_URL = "jdbc:altibase://127.0.0.1:20600/mydb" XADATASOURCE_CLASS_NAME= "oracle.jdbc.xa.oraclexadatasource XADATASOURCE_URL_SETTER_NAME = "seturl" ) ) 각프로퍼티에대한상세한설명은다음절에서기술한다. 84 Database Link User s Manual