Real Alternative DBMS ALTIBASE, Since 1999 ALTIBASE 환경의개발시고려사항가이드 2014. 10 Copyright c 2000~2014 ALTIBASE Corporation. All Rights Reserved.
Document Control Change Record Date Author Change Reference 2010-07 Lim272 Created 2014-10 Lee Jeong Hyeok Modified Reviews Date Name (Position) Distribution Name Location ALTIBASE 환경의개발시고려사항가이드 2 page of 29
목차 개요... 4 설계단계의고려사항... 5 이중화환경의고려사항... 5 HA(High Availability) 및백업에대한고려... 6 테이블설계의고려사항... 7 파티션테이블의제한... 8 하드웨어준비의고려사항... 8 Not Support Feature... 8 개발단계의고려사항... 9 DBMS 접속방식의선택... 9 Thread 프로그램, Connection Pool 의관리... 10 Application 의연결해제시확인사항... 10 Session Timeout... 11 SELECT Cursor 사용시주의... 12 SQL Error 의체크... 13 LOB 타입의주의... 13 Prepared Statement 의사용... 14 SQL Tuning... 15 대량변경작업의주의... 16 ALTIBASE TRACE 로그... 17 Trace 로그의분류... 17 altibase_boot.log... 17 altibase_sm.log... 19 altibase_qp.log... 20 altibase_rp.log... 20 altibase_dk.log... 22 altibase_error.log... 22 CLIENT APPLICATION 에러메시지... 23 Connection does not exist... 23 Communication link failure... 23 Calculate stack overflow... 23 Conversion not applicable... 24 Invalid cursor state... 24 Not defined cursor... 24 Invalid request to process the SQL statement... 25 Invalid literal... 25 Invalid length of data type... 25 Indicator variable required but not supplied error... 25 Incompatible NLS between the client and the server... 26 Invalid size of data to bind to host variable [Data Size ]... 26 Invalid character in use... 26 Too many pages are allocated... 27 The Tablespace does not have enough free space... 27 The transaction exceeds lock timeout specified by user... 27 The update log size is bigger than TRX_UPDATE_MAX_LOGSIZE... 27 String data right truncated... 28 Value overflow... 28 Several statement still opened... 28 ALTIBASE 환경의개발시고려사항가이드 3 page of 29
개요 본문서는 ALTIBASE DBMS 을이용한개발환경에서개발자가고려해야할사항들을설명한다. 특정개발환경별참고문서는각개발환경별로작성된기술문서를참고하도록한다. 본문서에는일반적인사항을기술하며문서후반에는 ALTIBASE 에러메시지들에대하여설명하고있다. 문서에서설명하는 ALTIBASE 버전은 6.3.1 이상을기준으로한다. 다음의문서들을환경에맞게같이참고하도록한다. 1. 디스크 IO병목을고려한볼륨구성가이드 2. ALTIBASE 백업정책결정을위한고려사항 3. 효율적인이중화구성가이드 4. ALTIBASE 이중화제약사항가이드 5. ALTIBASE 용량산정가이드 6. ALTIBASE Precompiler 개발가이드 7. ALTIBASE SQL Tuning Guide 8. ALTIBASE 자바개발가이드 9. ALTIBASE & VC++2008 Express Edition 개발가이드 10. ORACLE To ALTIBASE 변환가이드 11. ALTIBASE & WAS 연동가이드 ALTIBASE 환경의개발시고려사항가이드 4 page of 29
설계단계의고려사항 ALTIBASE 를이용하여 DB 또는시스템설계를수행하는경우고려할사항들을설명한다. 설계단계에서고려하지못한사항들은이후개발뿐아니라운영단계에까지미치는영향이크기때문에반드시아래사항들을고려하여설계에참고할것을권장한다. 이중화환경의고려사항 1 ALTIBASE 는네트웍기반의이중화방식 ALTIBASE 는네트웍을기반으로변경트랜잭션로그를송 / 수신하여데이터를동기화하는형태의이중화방식을채택하고있다. 즉, 일반적으로사용자가흔히이해하는디스크를공유하는방식이아니다. 따라서, 네트웍환경에서발생할수밖에없는데이터전송지연등으로인한동기화부분을고려하여설계를해야한다. ALTIBASE 의이중화방식은 Lazy 방식과 Eager 방식이있다. Lazy 방식은데이터의전송지연을허용하는형태이며 Eager 방식은데이터의지연을허용하지않는형태이다. 이와같은 Lazy/Eager 의설정은세션단위로도설정이가능하다. 따라서, 데이터의전송지연이허용되는수준의업무라면 Lazy 방식을채택하고그렇지않은데이터의동기화가반드시필요한업무라면 Eager 방식을업무별로적절하게설정하여운용하도록한다. 비교 Lazy 방식 Eager 방식 성능단독서버의 90% 성능수준 Lazy 방식대비현저한성능저하 동기화 상대편서버에변경트랜잭션로그의전송성공만을확인하는구조이기때문에성능은우수한반면동기화는지연될수있음 상대편서버에데이터불일치를원천방지하기위해상대편서버에 Commit 된후로컬에도 Commit 되기때문에성능은급격히지연되지만데이터의동기화부분은지연되지않음. 2 데이터불일치의방지방안고려 동일한 Primary key 를갖는레코드를양쪽서버에서동시에서로다른값으로변경하는경우이중화방식에서는서로다른레코드로변경되는상황이발생하게된다. 이경우사용자가원치않는데이터의불일치가발생하기때문에업무요건을충분히파악하여변경업무를이중화로구성된그룹내에서한쪽서버에서만발생하도록프로그램을배치하거나동일한 PK 를갖는레코드가이중화로구성된그룹내에서변경이동시에발생하지않도록배치를해야만한다. 예를들면, L4 switch 를사용한다면업무별로프로그램을각기다른서버에배치하여 192.168.1.X 망에서접속한프로그램은 1 번 DBMS 서버로접속을하고 192.168.2.X 망에서접속한프로그램은 2 번 DBMS 서버로접속을수행하는형태의구성이가능할것이다. 또는, 사용자가명시적으로서비스프로그램의 DBMS 접속부분에 IP 를지정하는것도방법이된다. ALTIBASE 환경의개발시고려사항가이드 5 page of 29
3 로그기반의이중화방식 ALTIBASE 의이중화는로컬서버에서발생한트랜잭션의변경로그를전송하는형태이다. 한개의 SQL 문으로백만건을변경하였다하더라도동일하게원격서버로한개의 SQL 문의전송되는형태가아닌백만건의변경트랜잭션로그가모두전송되는구조임을의미한다. 이외도이중화환경의주요고려사항들은 ALTIBASE 의기술문서인 효율적인이중화구성가이드, 이중화제약사항가이드 문서를반드시참고하도록한다. HA(High Availability) 및백업에대한고려 일반적인상황에서는장애가발생하고복구가되면이중화는자동으로자신이가지고있는장애시점에미처보내지못한트랜잭션로그를상대편에보내어데이터동기화를수행하게된다. 하지만, 네트웍의특성상장애시점에변경트랜잭션로그의전송불가에의한데이터불일치로인해서비스를바로 Fail-Over 할수없는업무가있는지를고려해야한다. 반드시데이터가동기화된이후에만서비스가가능한업무라면 ALTIBASE 는데이터미지연분에대한반영을위해 Off-Line replicator 를제공하고있다. 다만, 이것은장애서버의디스크에접속이가능한상태에서만사용이가능하다는제약조건이있다. ( 이기능을쓰고자한다면공유디스크장비를구축하는것을권장한다.) 이러한 Off-Line replicator 를사용할수있는환경이아니라면프로그램에서장애시점의 Raw-Data 를누적하여필요한부분만큼정상서버에반영한후서비스를이관하는형태의 HA 정책을수립해야한다. 예를들면, 증권사의경우대외계를통해나가는모든데이터는고유번호로관리된다. 이번호는대외계시스템과 DB 에동일하게존재하기때문에장애발생시대외계와 DB 시스템간에차이가발생한부분만큼을정상서버에반영하는업무로직을사용하는경우도있다. HA 외에도물리적인디스크장애로인한데이터파일의손상및트랜잭션로그파일의손상으로인한장애에대비하여백업정책을수립해야한다. ALTIBASE 의백업방식은아카이브모드를이용한전체백업방식과증분백업방식을모두제공하고있다. 따라서, 사용자는백업시점에 (1) 오프라인상태에서모든필요파일을콜드백업하는방식, (2) 온라인상태에서데이터베이스또는테이블스페이스단위의전체백업방식, (3) 온라인상태에서데이터베이스또는테이블스페이스단위의증분백업방식중하나를선택해야한다. 백업방식은다음과같은형태중하나를택해야한다. 방식 iloader 백업콜드백업아카이브전체백업아카이브증분백업 설명 주요테이블별로레코드의스냅샷만을저장하는형태로 iloader 로백업을받는시점의데이터만백업된다. ALTIBASE 프로세스를내린후모든필요파일을복사하여보관하는형태로파일을복사한시점까지만복구가가능하다. 백업시점에트랜잭션로그파일을포함하여전체데이터베이스이미지를백업하기때문에파일의손상이없는시점까지복구가가능하다. 처음에한번전체백업을수행하고다음부터는변경된이미지만백업하는형태이며, 트랜잭션로그파일까지백업하기 ALTIBASE 환경의개발시고려사항가이드 6 page of 29
때문에파일의손상이없는시점까지복구가가능하다. 증분백업본이많을수록복구시간이오래걸리기때문에이에대한검토가필요하다. 백업과관련하여 ALTIBASE 백업정책결정을위한고려사항 문서를참고하도록한다. 테이블설계의고려사항 1 테이블의저장위치를목적에맞게선정 ALTIBASE 는메모리 / 디스크테이블스페이스를모두지원한다. 사용자는빠른처리성능이요구되는업무에대해서는어떤테이블들을메모리테이블스페이스위치시킬것인지를선정해야한다. 즉, 메모리 / 디스크테이블스페이스에각각위치할업무목적별테이블의목록을작성할필요가있다. 다만, 하나의테이블명으로메모리 / 디스크에동시에위치할수없기때문에예를들어, 당일처리를메모리테이블에저장하고이전처리를디스크에저장하고한다면테이블을 2 개로분리하여 EXEC_TABLE_MEM / EXEC_TABLE_DISK 와같은형태로테이블을생성해야한다. 조회시에는가급적각각의테이블을조회하도록설계하고, 만약 2 개의테이블을동시에조회해야한다면 UNION ALL 을이용하여조회하거나별도의 View 를생성하여조회하는방법을택하면된다. 단, 메모리테이블과디스크테이블로분리된 2 개의테이블을동시에조회하게될때의처리속도는디스크테이블의처리성능을따라간다. 2 컬럼타입에대한고려 ALTIBASE 가제공하는숫자타입의경우 Numeric (9) 와같은타입은 Integer 타입으로도충분히표현이가능한데차지하는공간은 8byte 를차지한다. Integer 타입에비해레코드당 4 byte 를더점유하게된다. 처리성능측면에서도내부적으로 Numeric 의경우다시 Native 타입으로변환을해야하는비용이발생하기때문에 Integer 타입에비해서는다소느릴수밖에없다. 다음의사항들을컬럼타입의선정에있어고려할것을권장한다. 고려사항 설명 1. Native Non-Native 의변환비용최소화되도록고려 숫자형 (Native 타입 [Integer, Double, BigInt] 이성능면에서는더유리함 ) 2. 실수형의정밀도를요하지않는경우 Double 타입의선택 3. Sum, Avg 가사용되는컬럼이라면 Double, BigInt 타입의선택 날짜형 Join 날짜관련연산이중요한경우라면 Date 타입을선택하고검색및비교연산에국한된경우라면 Char/Varchar 타입을선택 (Date 타입은 8byte 로고정되어있음 ) Join 이발생하는컬럼이라면형변환이발생하지않도록고려 3 이중화대상인경우반드시 Primary key 를가져야한다. ALTIBASE 환경의개발시고려사항가이드 7 page of 29
4 Foreign Key 는트랜잭션의성능을저하시킴으로무분별하게사용하지않는다. 파티션테이블의제한 ALTIBASE 파티션테이블의경우현재까지 ( 버전 6.3.1 기준 ) Partitioned Local Index, Non-Partitioned Global Index 를지원하고있으며 Partitioned Global Index 를지원하고있지않다. 따라서, 파티션테이블전체를조회하는조건절에파티션키가배제된형태의조회시에는현저한성능저하가발생하기때문에파티션테이블은업무목적상히스토리성데이터를월별, 목적별보관형태의목적으로사용할것을권장한다. 하드웨어준비의고려사항 위에서언급한사항들과관련된물리적인고려사항을정리하여설명한다. 고려사항 이중화 디스크 설명 네트웍을이용하기때문에이중화의연결은별도의 Giga-bit 랜카드를이용하여서버간에직접연결하거나 Private 망을이용한환경을권장한다. 백업을고려할경우예측된 DB 용량에추가적으로테이블스페이스전체와함께일부아카이브로그파일이저장될수있는디스크공간이필요하다. 추가적으로 ALTIBASE 의리두로그파일에대한정책은무한생성이라고볼수있다. 몇개의리두로그파일을생성하고재사용하는구조가아니라계속새로운리두로그파일을생성해가는정책을쓰기때문에대량변경작업등으로인한리두로그파일의대량생성이불가피할경우들이있기때문에리두로그파일이저장될디스크의공간은충분히책정하는것이바람직하다. 하드웨어적인용량산정과관련된사항은 ALTIBASE 용량산정가이드 문서를참고하도록한다. Not Support Feature ALTIBASE는 SQL92 표준을준수하지만타 DBMS와비교하여약간상이한부분들이존재한다. 이와관련된자세한사항은각타 DBMS벤더별로제공되고있는기술문서를참고하도록한다. (Ex) ORACLE To ALTIBASE 변환가이드 ALTIBASE 환경의개발시고려사항가이드 8 page of 29
개발단계의고려사항 개발단계에서필요한고려사항들을정리하여설명한다. DBMS 접속방식의선택 1 ALTIBASE 접속방식의선택 접속방식 CONNTYPE=1 CONNTYPE=2 CONNTYPE=3 설명 TCP/IP 방식의접속, 일반적인접속방식 UNIX Domain Socket 방식의접속, 로컬서버내에서만사용가능 IPC 방식의접속, 로컬서버내에서만사용가능 CONNTYPE=n 의의미는접속방식을의미하며프로그램내에서접속문자열을지정할경우사용자가명시적으로지정할수있다. DBMS 와응용프로그램이별도의분리된서버에위치하면 CONNTYPE=1 의방법만사용이가능하다. 하지만, DBMS 와응용프로그램을같은서버에서구동할수있는경우라면통신비용의감소를위해서 CONNTYPE=2, 3 을선택하는것을권장한다. 2 ALTIBASE 는 Auto-Commit 모드가기본설정 JDBC 는표준스펙상 Auto-Commit 모드로접속하게된다. 그외응용프로그램은사용자가별도로변경하지않는이상기본적으로 $ALTIBASE_HOME/conf/altibase.properties 파일내에정의된 AUTO_COMMIT 속성에의해결정된다. 이속성값이 1 이면 Auto-Commit 모드로동작한다. (Auto-Commit 이라함은변경트랜잭션정상적으로완료된후자동으로 Commit 이수행됨을의미 ) 따라서, 사용자가이속성값을 Non Auto-Commit 으로변경하고자한다면설정파일에서해당속성값을 0 으로변경한후 ALTIBASE 를재구동해야한다. 만일, 세션별로제어를할경우에는 DBMS 에접속한이후다음과같은 SQL 을수행하면된다. ALTER SESSION SET AUTOCOMMIT = FALSE; (Java 의경우는 setautocommit 함수를이용하여제어하도록한다.) (ALTER SYSTEM 명령을위해시스템전체에반영하도록실시간으로변경할수있으나재구동후에다시원복될것임으로전체에영향을미치는속성의변경은프로퍼티파일을통해수정하고재구동하는방법을권장한다.) ALTIBASE 환경의개발시고려사항가이드 9 page of 29
Thread 프로그램, Connection Pool 의관리 Thread 환경의프로그램에서는하나의연결을다수의 Thread 가공유할경우반드시연결에대한동시성제어를개발자가수행해야한다. ALTIBASE 는세션과서버간의통신과정에서약속된프로토콜을주고받는다. 일반적으로 PREPARE BIND EXECUTE FETCH 등의과정을거치게되는데이과정이순차적으로진행되어야할상황에서다른프로토콜이인터럽트가발생하여세션처리과정이잘못처리되는과정에서오류가발생하게되는것이다. Communication link failure (EXEC->INVL) Communication link failure (PREP->EXEC) Invalid request to process the SQL statement 위의오류들은 Thread 프로그램또는 Connection Pool 을사용하는과정에서하나의연결이어떠한 SQL 을수행중에동시성제어가안된상태에서또다른 SQL 을진행시킬경우발생한다. 따라서, 위와같은오류가발생하면먼저개발자가작성한프로그램에서연결부분에대한동시성제어나처리과정중에잘못된인터럽트가발생하지않는지확인이필요하다. ( 간혹, 사용자프로그램에서 Timer 를설정한경우위와같은동시성제어문제가아니어도발생할수있다. 예를들면, SELECT~FETCH 과정중에 Timer 가동작되어아직 FETCH 프로토콜이완료되지않은상태에서다른 SQL 문이수행될경우위와같은오류가발생할수있다.) Application 의연결해제시확인사항 프로그램에서수행한 SQL 문들은개별프로그램과서버에 prepared 된상태로존재한다. 이러한 SQL 문들은사용이완료되면자원을해제하도록코드를개발하는것이바람직하다. 특히, 자바의경우메모리증가현상이발생할수있으므로다음과같은코드가반드시중요하다. Connection con = pool.getconnection(); Statement stmt = con.createstatement(); ResultSet rs = stmt.executequery(); try {. } exception () {.. } finally { // 개발자가프로그램내에서사용한모든자원을명시적으로해제하도록한다. rs.close(); ALTIBASE 환경의개발시고려사항가이드 10 page of 29
} stmt.close(); conn.close(); CLI/ODBC 등의개발의경우도마찬가지로 SQLAllocStmt 로메모리가할당된이후사용이끝난시점에는반드시 SQLFreeStmt 함수를통해 SQL_DROP 을수행해야한다. 재사용이된다면 SQL_CLOSE 옵션을이용하도록하며그렇지않고완전히해제할경우라면 SQL_DROP 옵션을통해명시적으로해제하도록한다. Session Timeout 세션은 DB 에접속한프로그램의연결을의미한다. 각세션은 ALTIBASE 고유의 Timeout 정책에의해관리된다. ALTIBASE 는크게 5 가지 Timeout 정책을제공하고있으며다음과같다. ( 아래색상이표기된것은연결문자열에서만제어가가능하다.) 구분 CONNECTION_TIMEOUT TIMEOUT QUERY_TIMEOUT FETCH_TIMEOUT IDLE_TIMEOUT UTRANS_TIMEOUT 에러후세션상태 단절 단절 유지 단절 단절 단절 설명 DB 에접속된상태에서네트웍상의송 / 수신간에블로킹된상태의타임아웃을설정하는옵션 DB 에접속을시도하는시간이이설정값을초과하면발생 DB 에접속된상태에서질의를수행하는전체시간이이설정값을초과하면발생 DB 에접속된상태에서 SELECT 문을수행한이후 FETCH 프로토콜이발생하는시간간격이이설정값을초과하면발생 DB 에접속된상태에서어떠한질의도수행하지않고대기하는시간이이설정값을초과하면발생 DB 에접속된상태에서질의를수행한이후 Commit/Rollback 이수행될때까지이설정값을초과하면발생 ( 수행질의는롤백처리됨 ) 만일, 사용자가연결시도에대한 5 초시간제한과네트웍상의블로킹현상이발생할경우이를 30 초안에응답이없으면연결을해제하겠다고설정한다면다음과같이연결문자열에옵션을추가하면된다. DSN=127.0.0.1;CONNTYPE=2;TIMEOUT=5;CONNECTION_TIMEOUT=30 그외의 TIMEOUT 설정은기본적으로 $ALTIBASE_HOME/conf/altibase.properties 에서설정한단위로동작하게되며세션별로는다음과같은질의를수행하여제어가가능하다. ( 0 으로설정할경우무한대로동작하게됨 ) ALTIBASE 환경의개발시고려사항가이드 11 page of 29
ALTER SESSION SET QUERY_TIMEOUT = 30 ( 초단위 ) ALTER SESSION SET FETCH_TIMEOUT = 30 위의 TIMEOUT 에의한오류가발생하면다음과같은에러를응용프로그램에서확인할수있다. 구분 에러메시지 CONNECTION_TIMEOUT TIMEOUT QUERY_TIMEOUT FETCH_TIMEOUT IDLE_TIMEOUT UTRANS_TIMEOUT Connection time out Client unable to establish connection Client's query exceeded in the execution time limitation The session has been closed by the server The session has been closed by the server The session has been closed by the server TIMEOUT 관련에러는 $ALTIBASE_HOME/trc/altibase_boot.log 에도기록이남게된다. [2010/07/06 13:10:35] [Thread-182894171744] [Level-1] [Notify : UTrans Timeout] Session Closed by Server : Session ID = 53 CLIENT_INFO => TCP 127.0.0.1:3992(PID : 13645) Time Limit => 3 Running Time => 5 Last Query => insert into t1 select * from t1 limit 1 Caused by Transaction => 82368 위의로그가 altibase_boot.log 에기록이되면개발자는반드시왜 Timeout 으로인한오류가발생했는지확인하여조치해야한다. 각각의원인은앞에서설명한바와같기때문에질의처리의병목으로발생했다면해당질의를튜닝해야할것이며위의예제처럼 UTrans_Timeout 이발생한다면변경트랜잭션이발생한후 commit/rollback 을수행하지않은것임으로접속정보를통해해당프로그램의트랜잭션제어부분을반드시수정 / 조치해야한다. 사용자가위의조치로해결하기어렵고업무적으로처리를강제로해야한다면 DB 전체의속성값을변경하기보다는해당프로그램의 DB 세션에대해해당 TIMEOUT 설정값을변경하여처리하도록한다. SELECT Cursor 사용시주의 CURSOR 를이용한 SELECT 문을구현할때에는반드시 FETCH 구문에대해에러체크를수행하고에러가발생하거나혹은데이터를모두읽은후에는반드시 CURSOR 를 CLOSE 하도록해야한다. 만일, 이미다읽은 CURSOR 를 FETCH 하려고하거나아직닫히지않는 CURSOR 에어떤작업을시도할경우의도하지않은오류가발생할수있으므로 CURSOR 를사용한뒤에는반드시정상적으로 CLOSE 하도록해야한다. ALTIBASE 환경의개발시고려사항가이드 12 page of 29
또하나의주의사항은 ALTIBASE 의경우 FETCH 도중에 COMMIT/ROLLBACK 이발생하게되면자동적으로열린 CURSOR 를닫게된다. 따라서, FETCH 를수행하면서다른트랜잭션을발생하고자할경우에는별도의 DB 세션을생성한후해당세션을통해별도의트랜잭션을처리하도록하거나 FETCH 가모두완료된이후 COMMIT/ROLLBACK 을수행하도록해야한다. 하지만, 처리해야하는레코드건수가많다면대량변경으로수행하기보다는별도의세션을맺어매건처리하는구조로구현하는것을권장한다. 변경될레코드의개수가하나의트랜잭션으로반드시묶여야한다면조건을주어나누어서처리가되도록프로그램을개발하는것이바람직하다. ( 아래의대량변경작업의주의사항을확인하도록한다.) SQL Error 의체크 ALTIBASE 환경의개발자는모든질의처리이후반드시 SQL Error 를체크할것을권장한다. 특히, 다음의경우를반드시체크하도록해야명확한오류를알아낼수있다. EXEC SQL PREPARE. EXEC SQL EXECUTE. If (SQLCODE!= SQL_SUCCESS) Error_log (); 또는, EXEC SQL DECLARE CURSOR EXEC SQL OPEN. If (SQLCODE!= SQL_SUCCESS) Error_log (); 위코드에서는 PREPARE 또는 DECLARE CURSOR 수행후에러체크하는부분이없다. 이경우 PREPARE (DECLARE CURSOR) 단계가오류였을경우라면 EXECUTE (OPEN) 단계에서 SQL 오류는 Not defined (XX) 와같은오류가발생하여실제로 PREPARE (DECLARE CURSOR) 오류로인함임에도불구하고해당오류를정확하게확인할수없다. ALTIBASE 는 PREPARE (DECLARE CURSOR) 수행과정도서버로질의를전송하여 Execute 전단계까지질의처리과정을해놓기때문에 PREPARE (DECLARE CURSOR) 를수행한이후에도반드시에러를체크하는로직을넣어야한다. 중요한점은모든 SQL 처리문이들어간경우는반드시 SQL 에러체크를수행하도록해야한다는점을알아두어야한다. LOB 타입의주의 ALTIBASE 에서 LOB 타입을조회할때에는반드시 Non-Auto-Commit 모드로동작해야한다. Auto-Commit 모드에서는다음과같은오류가발생할수있다. [ERR-91101 : Connection is in autocommit mode. One can not operate on LOB datas with ALTIBASE 환경의개발시고려사항가이드 13 page of 29
autocommit mode on.] 테이블의컬럼에 LOB 를빼고조회를할경우는상관이없으나 SELECT 타겟절에 LOB 타입이포함될경우위와같은오류가발생한다. 따라서, LOB 타입을조회할때에는반드시세션의속성을 Non-Auto-Commit 모드로변경을한후수행하도록해야한다. 단, Altibase HDB 6.3.1 이상의 JDBC 드라이버를사용할경우에는 Client Side 에서트랜잭션 Commit 모드를제어하도록설정하여 Auto-Commit 모드에서도 LOB 타입의데이터를조회할수있다. JDBC 드라이버의 Client Side 에서트랜잭션 Commit 모드를설정하는방법은아래와같다. * altibase_cli.ini 예시 [ DataSource ] Server=192.168.1.1 Port=20300 User=SYS Password=MANAGER AlternateServers=(192.168.1.2:20300,192.168.1.3:20300) ConnectionRetryCount=3 ConnectionRetryDelay=5 LoadBalance = On SessionFailOver = Off ClientSide_Auto_Commit = On Prepared Statement 의사용 ALTIBASE 는질의처리의성능을빠르게하기위해내부에수행된질의의실행계획을저장하고있다. 하지만, 매번 PREPARE/EXECUTE 를하는형태의질의를수행하게되면내부적으로이미 PREPARE 된실행계획을사용하게되지만 PREPARE 를수행하는네트웍비용이매번발생하기때문에이러한성능감소요인을막기위해서는다음과같이코드를작성할것을권장한다. ( O ) ( X ) Prepare statement while (1) { Execute statement } while (1) { Prepare statement Execute statement } 오픈소스중에는 OTL (Oracle, Odbc Template Library) 라는 DB 개발라이브러리가있다. 이라이브러리는모든질의를매번 Prepare/execute 를수행하는형태로처리하고있다. 단, streaming 옵션을활성화시키면한번 prepare 된질의는 execute 만수행하는형태로처리하게되는데이런튜닝요소를통해 ( 네트웍전송비용의감소 ) 응용프로그램의처리속도를 2 배이상향상시키는경우도있으므로개발자는질의처리를수행하는과정에서는가능한 dynamic SQL 을최소화시키고동일한질의를매번 prepare 하고있지는않은지확인하도록해야한다. ALTIBASE 환경의개발시고려사항가이드 14 page of 29
다음과같은코드는매우불합리한코드라고할수있다. sprintf (sql, INSERT INTO t1 VALUES (%d, %d), sznum1, sznum2); EXEC SQL Prepare S for :sql; EXECUTE S; 위의코드는매번실행할 SQL 문장을만들고 prepare 한후 execute 하도록실행한다. 이런경우는다음과같이한다면간결하고합리적이라할것이다. EXEC SQL INSERT INTO t1 VALUES (:sznum1, :sznum2); SQL Tuning DB 업무와관련해개발작업을진행하다보면질의처리가느린경우들이발생한다. 혹은, 테스트환경에서는빠르게처리되었는데통합테스트또는운영단계에서질의가매우느린경우들이발생한다. 이것은개발자혹은 DBA 가수행되는모든질의에대해실행계획의검증이나테스트과정을소홀히한경우라고볼수있다. ALTIBASE 는질의의처리과정즉, 실행계획을다음과같이확인할수있다. ALTER SESSION SET EXPLAIN PLAN = ON; 위와같은명령을수행한후 isql 이나또는 AdminCenter2 와같은유틸리티에서질의를수행하면수행된실행계획을확인할수있다. isql> ALTER SESSION SET EXPLAIN PLAN = ON; Alter success. isql> SELECT a, COUNT(*) FROM t1 WHERE a = 1 GROUP BY a; A COUNT ------------------------------------ 1 262145 1 row selected. ------------------------------------------------------------ PROJECT ( COLUMN_COUNT: 2, TUPLE_SIZE: 16 ) GROUP-AGGREGATION ( ITEM_SIZE: 32, GROUP_COUNT: 1, BUCKET_COUNT: 1024, ACCESS: 1, SELF_ID: 3, REF_ID: 2 ) SCAN ( TABLE: T1, FULL SCAN, ACCESS: 262145, SELF_ID: 2 ) ------------------------------------------------------------ 위의실행계획은 T1 테이블을 FULL SCAN 하고레코드에대해 262,145 번접근했음을확인할수있다. 만일, 인덱스가존재하고인덱스를타도록조건을명시한다면다음과같이출력될수도있을것이다. ------------------------------------------------------------ PROJECT ( COLUMN_COUNT: 1, TUPLE_SIZE: 4 ) SCAN ( TABLE: T1, INDEX: IDX_T1, ACCESS: 2, SELF_ID: 2 ) ------------------------------------------------------------ ALTIBASE 환경의개발시고려사항가이드 15 page of 29
SQL 튜닝과관련된사항은 ALTIBASE SQL 튜닝가이드 문서를참고하면더많은정보를얻을수있으므로개발전에개발자들은반드시읽어볼것을권장한다. 대량변경작업의주의 일반적인대량변경작업은 ALTIBASE 뿐아니라타 DBMS 에서도부하가크기때문에각벤더별로요구하는주의사항들이존재한다. ALTIBASE 는다음과같은사항의주의가필요하다. 1 메모리테이블의대량변경작업시메모리증가의가능성 ALTIBASE 는 MVCC(Multi Version Concurrency Control) 기법을지원한다. MVCC 기법은변경이발생할경우동일레코드를해당테이블의빈공간에복제하여변경을가하게된다. 만일, 천만건을변경하면천만건의복제본으로인한메모리증가가발생할수밖에없다. ( 물론이렇게늘어난영역은다시데이터또는복제영역으로재활용이되지만실시간으로메모리를해제시키지는않는다.) 2 대량변경작업을수행함으로써트랜잭션로그파일의지속적인증가 대량의변경작업은각변경대상레코드에대한리두로그를트랜잭션로그파일에기록해야한다. 따라서, 하나의트랜잭션내에변경되는모든레코드의리두로그를기록해야하는데만일, 이대상의범위가많다면그만큼의트랜잭션로그파일도많이생성될수밖에없다. (ALTIBASE 는체크포인트시점에트랜잭션로그파일을삭제하게되는데로그파일에트랜잭션이지속중인정보가존재하면삭제할수없고이로인해로그파일증가에의한디스크부족의장애가발생할가능성이있다.) 3 이중화환경에서의 Dead-Lock 발생가능성및반영지연 이중화환경에서는앞서설명한바와같이하나의트랜잭션이변경한모든레코드의변경정보를상대편서버로전송하게된다. 이과정에서상대편서버의해당하는레코드에대하여락을유지하게되는데만일, 상대편서버에서동일한범위에속하는레코드를변경할경우이중화로그에의해발생한트랜잭션과상대편서버자체에서발생하는트랜잭션간에데드락이유발될수있다. ALTIBASE 환경의개발시고려사항가이드 16 page of 29
ALTIBASE Trace 로그 ALTIBASE 는설치된경로인 $ALTIBASE_HOME/trc 경로에모듈별로중요한상태정보및에러등에대해 Trace 로그를기록하고있다. 이에러들에설명한다. Trace 로그의분류 ALTIBASE 가기록하는 Trace 로그는다음과같다. 분류 altibase_boot.log altibase_sm.log altibase_qp.log altibase_rp.log altibase_dk.log altibase_xa.log altibase_mm.log 설명 Start/Stop 과정및 DBMS 전반의로그를기록체크포인트및테이블스페이스관련로그를기록 DDL수행및 Query Processing과관련된로그를기록이중화와관련된로그를기록 DB link 사용과관련된로그를기록 XA 트랜잭션과관련된로그를기록메인모듈 (Main Module) 처리시발생하는로그를기록 altibase_error.log 서버에서발생하는오류와관련된로그를기록. altibase_dump.log 서버에서발생하는오류에대한디버깅로그를기록. 해당로그파일은기본적으로 10 개까지 altibase_xx.log 를포함하여 altibase_xx.log-[1-10] 까지순환되면서로그를기록하게된다. 이하에서는사용자에게의미있는중요한메시지들에대한각 Trace 로그별로분리하여설명한다. altibase_boot.log 사용자는 DBMS 에서오류가발생하면 altibase_boot.log 를먼저확인해야한다. 표중에표시는사용자가반드시조치할에러이다. ERR-0108d (errno=0) License is invalid or expired. 구동단계에서라이센스파일이없거나잘못된경우발생한다. ALTIBASE 에서라이센스정보를확인하고필요시재발급을받도록해야한다. ERR-01052(errno=13) Unable to invoke open() function on [/dbs/mydb-0-0] 최초에구동전에 DB 를생성하지않았거나해당파일에접근할권한이없는경우발생한다. DB 를생성하거나또는디렉토리및파일에접근권한이있는지확인한다. 또는, 사용자의실수로데이터파일을삭제한경우일수있으므로이경우백업본을이용하여복구하는절차가필요하게된다. ALTIBASE 환경의개발시고려사항가이드 17 page of 29
ERR-01052(errno=2) Unable to invoke open() function on [/dblog01/logfile536358] ALTIBASE 구동단계에서는자동복구를수행하게되는데이과정에필요한리두로그파일이손상되었거나존재하지않는경우에발생한다. ALTIBASE 본사로기술지원요청을해야한다. ERR-0001c(errno=76) Unable to shutdown the communication channel ALTIBASE Shutdown 단계에서세션과관련된정리과정에서나오는 Warning 메시지로운영에는영향이없다. ERR-71019 (errno=104) Failed to invoke a system function, write() (read, accept, select) 디스크또는네트웍상의오류로인해발생한다. 파일시스템의체크나네트웍상의문제가없는지확인이필요하다. 또는, 메모리의부족으로시스템콜이실패하는경우가발생할수있다. ERR-40029 (errno=16) Failed to invoke a system function, flock_trywrlock() 이미 ALTIBASE 가구동중이거나구동된상태에서다시 ALTIBASE 를재구동하려고하는경우발생한다. 또는, 메모리의부족으로시스템콜이실패하는경우발생할수있다. ERR-11018 (errno=2) The version of data file for backup is not compatible with the version of storage manager. Backup DB => [ Version ID = 5.4.1, Bit = 64, Endian = LITTLE LogSize = 10485760 Transaction Table Size = 1024 ] Server=>[ Version ID = 5.4.1, Bit = 64, Endian = LITTLE LogSize = 10485760 Transaction Table Size = 2049 ] 백업받은데이터파일을가지고구동하는과정에서현재사용중인 ALTIBASE 버전과호환이되지않는데이터파일을가지고복구하려고시도하거나백업시점에설정한 ALTIBASE 설정값과다른상태로구동을하려고시도하는경우에발생한다. [ERROR] first write () operation failed. errno=32 세션이단절된상태에서 read/write 시스템콜이오류가발생할수밖에없으므로그정보를 Warning 형태로기록을남길경우이다. 응용프로그램에서정상적인 Disconnect 명령없이강제종료시키는경우에도이로그가기록된다. 운영에는영향이없다. ERR-7101d(errno=11) Protocol header error. (TCP 211.115.75.212:63847) Protocol processing failed. Close connection... ALTIBASE 의접속포트를통해접속한세션이 ALTIBASE 서버버전과호환되지않는버전으로접속을시도한경우로출력된접속정보를통해역추적하여 Server/Client 버전간의호환여부를확인해야한다. 운영에는영향이없다. ERR-4000f(errno=2) No Error Message Loaded $ALTIBASE_HOME/msg/ 경로에위치한파일들이없거나버전과호환되지않는경우발생한다. 또는, 해당경로에읽기권한이없을경우도발생한다. [Notify : Query Timeout] Query Canceled by Server : Session ID = 102373 [Notify : Fetch Timeout] Session Closed by Server : Session ID = 80106 [Notify : Utrans Timeout] Session Closed by Server : Session ID = 80106 [Notify : Idle Timeout] Session Closed by Server : Session ID = 80106 QUERY / FETCH / UTRANS / IDLE TIMEOUT 설정에의해 TIMEOUT 이발생한경우그에대한 Warning 형태의로그를기록하는경우이다. 문제가되는경우해당 ALTIBASE 환경의개발시고려사항가이드 18 page of 29
세션정보가메시지와함께기록되기때문에세션을추적하여문제라고판단할경우해결하도록해야한다. ERR-01027(errno=0) No more IPC channel (MAX=50, USED=50, BUFSIZE=65536) IPC 접속가능한자원보다더많은 IPC 접속을시도할경우발생한다. [Warning] Memory allocation failed. Size:524320 Timeout: 0 ERR-61055(errno=12) Memory allocation failure 메모리가부족한상황에서내부적으로필요한메모리할당에실패하는경우발생한다. 이경우메모리가부족한원인을파악하여조치해야한다. 만일, Swap 메모리까지부족한경우가발생하면 Warning 없이 ALTIBASE 가비정상종료할수있다. ioctl() failed 소켓또는디스크 I/O 작업간에시스템콜수행에일시적인문제가발생한경우발생한다. 일반적으로무시해도상관없으나네트웍또는디스크를점검하는것을권장한다. WANING : write error number : 0, file name : /dblog01/logfile537572, file handle : 440, intended size : 10485760, writed size : 10485760 또는, File Extending Failed. : The disk space has been exhausted. Error : Extending DataFile : from 0, size 10485760 디스크용량이부족하여 ALTIBASE 가필요로하는파일을생성할때용량이부족하여정상적으로생성하지못했다는경고로반드시디스크용량을체크하고조치해야한다. altibase_sm.log altibase_sm.log 는체크포인트의수행여부및장시간수행되는질의의존재여부등을판단해볼수있는중요한근거가된다. [CHECKPOINT-BEGIN] 체크포인트가시작되었음을의미한다. Remove Online Log File at LFG [0]: File[220 ~ 227] 체크포인트가수행되면서더이상복구에필요하지않은트랜잭션로그파일들을정리하는메시지이다. 만일, File [None] 이라고지속적으로표시될경우장시간실행되는질의가없는지또는, 이중화로미전송되고있는부분이없는지확인이필요하다. [CHECKPOINT-summary] BeginChkptLSN=[0,83,9820280], EndChkptLSN=[0,83,9820721], DiskRecLSN=[0,83,9820280] 체크포인트가정상적으로완료되는시점에체크포인트의수행정보에대한요약정보를로그에남긴다. [CHECKPOINT-END] 체크포인트가정상적으로완료되었음을의미한다. ALTIBASE 환경의개발시고려사항가이드 19 page of 29
Minimum LSN = [0,83,9824136] 위값은현재진행중인트랜잭션의기록중인로그파일의 offset 위치이다. 따라서, 저값이변동하지않고계속같은값을유지한다면위의 Remove 로그와동일하게장시간수행되는질의의존재여부나이중화미전송여부를반드시확인해야한다. Database-Level Backup Completed [SUCCESS] 백업이정상수행되었음을의미한다. DISK TABLESPACE... DATABASE... 디스크테이블스페이스의백업이수행되었음을의미한다. ~/loganchor0 BACKUP TO 로그앵커의백업이수행되었음을의미한다. MEMORY TABLESPACE DATAFILE. BACKUP TO. 메모리테이블스페이스의백업이수행되었음을의미한다. altibase_qp.log altibase_qp.log 에는사용자가수행한 DDL 의수행기록및 DB 속성값을 ALTER SYSTEM 구문으로변경을가하는경우등에대한로그가기록된다. 아래와같이분류된다. [EXEC_DDL_BEGIN : create index T1_IDX on T1 (A)] 사용자가수행한 DDL 의수행시작을의미하는로그이다. [EXEC_DDL_END : SUCCESS] 사용자가수행한 DDL 의정상완료를의미하는로그이다. [EXEC_DDL_END : FAILURE] errorcode 1627549735. 사용자가수행한 DDL 의오류내역을의미하는로그이다 [SET-PROP] CHECKPOINT_BULK_WRITE_PAGE_COUNT=[0] 사용자가시스템전역에영향을미치는 DB 속성설정값을변경한경우를의미하는로그이다. altibase_rp.log altibase_rp.log 에는이중화의동작상태및각종 Conflict 발생시의질의가기록되기때문에이중화문제의추적에있어중요한단서제공을하고있다. ERR-31017(errno=0) Replication not found 이중화관련 DDL 을수행할때지정한이중화객체가존재하지않는경우에발생한다. 따라서, 지정한이중화객체가존재하는지확인이필요하다. ERR-6200f(errno=16) [Sender] Stop sender thread REP1 at [9765213], Restart SN[9765207] ALTIBASE 환경의개발시고려사항가이드 20 page of 29
이중화 Sender 를사용자가명시적으로 Stop 시킨경우발생하는로그이다. ERR-71017(errno=79) Failed to invoke a system function, connect() ERR-61012(errno=79) [Sender] Failed to connect to the peer server ERR-61022(errno=79) [Sender] Sender Sleep : 60 seconds [Sender] getnextlastusedhostno: from 192.168.1.81:53341 to 192.168.1.81:53341 ERR-61003(errno=9) Unable to read from a socket ERR-61012(errno=119) [Sender] Failed to connect to the peer server ERR-6100d(errno=119) [Sender] Failed to handshake with the peer server (Handshake Process Error) 이중화 Sender 가상대편서버에접속할수없는경우와재접속을시도하는로그이다. 상대편의서버, 네트웍상태및 ALTIBASE 가정상구동되고있는지확인이필요하다. 만일, 명시적으로상대편이중화를 Drop 한경우라면정상적인에러이다. [Recovery Sender] Replication REP1 Start... at [60495917] 이중화가정상개시되어 Sender 가구동된로그이다. [Receiver] Replication REP1 Started... 이중화가정상개시되어 Receiver 가구동된로그이다. RECEIVER:REPLICATION STOP MSG arrived! [ReceiverApply] REPLICATION STOP XLog arrived! Normal Stop! [Receiver] Replication REP1 Stopped... 상대편서버의이중화가사용자에의해명시적으로 Stop 되어중지된경우이다. ERR-61047(errno=0) [Receiver] REP1 receiver has error in recvxlog() ERR-61048(errno=0) [Receiver] REP1 receiver has recvxlog error in run() ERR-6104b(errno=0) [Receiver] REP1 receiver is ended (by thr_exit) 이중화 Receiver 가어떤오류로인해쓰레드가종료된경우이다. ERR-61036(errno=0) [Receiver] err_not found in deletexlog() ERR-61000(errno=0) The received record is not found in the database. 이중화로수신받은 DELETE 트랜잭션을수행하는과정에서해당하는레코드가존재하지않을경우 Conflict 오류를기록한경우이다. ERR-61035(errno=0) [Receiver] An update conflict encountered. ERR-61001(errno=0) A conflict has been occurred while executing the received statement. 이중화로수신받은 UPDATE 트랜잭션을수행하는과정에서해당하는레코드의 Before/After 값이달라 Conflict 오류를기록한경우이다. ERR-6103a(errno=0) [Receiver] err_not_found in updatexlog() ERR-61000(errno=0) The received record is not found in the database. 이중화로수신받은 UPDATE 트랜잭션을수행하는과정에서해당하는레코드가 ALTIBASE 환경의개발시고려사항가이드 21 page of 29
존재하지않을경우 Conflict 오류를기록한경우이다. ERR-11058(errno=0) The row already exists in a unique index. 이중화로수신받은 INSERT 트랜잭션을수행하는과정에서해당하는레코드가이미수신측에존재하는경우이다. ( 동일한 PK 를가지는데이터가존재함 ) 위예시에서사용된이중화객체명은 REP1 이다. 사용자가지정한이중화객체는이름이다를것이므로에러에대한조회시에이를고려하도록해야하며주로이중화 Sender/Receiver 의동작상태및 Conflict 오류를감지할것을권장한다. 또한, 이중화 Conflict 가발생하면앞서설명한이중화환경의고려사항을제대로준수하지않았거나이중화지연으로데이터불일치가발생했을가능성이있기때문에어떠한이유로그러한지 Conflict 발생시남는 SQL 문을통해원인을찾는것이중요하다. altibase_dk.log altibase_dk.log 에는 Database Link 를사용하는환경에서발생할수있는여러가지정보및에러를기록한다. ERR-b1070(errno=0) ODBC problem occurred [0:IM002:[unixODBC][Driver Manager]Data source name not found, and no default driver specified] 지정한 Data Source 이름을찾지못하거나 LD_LIBRARY_PATH 가설정이되어있지않을경우발생한다. ERR-b1070(errno=239) ODBC problem occurred [327730:08001:Client unable to establish connection.] 알티베이스서버에연결할수없거나 odbc.ini 환경변수설정이되어있지않을경우발생한다. 서버구동상태를확인하고, odbc.ini 를환경변수에추가하여해결할수있다. altibase_error.log altibase_error.log 에는알티베이스비정상종료발생시, 원인분석을위한중요한단서를제공한다. BEGIN-STACK-[CRASH]===================================== END-STACK===================================== [========= FATAL Terminated ==========] ALTIBASE 가버그로인해비정상종료가발생할경우어떤진행과정에서발생했는지자체적인 Trace 로그를출력하게된다. 이에러가발생한경우는 ALTIBASE 프로세스가종료된상태임으로우선 $ALTIBASE_HOME/trc/ 모든파일을백업하도록한다. 다음리두로그파일을백업하고디스크가충분하다면데이터베이스파일까지확보한다. 이와같은파일백업이완료되면 ALTIBASE 를재구동하도록조치하고 ALTIBASE 에기술지원을요청한다. ALTIBASE 환경의개발시고려사항가이드 22 page of 29
Client Application 에러메시지 ALTIBASE 를사용하는응용프로그램을운영하는환경에서자주발생하는에러유형들을소개하고각유형들에대해어떤사항들을개발자가확인해야하는지를설명한다. Connection does not exist DBMS 에연결이되지않은상태또는, 단절된상태에서질의를처리하려고할경우발생하는오류이다. 다음의경우들에서발생할수있다. 1. 앞에서설명한 TIMEOUT 정책에의해연결이해제된이후질의를수행할때 2. 쓰레드프로그램의경우존재하지않는연결고유명을사용한경우 위의사항들을점검하고관련사항에적합한조치를취하도록한다. 예를들어, TIMEOUT 정책에의해발생하였다면해당세션의 TIMEOUT 설정값을늘리거나또는질의의튜닝을진행하는식의조치가필요하다. Communication link failure 일반적으로위의 Connection does not exist 는이오류다음으로발생하게된다. 이에러는질의를수행과정에서세션이단절된상태를의미한다. 원인은앞서설명한것처럼 TIMEOUT 정책에의해해제되는경우가일반적이다. 간혹, 네트웍의문제로연결이단절되는경우가발생할수있다. 이문제는통신소켓상의문제로다양한원인으로발생할수있기때문에다음의사항들을체크하고확인할것을권장한다. 1. altibase_boot.log 에세션이단절된로그가있는지확인 2. 쓰레드프로그램인경우지켜야할주의사항이제대로준수되지않았는지확인 3. 네트웍상의일시적인문제가없었는지확인 Calculate stack overflow ALTIBASE 내부적으로질의를처리하는과정에서사용되는객체로수행되는질의가필요로하는 Stack 이부족한경우발생한다. 사용자는해당질의의수행전에다음과같이질의를수행한후에러가발생한질의를수행하면정상적으로처리할수있다. ALTER SESSION SET STACK SIZE = 8192; 이값은메모리의증가를유발하기때문에전체시스템에반영하여사용하기보다는해당세션만변경하여사용하도록할것을권장한다. ALTIBASE 환경의개발시고려사항가이드 23 page of 29
Conversion not applicable 다음과같은경우에발생한다. CREATE TABLE t2 (a BYTE (2)); INSERT INTO t2 VALUES (CLOB 1 ); 위의예제처럼 BYTE 컬럼에 CLOB 의데이터를넣을경우형변환을 CLOB 을 BYTE 로변환할수없음으로에러를발생시킨다. 즉, 각컬럼타입끼리는호환이가능한매트릭스가있는데그러한호환가능하지않는질의를처리하게될경우이에러가발생한다. 컬럼타입간의호환은 ALTIBASE ODBC User 매뉴얼을참고하면된다. Invalid cursor state CURSOR 를사용할때다사용된 CURSOR 를정상적으로 CLOSE CURSOR 처리를하지않은채다시 OPEN CURSOR 를하려고시도할경우발생한다. 또는이미 Fetch 가완료된 CURSOR 를다시 Fetch 하려고시도하는경우에도발생한다. 간혹, 사용자프로그램이쓰레드인경우연결객체에대한동시성제어를제대로하지않아자신의쓰레드에유효하지않은커서를핸들링할경우도발생하게되는데앞에서설명한것처럼반드시 CURSOR 를사용후에는명시적으로 CLOSE CURSOR 구문을사용함으로써문제를해결하도록해야한다. DECLARE CURSOR OPEN CURSOR FETCH CURSOR /** CLOSE CURSOR **/ 누락된경우들이대표적임. Not defined cursor CURSOR 를사용할때 CURSOR NAME 을명시하는데이 CURSOR NAME 이존재하지않거나혹은 DECLARE(PREPARE) CURSOR 를수행하는과정에서오류가발생했는데이를체크하지않아 EXECUTE 혹은 OPEN CURSOR 단계에서오류가발생할때이에러가나타난다. 사용자는반드시다음과같이개발을해야한다. DECLARE CURSOR1 FOR :statement; If (SQLCODE!= 0) PREPARE 단계에서도반드시에러체크를해야함 Error_process(); OPEN CURSOR1 USING :variable; ALTIBASE 환경의개발시고려사항가이드 24 page of 29
Invalid request to process the SQL statement 일반적으로쓰레드구조의프로그램에서자주발생하며앞에서설명한바와같이쓰레드구조의연결객체에대한동시성제어가올바르지않을경우 ALTIBASE 서버와클라이언트간에주고받아야하는프로토콜의순서가틀려지는경우발생한다. 먼저, 프로그램의구조가쓰레드라면이러한동시성제어가올바른지확인하도록해야한다. 혹은, PREAPRE->BINDING->EXECUTE 와같이질의를수행해야하는순서가제대로지켜지지않은경우가있는지확인해야한다. Invalid literal 이에러는숫자형타입에문자를입력하는등의오류가발생할경우나타난다. CREATE TABLE t1 (a INTEGER); INSERT INTO t1 VALUES ( AAAA ); 위의예처럼컬럼타입이숫자형임에도데이터를문자열로삽입하려고시도할경우발생한다. 반대로, 문자열을숫자형변수에담으려고할경우에는다음과같이오류가발생한다. Invalid character value for cast specification. Invalid length of data type 컬럼타입보다더큰값으로데이터가입력되는경우발생한다. CREATE TABLE t1 (a CHAR(2)); INSERT INTO t1 VALUES ('aaaa'); [ERR-2100D : Invalid length of the data type] 위의예처럼컬럼타입은 2byte 까지저장이가능한데입력을 4byte 로하려고하면지정된컬럼크기보다데이터값이크기때문에에러가발생한다. Indicator variable required but not supplied error 이에러는 Precompiler 를사용하는개발환경에서발생을하는데 SELECT 결과에서컬럼의리턴값이 NULL 로리턴될경우 INDICATOR 변수가지정되지않으면 SQL_SUCCESS_WITH_INFO 와함께이오류메시지를발생하게된다. int IND_C1; int IND_C2; EXEC SELECT C1, C2 INTO :H_C1 INDICATOR :IND_C1, :H_C2 INDICATOR :IND_C2; ALTIBASE 환경의개발시고려사항가이드 25 page of 29
위의경우처럼 INDICATOR 변수를명시적으로사용하거나또는, Precompiler 의옵션에서 unsafe_null 옵션을이용하여에러가발생하지않도록할수있다. Incompatible NLS between the client and the server ALTIBASE 서버로접속을시도할때서버에설정된문자셋과다른문자셋값으로접속을시도할경우발생한다. 예를들어, 서버는 MS949 로설정된상태인데클라이언트에서 US7ASCII 와값으로접속을시도할경우이러한에러가발생한다. 서버에설정된문자셋을조회하는방법은다음과같다. SELECT * FROM V$NLS_PARAMETERS; ( 버전 5.3 이상 ) SELECT name, value1 FROM V$PROPERTY WHERE name = NLS_USE ; ( 버전 5.1 이하 ) 이에러는 5.3 이전버전들에서만발생하게된다. 5.3 버전부터는문자셋이달라도 US7ASCII 로접속은가능하다. 다만, 서버와클라이언트간의문자셋의차이로한글과같은문자를저장하려할경우올바르지않은데이터로저장될수있음으로주의가필요하다. Invalid size of data to bind to host variable [Data Size ] 이에러는호스트변수의크기보다더큰데이터를넣어질의가처리될경우발생한다. 예를들어, CHAR (20) 으로선언한호스트변수에 20 보다큰문자열이들어올경우발생한다. 일반적으로개발자가변수의초기화의실패또는, 쓰레기값이들어올경우발생할수있다. 또는, 쓰레드환경의프로그램에서동시성제어실패로 A 문장을 PREPARE 한후바인딩을해야하는데 B 문장의바인딩을수행할경우발생할수도있다. (A 문장은 20byte 를 binding 하면되는데잘못핸들링하여 B 문장의 100byte 를바인딩하는형태 ) 일단, 사용자는해당호스트변수값을출력하여명확히길이를넘지않는지체크하고쓰레드부분의핸들링에있어서도동시성부분에문제가없는지확인하도록해야한다. Invalid character in use 일반적으로한글에대해 LIKE 검색시발생을하게되는데예를들어 ALTIBASE 서버의문자셋값을 KO16KSC5601 로설정하였는데 KO16KSC5601 의표현범위를넘어선문자가뒤섞여서저장된경우발생한다. 위의오류가발생한경우에는다음과같이작업을하는것을권장한다. 1. iloader 를통해테이블의데이터를다운로드 2. ALTIBASE 구동중지 3. $ALTIBASE_HOME/conf/altibase.properties 의 NLS_USE 값을 MS949 로변경 4. ALTIBASE 구동개시 5. 문제가되는대상테이블을 truncate (delete 는안됨 ) 6. iloader 를통해 (1) 에서받은데이터를다시업로드 ALTIBASE 환경의개발시고려사항가이드 26 page of 29
즉, 한글을사용하는경우라면 KSC5601 보다 MS949 / UTF8 과같은문자셋을사용하고서버와일치하는문자셋으로접속하여처리할것을권장한다. Too many pages are allocated ALTIBASE 메모리테이블스페이스의경우는모든메모리테이블스페이스의합산이 $ALTIBASE_HOME/conf/altibase.properties 에서 MEM_MAX_DB_SIZE 를초과할수없다. 이에러메시지는모든공간이소진되어발생한다. 따라서, 불필요한테이블을삭제하거나 MEM_MAX_DB_SIZE 를더큰값으로늘리고 ALTIBASE 를재구동해야한다. 이러한임시조치이후에는어떤이유로메모리테이블스페이스의사용량이증가하였는지각테이블별사용량의조회나대량변경작업등이발생하지않았는지확인하여조치할필요가있다. The Tablespace does not have enough free space 테이블스페이스의여유공간이부족할경우발생한다. 디스크테이블스페이스의경우데이터파일의추가작업이필요하다. The transaction exceeds lock timeout specified by user DML 간에는 Lock 을대기하고서버에설정된 TIMEOUT 정책에의해동작을하게되지만 DML 에의해잡힌 Lock 으로인해 DDL 이대기하게될경우즉시, 이에러가발생하게된다. 시간 A 세션 B 세션 T1 INSERT INTO x1 VALUES (Lock 획득 ) T2 ALTER TABLE x1 ADD COLUMN (Error) 위의표와같이 A 세션이먼저 DML 을통해 Lock 을획득한상태에서 B 세션이 DDL 을수행하려고할경우이에러가발생하기때문에해당테이블에 Lock 이존재하는지체크하고조치한후작업을진행하면된다. The update log size is bigger than TRX_UPDATE_MAX_LOGSIZE ALTIBASE 에서는대량변경작업이유발하는후속적인장애상황을방지하기위해변경트랜잭션에의해발생하는리두로그의양이 $ALTIBASE_HOME/trc/altibase.properties 에 TRX_UPDATE_MAX_LOGSIZE 에명시된값보다커질경우이에러를발생시키고롤백처리를하게된다. 사용자는해당트랜잭션이반드시하나의질의문으로처리되어야한다면세션레벨에서다음과같이이속성값을변경하여처리하도록한다. ALTIBASE 환경의개발시고려사항가이드 27 page of 29
ALTER SESSION SET TRX_UPDATE_MAX_LOGSIZE = 0; ( 해당제약을없애는설정 ) 이렇게변경하여처리할경우리두로그파일의생성이많아져서디스크풀장애와같은상황이발생할수있으므로주의가필요하다. 또한, ALTIBASE 는대량변경작업시 MVCC 로인한리소스의증가를방지하기위해테이블에 X-Lock 을획득하려고시도하기때문에 X-Lock 획득이후해당테이블에조회및변경이 X-Lock 으로인해대기하게됨으로사용자의주의가필요하다. String data right truncated SELECT 문등에서리턴되는문자타입의값이선언된호스트변수의크기보다클경우발생한다. DB 에접속하여조회하는테이블의컬럼크기를확인하고사용된호스트변수의크기를 ( 컬럼크기 + 1 byte) 로선언하도록해야한다. Value overflow 숫자형컬럼의표현범위보다더큰값이입력될경우발생한다. CREATE TABLE x2 (a NUMERIC(10, 5)); insert into x2 values (123444.5678); [ERR-21010 : Value overflow] Several statement still opened Fetch 프로토콜이진행중에서 CREATE TABLE 과같은질의가수행될때발생한다. 따라서, 모든동일세션에서 CURSOR-FETCH 가완료된후 DDL 을수행하거나열려있는 CURSOR 를 CLOSE 한이후 DDL 질의를수행하도록해야한다. 또는, 별도의세션에서 DDL 질의를수행하도록코드의변경이필요하다. ALTIBASE 환경의개발시고려사항가이드 28 page of 29
알티베이스 서울특별시구로구구로 3 동 182-13 대륭포스트 2 차 1008 호 02-2082-1000 http://www.altibase.com 대전사무소대전광역시서구둔산동 1417 둔산더리치빌 301 호 042-489-0330 기술본부서울특별시구로구구로 3 동 182-13 대륭포스트 2 차 908 호 02-2082-1114 기술지원센터 02-2082-1114 http://support.altibase.com Copyright c 2000~2014 ALTIBASE Corporation. All Rights Reserved. 이문서는정보제공을목적으로제공되며, 사전에예고없이변경될수있습니다. 이문서는오류가있을수있으며, 상업적또는특정목적에부합하는명시적, 묵시적인책임이일체없습니다. 이문서에포함된 ALTIBASE 제품의특징이나기능의개발, 발표등의시기는 ALTIBASE 재량입니다. ALTIBASE 는이문서에대하여관련된특허권, 상표권, 저작권또는기타지적재산권을보유할수있습니다. ALTIBASE 환경의개발시고려사항가이드 29 page of 29