4. 문제해결 및 FAQ#
문제해결#
레코드의 업로드 실패#
레코드 업로드의 실패는 다음과 같이 다양한 경우에 발생할 수 있다.
업로드 할 테이블에 이미 중복된(Primary Key 혹은 Unique Index) 데이터가 존재하는 경우#
업로드 할 테이블에 이미 중복된 데이터가 존재하는 경우에는 중복된 데이터만 -bad <badfile> 옵션에 의해 지정된 Bad log 파일에 저장되고, 중복되지 않은 나머지 데이터들은 정상적으로 업로드 된다. 이러한 문제가 발생하였을 경우는 적절히 데이터를 수작업으로 변환하거나, 유일키 제약 조건 위반(unique violation)을 해결하고 다시 업로드를 시도하여야 한다.
레코드 데이터 내에 구분자와 동일한 데이터가 존재하는 경우#
레코드 데이터 내에 구분자와 동일한 데이터가 존재하는 경우에는 적절히 다른 값의 구분자로 변경한 후, 다시 업로드를 시도하여야 한다.
데이터베이스 내에 데이터를 저장할 공간이 부족한 경우#
데이터베이스 내에 데이터를 저장할 공간이 부족한 경우에는 데이터베이스나 테이블을 정리 혹은 compaction 하여 데이터 공간을 확보한 후 중단된 부분부터 데이터를 다시 업로드 한다.
문자 데이터의 값이 "?"로 저장될 경우#
입력한 문자 데이터가 데이터베이스 캐릭터 셋으로 표현할 수 없는 문자일 경우 발생한다. 데이터베이스를 다시 생성해 데이터베이스 캐릭터 셋을 변경한다.
다국어 레코드만 업로드 되지 않을 경우#
실제 저장된 레코드의 캐릭터 셋과 환경변수 ALTIBASE_NLS_USE가 다를 경우에 업로드가 정상적으로 작동하지 않을 수 있다. 이 때 ALTIBASE_NLS_USE를 실제 저장된 레코드의 캐릭터 셋으로 변경한다.
FORM파일의 Parsing 오류#
FORM 파일에서 파싱 오류가 나는 경우, 대부분의 경우는 FORM 파일의 직접 수정에 의한 문법 오류인 경우가 많다. 문법 오류 이외에 iLoader에서 사용하는 예약어들이 칼럼 이름 등의 위치에 나타나는 경우에도 동일한 문제가 발생할 수 있다.
다음은 iLoader에서 사용하는 예약어들의 목록이다.
ADD APPEND BIGINT
BINARY BIT BLOB
BOOLEAN BYTES CHAR
CLOB CONDITION
CURRVAL
DATA_NLS_USE DATE
DATEFORM DECIMAL
DEFAULT DOUBLE
DOWNLOAD EXIT
FLOAT FORMOUT
GEOMETRY
HELP HINT IN
INTEGER LOG NCHAR
NCHAR_UTF16 NEXTVAL
NIBBLE NOEXP NOLOG
NULL NUMBER
NUMERIC
NVARCHAR OUT
QUEUE QUIT
REAL REPLACE
SEQUENCE
SKIP SMALLINT
STRUCTOUT TABLE
TIMESTAMP TRUE
TRUNCATE VARBIT
VARCHAR YES
iLoader 속도 문제#
iLoader는 기본적으로 TCP 소켓을 이용해서 Altibase에 접속한다. 만일, iLoader를 수행하는 프로세스와 Altibase 서버가 구동되는 시스템이 동일한 호스트인 경우 클라이언트의 연결 방법을 Unix Domain Socket 혹은 IPC 연결을 이용하는 것도 도움이 되는 경우가 있다. 이는 시스템에 따라서 차이가 날 수 있으며 환경 변수 ISQL_CONNECTION을 UNIX, 혹은 IPC로 설정함으로써 접속 방법을 변경할 수 있다.
sh: $ ISQL_CONNECTION=IPC; export ISQL_CONNECTION
csh: $ setenv ISQL_CONNECTION=IPC
iLoader를 업로드 목적으로 사용하는 경우, iLoader는 매 레코드마다 커밋을 시도한다. 이 경우 -commit 옵션을 통해서 커밋 주기를 크게 하는 것이 어느 정도의 업로드 속도에 영향을 미칠 수 있다. 커밋 주기를 길게 할수록 업로드 속도는 증가한다.
다음은 100,000만 건의 데이터를 디스크 테이블로 업로드 할 때 commit 조건에 따른 속도의 변화를 보여준다.
$ time iloader -s 127.0.0.1 -u sys -p manager in -f test.fmt -d test.dat -mode replace -silent
100000 record load
UPLOAD: 1519620035
Load Count : 100000
real 25m29.391s
user 0m7.310s
sys 0m3.930s
$ time iloader -s 127.0.0.1 -u sys -p manager in -f test.fmt -d test.dat -mode replace -silent -commit 5000
100000 record load
UPLOAD: 47475459
Load Count : 100000
real 0m54.725s
user 0m3.010s
sys 0m2.900s
$ time iloader -s 127.0.0.1 -u sys -p manager in -f test.fmt -d test.dat -mode replace -silent -commit 10000
100000 record load
UPLOAD: 45757975
Load Count : 100000
real 0m52.652s
user 0m3.240s
sys 0m2.990s
주의: -s 옵션에 원격 서버를 명시해서 iSQL을 실행하면, ISQL_CONNECTION 설정이 무시되었다는 경고 메시지가 출력된다. 그리고 iSQL은 ISQL_CONNECTION 환경 변수의 설정 값에 상관없이 TCP로 원격 서버에 접속한다.
FAQ#
질문
아래와 같은 FORM 파일을 가지고 iLoader를 사용하면 parsing error가 나옵니다. 원인이 무엇인가요?
table TB_SPEC
{
"CODE" char (6);
"TIME" integer;
"SEQ" integer;
"PROC" integer;
"CONDITION" integer;
}
답변
CONDITION은 Altibase의 예약어이므로 parsing error가 나게 됩니다.
질문
iLoader를 사용하여 upload하는데 모두 error로 빠졌습니다. error내용이 뭔지 알고 싶은데 확인방법 부탁 드립니다.
답변
문의하신 내용에 대한 답변은 다음과 같습니다.
iloader in -f form.frm -bad a.bad -log a.log
와 같이 -log의 옵션으로 a.log 파일을 지정하면 에러 내용이 a.log 파일에 기록됩니다. 형식은 [ERR-errno : error_string]와 같아서 문제를 파악하는데 도움이 되리라고 봅니다.
참고로 -bad 옵션은 실패한 record들이 기록됩니다.
질문
줄 바꿈 문자에 특정문자("^" 또는 "|")와 "\n"을 조합해서 쓸 수 있습니까?
답변
예 가능합니다. 사용법은 다음의 예와 같습니다.
$ iloader formout -s 127.0.0.1 -u sys -p manager -f goods.fmt -T goods -silent
$ iloader out -s 127.0.0.1 -u sys -p manager -f goods.fmt -d goods.dat -r '^%n'
DATA_NLS_USE: KO16KSC5601
Total 30 record download(GOODS)
DOWNLOAD : 9.4280 msec
$ cat goods.dat
cat goods.dat
A111100001,IM-300 ,AC0001 ,1000,78000^
A111100002,IM-310 ,DD0001 ,100,98000^
B111100001,NT-H5000 ,AC0002 ,780,35800^
C111100001,IT-U950 ,FA0001 ,35000,7820.55^
C111100002,IT-U200 ,AC0003 ,1000,9455.21^
…
질문
FORM 파일에 다음과 같이 조건절을 추가하여 다운로드를 하려는데
table CUST_PROD
{
"SERV_NO" varchar (10);
"PROD_ID" char (5);
"EFF_DATE" char (14);
"EXP_DATE" char (14);
"CUST_TYPE" char (2);
"L_MOD_DATE" date;
}
DATEFORM YYYY/MM/DD HH:MI:SS:SSSSSS
DOWNLOAD CONDITION WHERE EXP_DATE >= '20050301000000'
다음과 같은 에러가 발생하며 수행이 안됩니다.
Input Command Parser Error or Reserved Keyword Used
DOWNLOAD: 338
답변
download condition에서 조건을 사용할 때 " "을 사용해야 합니다.
DOWNLOAD CONDITION "WHERE EXP_DATE >= '20050301000000'"
이렇게 사용하시면 됩니다.
질문
데이터를 primary key에 대하여 sort해서 다운로드를 받고 싶은데 iLoader에서 order by가 지원이 되는지 궁금합니다.
답변
다음 예처럼 download condition을 사용하여 where조건을 주면 됩니다.
$ iloader formout -s 127.0.0.1 -u sys -p manager -f dept.fmt -T department -silent
$ iloader -s 127.0.0.1 -u sys -p manager out -f dept.fmt -d dept.dat -silent
Total 8 record download(DEPARTMENT)
DOWNLOAD : 1.0070 msec
$ cat dept.dat
1001,"RESEARCH DEVELOPMENT DEPT 1 ","New York ",16
1002,"RESEARCH DEVELOPMENT DEPT 2 ","Sydney ",13
1003,"SOLUTION DEVELOPMENT DEPT ","Japan ",14
2001,"QUALITY ASSURANCE DEPT ","Seoul ",17
3001,"CUSTOMER SUPPORT DEPT ","London ",4
3002,"PRESALES DEPT ","Peking ",5
4001,"MARKETING DEPT ","Seoul ",8
4002,"BUSINESS DEPT ","LA ",7
FORM 파일을 다음과 같이 수정한 다음 다운로드 해보면 Primary Key에 대하여 sort된 데이터를 얻을 수 있습니다.
table departments
{
"DNO" smallint; <= Primary Key
"DNAME" char (30);
"DEP_LOCATION" char (15);
"MGR_NO" integer;
}
download condition "where DNO is not null" <= 수정된 부분
DATA_NLS_USE=KO16KSC5601
$ iloader -s 127.0.0.1 -u sys -p manager out -f dept.fmt -d dept.dat -silent
Total 8 record download(DEPARTMENT)
DOWNLOAD : 1.0200 msec
$ cat dept.dat
1001,"RESEARCH DEVELOPMENT DEPT 1 ","New York ",16
1002,"RESEARCH DEVELOPMENT DEPT 2 ","Sydney ",13
1003,"SOLUTION DEVELOPMENT DEPT ","Japan ",14
2001,"QUALITY ASSURANCE DEPT ","Seoul ",17
3001,"CUSTOMER SUPPORT DEPT ","London ",4
3002,"PRESALES DEPT ","Peking ",5
4001,"MARKETING DEPT ","Seoul ",8
4002,"BUSINESS DEPT ","LA ",7
질문
일반적으로 구분자가 "|"인 데이터 파일일 경우 파일을 바로 업로드 할 수 있는 명령이 있나요? mysql에서는 load data infile 이란 명령어가 있습니다. 메모리 DB에서는 어떤 명령어를 사용할 수 있나요?
답변
테이블 단위로 다운로드 및 업로드를 할 수 있는 iLoader 유틸리티를 이용한 방법이 있습니다. 먼저 iLoader를 이용하여 테이블의 FORM 파일을 다음과 같이 생성해야 합니다.(iLoader를 사용하지 않고 에디터로 직접 작성하는 것도 가능합니다.)
$ iloader formout -s 127.0.0.1 -u sys -p manager -T test -f test.FORM
아래와 같이 하면 갖고 계신 데이터 파일(구분자 "|"로 되어있는)을 바로 업로드할 수 있습니다. (단 테이블은 미리 만들어져 있어야 합니다.)
$ iloader in -s 127.0.0.1 -u sys -p manager -f test.FORM-d datafile -t '|'
질문
동일 테이블의 두 개의 칼럼의 날짜 형식이 서로 다를 때 import 할 수 있는 방법이 있습니까?
답변
iLoader에서는 DATEFORM을 다음의 예에서 보는 것처럼 칼럼별로 지정할 수 있습니다.
table table_name
{
column1 date "YYYY-MM-DD";
column2 date;
...
}
DATEFORM YYYY/MM/DD HH:MI:SS:SSSSSS
참고로 날짜 포맷 명시 방법의 우선 순위를 정리하면
FORM 파일의 칼럼 뒤에 명시 > 환경변수 ILO_DATEFORM > FORM 파일 안의 DATEFORM
질문
테이블에 실제 데이터가 있는 경우 iLoader로 upload 할 때 -mode replace 옵션을 적용한 경우 기존 데이터를 delete하는 건가요? truncate 하는 건가요?
답변
기존 데이터를 delete합니다.
질문
매뉴얼에 보면 '대용량 테이블을 truncate하는 경우 iLoader 유틸리티를 사용하여 다운로드, 업로드하는 것을 권장한다.'라고 나오는데 truncate할 테이블을 iLoader로 다운로드 한 후에 다시 iLoader로 업로드 하라는 건가요? 또한 iLoader로 -mode replace 옵션으로 업로드 할 경우와 truncate 하는 경우와 어떤 차이가 나는 건가요?
답변
대량의 데이터일 경우 delete하는 시간도 오래 걸리는 경우가 있기 때문에 truncate를 권장해 드리는 것이고, truncate하기 이전에 다운로드 받으시고 truncate한 이후 다시 upload를 하시면 됩니다.
delete 명령과 truncate의 시간적 차이로 인한 시간차이가 있을 수 있습니다.
질문
운용 중에 DB Schema가 변경되어 칼럼을 추가해야 하는 경우 어떻게 해야 하나요? 또, 스키마 변경 전 백업 받은 파일을 스키마 변경 후에 업로드해도 전혀 문제가 되지 않는건가요?
답변
alter table table_name add column(col_name data_type)으로 가능하지만 데이터 건수가 많을 경우 add column을 권장하지 않습니다. 시간이 오래 걸리고 많은 메모리를 사용하기 때문입니다. 그럴 경우는 다음과 같은 방법을 권장합니다.
-
iLoader로 schema 변경 전 data 백업
-
replication stop
-
replication에서 table drop
-
drop table
-
create table
-
iLoader로 schema 변경 전 백업 받은 파일을 업로드
-
replication에 add table
-
replication start
이전에 받아 두셨던 FORM 파일과 data file에는 추가 된 column의 정보가 들어 있지 않습니다. 추가 된 칼럼에 default 값이 있다면 iLoader로 loading 할 때 해당 column의 데이터가 들어가게 되지만 기본값이 없다면 위 작업이 끝나고 나면 추가된 칼럼에는 NULL 값이 들어 있게 될 것입니다.
질문
오라클에서 export 받은 dmp 파일을 그대로 Altibase에 import 할 수 있는 방법은 없나요?
답변
오라클 export는 2진 형식입니다. export를 이용한 파일은 Altibase로 옮길 수가 없습니다. SQL loader를 이용하여 data를 받는 방법을 사용하셔야 합니다. 오라클의 2진 형식은 다른 데이터베이스에서 읽을 수 있는 방법이 아니기 때문에 데이터를 옮길 때에는 SQL loader를 사용하고 있습니다.
질문
GIS 데이터를 iLoader로 업로드 및 다운로드가 가능합니까? 그리고 데이터 파일에는 어떤 형태로 저장되나요?
답변
GIS 데이터는 데이터베이스에 Geometry 타입의 칼럼으로 저장되며, iLoader는 이 데이터 타입을 지원합니다.
iLoader가 저장하는 데이터 파일 내의 Geometry 데이터는 서버의 바이트 순서대로 저장되는 WKB(Well Known Bytes) 형식입니다.
이 WKB 데이터는 CSV 포맷으로 인코딩되거나 행 구분자 및 열 구분자로 구별되는 이진 포맷으로 저장됩니다.