내용 목차
본 장에서는 tbLoader 유틸리티를 소개하고 사용 방법을 설명한다.
tbLoader는 대량의 데이터를 한번에 Tibero 데이터베이스에 저장하기 위한 유틸리티이다.이 유틸리티를 통해 SQL 문장을 일일이 작성하여 데이터베이스에 입력할 데이터를 입력하는 대신, 컬럼 데이터만 일반 텍스트 파일로 만들어서 한꺼번에 적재할 수 있다. 따라서 많은 데이터를 Tibero의 데이터베이스에 한 번에 저장할 때 유용한다.
tbLoader 유틸리티를 사용하면 사용자가 데이터 파일을 쉽게 작성할 수 있으며, 데이터를 적재하기 위한 시간을 단축할 수 있다.
tbLoader 유틸리티는 Tibero를 설치하는 과정에서 함께 설치되며, Tibero를 제거하면 함께 제거된다.
tbLoader 유틸리티는 명령 프롬프트에서 다음과 같은 형식으로 실행한다.
$ tbloader [options]
명령 프롬프트에서 지정할 수 있는 옵션에 대한 자세한 내용은 “5.7. 명령 프롬프트에서의 파라미터 지정”을 참고한다.
다음은 tbLoader 유틸리티를 실행하는 예이다.
[예 5.1] tbLoader 유틸리티의 실행
$ tbloader userid=db_user/db_password@default
control=sample.ctl data=sample.data direct=Y
tbLoader 유틸리티는 컨트롤 파일(Control file)과 데이터 파일(Data file)을 입력으로 받아서 로그 파일(Log file)과 오류 파일(Bad file)을 출력한다. 컨트롤 파일과 데이터 파일은 입력 파일로써 사용자가 작성하며, 로그 파일과 오류 파일은 tbLoader 유틸리티에서 자동으로 생성되는 출력 파일이다. tbLoader 유틸리티의 입출력 파일은 모두 일반 텍스트 파일이므로 사용자가 입력 파일을 생성하기가 매우 용이하다.
본 절에서는 tbLoader 유틸리티를 사용할 때 필요한 입력 파일인 컨트롤 파일, 데이터 파일과 로드 결과로 출력되는 로그 파일, 오류 파일을 설명한다.
컨트롤 파일은 tbLoader 유틸리티의 실행을 위한 파라미터를 지정한 파일이다. 사용자는 컨트롤 파일에 읽어 올 데이터의 위치와 데이터를 읽어오는 구체적인 방법과 실제 데이터를 저장할 위치를 명시한다. 컨트롤 파일의 파라미터는 “5.9. 컨트롤 파일의 옵션 지정”에서 자세히 설명한다.
데이터 파일은 데이터베이스의 테이블에 저장할 데이터가 들어있는 텍스트 파일이다. 데이터 파일은 tbSQL 의 SPOOL 명령어를 이용하여 SQL 질의 결과를 저장하거나 일반 텍스트 편집기로 직접 작성한다.
사용자가 지정한 데이터 파일은 고정된 레코드 형태(Fixed Record Format), 분리된 레코드 형태(Separated Record Format)의 두 가지 형식으로 저장된다.
사용자가 컨트롤 파일에서 모든 컬럼에 대해서 POSITION 정보를 명시하였을 경우 적용되는 형식이다. 이 타입은 필드 사이에 구분자가 없는 대신 사용자가 명시한 컬럼의 위치에서 실제 데이터 값을 읽어 들인다. 단, 컬럼의 위치는 Byte의 길이에 의해 결정된다. 분리된 레코드 형태에 비해 유연성(flexibility)이 부족하지만 성능 면에서는 우수하다.
사용자는 레코드를 구분하기 위해서 고정된 길이의 레코드 사이즈를 명시하거나 시스템의 라인 끝(End of Line, 이하 EOL) 문자를 사용한다. 또한 시스템에서는 속도 향상을 위해 컨트롤 파일에 명시한 컬럼의 위치에서 데이터를 바로 읽어 들이므로 ESCAPED BY와 LINE STARTOR 파라미터 값도 무시한다.
따라서 “5.9. 컨트롤 파일의 옵션 지정” 중에 FIELDS 모든 구문과 LINE STARTED BY 구문을 사용할 수 없고, 컬럼의 POSITION 구문을 사용해야 한다.
LINES FIX 구문을 사용한 예제
데이터 파일에 포함된 레코드의 길이가 고정된 길이(Byte 수)를 가질 때 사용하는 방식이다. 사용자는 컨트롤 파일에 LINES FIX 12와 같이 레코드의 사이즈를 명시해야 한다. 만약 LINES TERMINATED BY 구문이 사용되었다면 무시된다.
다음은 고정된 길이의 레코드인 경우의 예이다.
example.ctl: LOAD DATA INFILE 'example.dat' LOGFILE 'example.log' BADFILE 'example.bad' APPEND INTO TABLE EMP LINES FIX 12 ( empno position (01:04), ename position (06:12) ) example.dat: 7922 MILLER 7777 KKS 7839 KING 7934 MILLER 7566 JONES
LINES FIX 구문을 사용하지 않은 예제
사용자가 컨트롤 파일에 라인 사이즈를 명시하지 않은 경우 EOL 문자('\n')를 사용하여 라인을 구분한다. 다음은 라인 구분자가 EOL 문자인 경우의 예이다.
example.ctl: LOAD DATA INFILE 'example.dat' LOGFILE 'example.log' BADFILE 'example.bad' APPEND INTO TABLE EMP TRAILING NULLCOLS ( empno position (01:04), ename position (06:15), job position (17:25), mgr position (27:30), sal position (32:39) )
example.dat: 7922 MILLER CLERK 7782 920.00 7777 KKS CHAIRMAN 7839 KING PRESIDENT 5500.0 7934 MILLER CLERK 7782 920.00 7566 JONES MANAGER 7839 3123.75 7658 CHAN ANALYST 7566 3450.00 7654 MARTIN SALESMAN 7698 1312.50
example.dat 데이터 파일의 두 번째 라인의 경우 마지막 두 컬럼에 해당하는 값이 없기 때문에 “5.9.17. TRAILING NULLCOLS 구문”이 없다면 오류가 발생한다.
사용자가 컨트롤 파일에서 모든 컬럼에 대해서 POSITION 정보를 명시하지 않았을 경우 적용되는 형식이다. 각각의 필드는 FIELD TERMINATOR로 구분되고, 각각의 레코드는 LINE TERMINATOR로 구분된다. 고정된 레코드 형태에 비해 성능 면에서는 부족하지만 사용자가 원하는 형태로 형식을 지정할 수 있어서 탁월한 유연성을 지녔다고 할 수 있다.
다음은 분리된 레코드 형태의 예이다.
example.ctl: LOAD DATA INFILE 'example.dat' LOGFILE 'example.log' BADFILE 'example.bad' APPEND INTO TABLE emp FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' ESCAPED BY '\\' LINES TERMINATED BY '\n' ( empno, ename, job, mgr, hiredate, sal, comm, deptno )
example.dat: 7654, "Martin", "Sales",7698,1981/10/28,1312.50,3,10 7782, "\,Clark","Manager" ,7839, 1981/01/11 ,2572.50,10,20 7839, "King",President,,1981/11/17,5500.00,,10 7934,"Miller","Clerk",7782 ,1977/10/12,920.00,,10 7566, "Jones",Manager" ,7839, 1981/04/02,3123.75,,20 7658, "Chan", Ana lyst, 7566,1982/05/03,3450,,20
tbLoader 유틸리티의 실행 과정을 기록한 파일이다. 사용자에게 입력할 컬럼의 기본적인 메타 데이터와 함께 실제 입력에 성공한 레코드, 실패한 레코드에 대한 통계가 제공된다. 또한 실패한 레코드에 대해서는 tbLoader 유틸리티가 판단한 실패의 이유가 제공된다.
tbLoader 유틸리티에서 데이터를 로드하는 방식은 다음과 같이 두 가지가 있다.
tbLoader 유틸리티에서 기본적으로 제공하는 데이터 로드 방법이다. 사용자가 지정한 데이터 파일을 읽어가며 컬럼 데이터를 읽어 컬럼 배열에 담고 일괄 처리(BATCH UPDATE) 방식으로 데이터를 데이터베이스 서버에 로드한다. Direct Path Load에 비해 성능이 약간 떨어지나, 별도의 제약 사항이 없다는 장점이 있다.
사용자가 지정한 데이터 파일을 읽어가며, 특정 컬럼의 데이터 타입에 맞게 데이터를 컬럼 배열(column array)형태로 만든다. 컬럼 배열 형태의 데이터는 블록 형식기(block formatter)을 거쳐서 Tibero의 데이터베이스 블록 형태에 맞게 만들어지고, 이 블록을 직접 Tibero의 데이터베이스에 쓰게 된다.
Direct Path Load는 Conventional Path Load에 비해 훨씬 빠르다는 장점을 가지고 있으나, 다음과 같은 제약 사항이 있다.
CHECK 제약조건과 참조 키 제약조건(Referential Constraint)을 검사하지 않는다.
기본 키 제약조건(Primary Key Constraint), 유일 키 제약조건(Unique Key Constraint), NOT NULL 제약조건은 검사한다.
로딩 중에 입력 트리거(Insert trigger)가 작동하지 않는다.
본 절에서는 tbLoader 유틸리티의 제약조건을 설명한다.
FIELD TERMINATED BY, ENCLOSED BY, ESCAPED BY, LINE TERMINATED BY 옵션 값에 대해 어느 하나라도 같은 값으로 지정된다면 데이터 파일로부터 정상적으로 읽을 수 없다.
예를 들어 다음과 같이 FIELD TERMINATED BY와 ENCLOSED BY 옵션 값을 같게 지정하면 에러가 발생한다.
FIELDS TERMINATED BY '"' OPTIONALLY ENCLOSED BY '"'
만약 다음과 같이 ENCLOSED BY, FIELDS TERMINATED BY, LINES TERMINATED BY로 지정된 문자가 데이터 파일의 입력 필드 값으로 사용된 경우 ESCAPED BY를 지정하지 않으면 제대로 해석하지 못한다. 자세한 사항은 “5.9.13. FIELDS 구문의 ESCAPED BY 구문”을 참고한다.
example.ctl:
FIELDS TERMINATED BY ','
(ID, NAME)
example.dat:
7654,Martin, Kim
load하려는 대상 테이블의 owner와 수행 user가 다른 경우 DPL 모드에서는 수행하려는 user에게 LOCK ANY TABLE 권한이 있어야 한다. 이는 DPL 방식의 빠른 속도를 보장하기 위해 작업 시작 전에 table lock을 잡아주어 다른 세션이 해당 테이블에 DML을 할 수 없게 하는 서버의 정책이다.
"grant lock any table to 수행 user;" 구문으로 권한 부여를 할 수 있다. 권한이 없을 경우에는 "-17004: Permission denied" 에러가 발생한다.
본 절에서는 tbLoader 유틸리티에서 공백(Whitespace)을 처리하는 방법에 대해 설명한다.
한 개의 레코드의 컬럼 값에 해당하는 입력 파일의 필드 값이 공백으로만 이루어져 있을 때 tbLoader 유틸리티는 입력 테이블의 컬럼의 데이터 타입에 따라 0 또는 NULL 값을 로딩한다.
tbLoader 유틸리티는 빈 문자(' '), 탭 문자('\t') 및 EOL 문자('\n')를 공백으로 취급한다. 단, 해당 문자가 FIELD TERMINATED BY 구문이나 LINE TERMINATED BY 구문으로 선언되어 있는 경우는 공백으로 취급하지 않는다. 공백은 필드의 시작과 끝에 존재할 수 있다. 단, 필드의 중간에 존재하는 공백은 데이터의 한 부분으로 취급한다.
tbLoader 유틸리티는 공백에 대해서 데이터 파일의 형태에 따라서 다르게 취급한다.
필드 값의 앞에 존재하는 공백은 실제 데이터로 취급하고, 뒤에 따르는 공백은 필요 없는 공백으로 간주하여 잘라낸다. 사용자가 필드 값의 앞에 존재하는 공백은 임의로 제거할 수 있지만, 뒤에 따르는 공백은 위치를 조정하기 위해 부가적으로 삽입하는 경우가 많기 때문이다.
다음과 같이 사용자가 필드 값의 앞과 뒤에 공백을 둔 경우 뒤쪽의 공백은 잘라낸다.
" aaa \t" -> " aaa"
필드 값의 앞과 뒤에 존재하는 공백을 모두 필요 없는 것으로 간주하여 잘라낸다. 단, 사용자가 필드 값의 앞과 뒤에 공백을 삽입하고 싶다면, ENCLOSED BY 문자열로 감싸준 후에 공백을 삽입하면 공백은 필드의 데이터로 인식된다.
다음과 같이 사용자가 필드 값의 앞과 뒤에 공백을 둔 경우 앞과 뒤의 공백을 모두 잘라낸다.
" aaa \t" -> "aaa"
tbLoader 유틸리티는 앞에서 언급한 방식으로 데이터를 잘라내지만, “5.9.7. PRESERVE BLANKS 구문”을 사용하여 필드의 앞과 뒤에 존재하는 공백을 강제로 데이터 값으로 입력할 수 있다.
본 절에서는 명령 프롬프트에서 지정할 수 있는 tbLoader 유틸리티의 파라미터를 설명한다.
tbLoader 유틸리티를 실행할 때 파라미터를 지정하지 않으면, 다음과 같이 명령 프롬프트에서 지정할 수 있는 파라미터의 목록과 사용 방법이 나타난다.
$ tbloader tbLoader 6 TmaxData Corporation Copyright (c) 2008-. All rights reserved. Usage: tbloader [options] [controls] Options: -h|--help Display the more detailed information. -c|--charset Display usable character sets in this version. -v|--version Display the version information. Controls: userid Username/password@dbname control The name of the control file data The name of the data file log The name of the log file bad The name of the bad file skip The count of line to skip in data file (Default: 0) errors The count of error to allow (Default: 50) rows The count of row for each commit (Default: commit after the end) message The count of records to process to print out (Default: 0) readsize The size of buffer to read from the data file (Default: 65536) disable_idx Whether to disable indexes before loading (Default: N) direct Whether to use the Direct Path Loading (Default: N) dpl_log Whether to log about the Direct Path Loading (Default: N) dpl_parallel Whether to use Parallel Direct Path Loading (Default: N) multithread Whether to use multi-thread for Direct Path Loading (Default: Y) bindsize The size of buffer to read in the Direct Path Loading (Default: 65536) Example: tbloader userid=userid/passwd@dbname control=sample.ctl bindsize=1000000
사용자는 명령 프롬프트에서 파라미터나 컨트롤 파일에 필요한 메타 데이터를 입력할 수 있다. 단, USERID, CONTROL, DIRECT, MESSAGE, READSIZE, BINDSIZE, ERRORS, ROWS 파라미터는 명령 프롬프트에서만 지정할 수 있다.
Options의 -c는 하위 호환성을 위하여 현재 client 버전에서 사용 가능한 character sets 정보를 보여준다.
다음은 명령 프롬프트에서 지정할 수 있는 tbLoader 유틸리티의 파라미터의 예이다.
[예 5.2] 명령 프롬프트에서 지정할 수 있는 tbLoader 유틸리티의 파라미터
userid=userid/passwd@dbname control=/home/test/control.ctl control=../control.ctl log=/home/test/control.log log=../control.log data=/home/test/data.dat data=../data.dat bad=/home/test/data.bad bad=../data.bad skip=1 direct=Y dpl_log=Y message=10000 readsize=65536 bindsize=65536 errors=100 rows=100 multithread=N dpl_parallel=Y
항목 | 설명 |
---|---|
userid | Tibero의 데이터베이스 사용자명과 패스워드 및 데이터베이스명을 다음의 형식으로 지정한다. userid=userid/passwd@databasename |
control | 파라미터 정보를 포함하는 컨트롤 파일의 경로와 이름을 지정하는 파라미터이다. 절대 경로와 현재 디렉터리에 대한 상대 경로 방식을 모두 사용할 수 있다. |
data | 실제 데이터를 포함하고 있는 텍스트 파일의 경로와 이름을 지정하는 파라미터이다. 절대 경로와 현재 디렉터리에 대한 상대 경로 방식을 모두 사용할 수 있다. 사용자가 명령 프롬프트와 컨트롤 파일에서 모두 경로를 지정하였다면, 명령 프롬프트에서 지정한 값을 우선시한다. |
log | 데이터 로딩 과정에서 발생하는 로그를 기록할 파일의 경로와 이름을 지정하는 파라미터이다. (기본값: 컨트롤 파일명.log) 절대 경로와 현재 디렉터리에 대한 상대 경로 방식을 모두 사용할 수 있다. 사용자가 명령 프롬프트와 컨트롤 파일에서 모두 경로를 지정하였다면, 명령 프롬프트에서 지정한 값을 우선시한다. |
bad | 데이터 로딩에 실패한 레코드를 기록할 파일에 대한 경로와 이름을 지정하는 파라미터이다. (기본값: 데이터 파일명.bad) 절대 경로와 현재 디렉터리에 대한 상대 경로 방식을 모두 사용할 수 있다. 사용자가 명령 프롬프트와 컨트롤 파일에서 모두 경로를 지정하였다면, 명령 프롬프트에서 지정한 값을 우선시한다. |
skip | 데이터 파일의 처음부터 지정한 수만큼의 라인을 로드의 대상에서 제외하는 파라미터이다. (기본값: 0) 컨트롤 파일의 옵션 중 “5.9.18. IGNORE LINES 구문”과 같은 기능을 한다. |
errors | 데이터를 업로드할 때 최대로 허용할 에러의 개수를 지정하는 파라미터이다. (기본값: 50) tbLoader 유틸리티는 사용자가 지정한 에러의 개수를 넘지 않는 범위 내에서 데이터를 업로드한다. 만약, 지정한 개수를 만날 경우 데이터의 업로드를 중지한다.
|
rows | 사용자가 대용량 데이터를 업로드할 때 커밋을 수행할 레코드 개수를 지정하는 파라미터이다. 단, tbLoader는 성능을 고려하여 지정한 레코드의 개수를 정확히 맞추어서 서버로 데이터를 보내지는 않는다. |
message | tbLoader 유틸리티가 현재 처리하고 있는 논리적인 레코드의 개수를 화면에 출력하는 파라미터이다. 별도로 명시하지 않을 경우 화면에 진행 상황을 출력하지 않는다. 단, 너무 작은 값을 명시할 경우 성능에 영향을 미칠 수 있다. |
readsize | tbLoader는 데이터 파일의 내용을 버퍼링을 사용하여 읽어들인다. 이때 사용하는 읽기 전용 버퍼 크기(READ BUFFER SIZE)를 지정하는 파라미터이다. (단위: Byte, 기본값: 65536(64KB), 최댓값: 2,097,152(2MB)) |
disable_idx | 데이터를 로딩하기 전 테이블에 정의된 모든 인덱스를 비활성화할지를 지정하는 파라미터이다.
|
direct | 사용자가 데이터를 로드할 때 Conventional Path Load 또는 Direct Path Load 방법 중 하나를 지정하는 파라미터이다.
|
dpl_log | Direct Path Load 방법으로 데이터를 로드할 때 서버의 로그 파일에 로그를 남길지를 지정하는 파라미터이다.
|
dpl_parallel | Direct Path Load 방법으로 데이터를 로드할 때 Parallel Loading으로 전송할지를 지정하는 파라미터이다.
|
multithread | Direct Path Load 방법으로 데이터를 로드할 때 멀티 스레드를 사용할지를 지정하는 파라미터이다. tbLoader 유틸리티는 두 개의 스레드를 사용하여, 하나의 스레드는 사용자의 데이터 파일로부터 데이터를 읽어 들여 Direct Path Load를 위한 스트림 버퍼에 적재하고, 나머지 스레드는 적재된 스트림 버퍼를 서버로 로딩한다. 여러 개의 CPU를 가진 머신이나 클라이언트와 서버가 다른 머신에 존재하는 경우에 성능 향상을 기대할 수 있다.
|
bindsize | Direct Path Load 방법으로 데이터를 로드할 때 클라이언트에서 사용하는 Direct Path Stream의 크기를 지정하는 파라미터이다. Tibero 클라이언트는 데이터가 지정한 크기만큼 바인딩이 되기 전까지는 서버로 업로드가 되지 않는다. 따라서, 대용량의 데이터를 업로드할 때 효율적으로 사용할 수 있다. (단위: Byte, 기본값: 65536(64KB), 최댓값: 10,485,760(10MB)) |
본 절에서는 tbLoader 유틸리티를 통해서 추가된 고급 기능에 대해 설명한다.
Direct Path Load 방식으로 전송하면 대상이 되는 테이블에 Lock이 걸리므로 동시에 같은 테이블에 DPL로 로딩할 수 없다. 이를 개선한 방법이 Parallel DPL이다.
Parallel DPL을 사용하면 load하는 데이터에 Parallel DPL flag가 설정되며, 서버는 병렬적으로 데이터를 받아 merge 작업을 수행한 후 저장한다. Parallel DPL을 사용하기 위해서는 tbloader 에서 dpl, dpl_parallel을 'Y'로 설정해주어야 한다.
다음은 Parallel DPL을 사용하는 예이다.
[예 5.3] Parallel DPL을 사용하여 tbLoader 실행 예
$ tbloader userid=db_user/db_password@default
control=sample.ctl data=sample.data direct=Y dpl_parallel=Y
tbLoader 유틸리티는 데이터베이스 접속 정보(connect_string)를 암호화 파일(wallet)을 이용하여 사용하는 기능을 제공한다. 기능을 사용하기 위해서 먼저 다음 암호화 파일 생성을 참고하여 접속 정보를 저장하는 암호화 파일(wallet)을 생성해야 한다.
다음은 파일이 생성된 후 이를 이용하여 접속하는 예이다.
[예 5.4] 암호화 파일(wallet)을 사용하여 tbLoader 실행 예
$ export LR_WALLET_PATH=./wallet_file.dat $ tbloader control=sample.ctl data=sample.data
이 기능은 현재 UNIX 계열에서만 지원하며, Open SSL을 설치해야 사용 가능하다.
본 절에서는 컨트롤 파일의 옵션을 지정하는 방법에 대해 설명한다.
사용자는 컨트롤 파일에서 다음의 정보를 지정할 수 있다.
데이터 파일에 포함된 문자 집합
데이터를 포함하는 데이터 파일
로드 수행 중에 발생한 로그를 기록할 로그 파일
로드에 실패한 데이터를 기록하는 오류 파일
오류 파일에 남기지 않을 에러 번호 지정
테이블에 존재하는 기존 데이터에 대한 처리 방법(APPEND|REPLACE|TRUNCATE|MERGE)
필드 종료자 및 기타 옵션(TERMINATOR, ENCLOSED BY STRING, ESCAPED BY STRING)
라인의 시작 문자열과 종료 문자열
데이터 파일에서 무시할 라인의 개수
테이블의 특정 컬럼에 대한 옵션
컨트롤 파일의 형식은 다음과 같다. 단, 컨트롤 파일에서 정한 아래 형식의 순서대로 사용해야 하며 대괄호([ ])에 포함된 내용은 생략할 수 있다.
LOAD DATA [CHARACTERSET characterset_name] [INFILE data_file_name] [LOGFILE log_file_name] [BADFILE bad_file_name] [SKIP_ERRORS error_number, ...] [APPEND|REPLACE|TRUNCATE|MERGE(column_name, .....)] [PRESERVE BLANKS] INTO TABLE table_name [WHEN filter_expression [AND filter_expression...]] [MULTI INSERT INDEXES|FAST BUILD INDEXES] [FIELDS [TERMINATED BY field_terminator] [OPTIONALLY ENCLOSED BY enclosed_by_start_string [AND enclosed_by_end_string]] [ESCAPED BY escaped_by_string]] [LINES [FIX number] [STARTED BY line_start_string] [TERMINATED BY line_terminator_string]] [TRAILING NULLCOLS] [IGNORE number LINES] (column_name [FILLER] [POSITION(from:to)] [INTEGER EXTERNAL(size) | FLOAT EXTERNAL(size) | DOUBLE EXTERNAL(size) | CHAR(size) | RAW(size) | DATE(size) date_fmt_string | TIMESTAMP(size) timestamp_fmt_string | TIME(size) time_fmt_string] [OUTFILE] [CONSTANT constant_value] [NULL TERMINATED] [PRESERVE BLANKS] [sql_expression], ..........) -- This line is comment.
다양한 문자 집합의 데이터를 Tibero 서버에 로드할 수 있다. 지정된 값은 컨트롤 파일과 데이터 파일의 문자 집합에 영향을 준다. 지정하지 않을 경우 클라이언트의 문자 집합인 환경변수 또는 dsn 파일의 TB_NLS_LANG 값이 데이터 파일의 기본 문자 집합으로 지정된다.
문자 집합을 지정하는 세부 내용은 다음과 같다.
문법
CHARACTERSET characterset_name
파라미터 | 설명 |
---|---|
characterset_name | TB_NLS_LANG으로 사용할 수 있는 문자 집합들 중 하나를 지정한다. (기본값: 환경변수 또는 dsn 파일의 TB_NLS_LANG 값) |
예제
현재 클라이언트의 문자 집합이 KSC5601(TB_NLS_LANG =EUCKR)인데 MSWIN949 데이터 파일을 서버에 로드하려는 경우 다음과 같이 컨트롤 파일에 지정한다.
CHARACTERSET MSWIN949
실제 데이터를 포함하고 있는 텍스트 파일인 데이터 파일의 경로와 이름을 지정한다. 사용자는 절대 경로와 현재 디렉터리에 대한 상대 경로 방식을 모두 사용할 수 있다.
사용자가 명령 프롬프트와 컨트롤 파일에서 모두 경로를 지정하였다면, 명령 프롬프트에서 지정한 값이 우선시 된다.
데이터 파일을 지정하는 세부 내용은 다음과 같다.
문법
INFILE data_file_name
파라미터 | 설명 |
---|---|
data_file_name | 데이터 파일의 경로와 이름을 지정한다. |
예제
INFILE '/home/test/data.dat' INFILE '../data.dat'
데이터 로딩 과정에서 발생하는 로그를 기록할 로그 파일의 경로와 이름을 지정한다. 사용자는 절대 경로와 현재 디렉터리에 대한 상대 경로 방식을 모두 사용할 수 있다.
사용자가 명령 프롬프트와 컨트롤 파일에서 모두 경로를 지정하였다면, 명령 프롬프트에서 지정한 값이 우선시 된다.
로그 파일을 지정하는 세부 내용은 다음과 같다.
문법
LOGFILE log_file_name
파라미터 | 설명 |
---|---|
log_file_name | 로그 파일의 경로와 이름을 지정한다. (기본값: 컨트롤 파일명.log) |
예제
LOGFILE '/home/test/control.log' LOGFILE '../control.log'
데이터 로딩에 실패한 레코드를 기록할 오류 파일의 경로와 이름을 지정한다. 사용자는 절대 경로와 현재 디렉터리에 대한 상대 경로 방식을 모두 사용할 수 있다.
사용자가 명령 프롬프트와 컨트롤 파일에서 모두 경로를 지정하였다면, 명령 프롬프트에서 지정한 값이 우선시 된다.
만약 DPL로 로딩할 때 서버에서 에러가 발생했을 경우 실패한 레코드를 기록하지 않는다. 이는 성능이 고려되어야 하는 DPL 방식상 실패한 row에 대해서 알기 어렵기 때문이다.
오류 파일을 지정하는 세부 내용은 다음과 같다.
문법
BADFILE bad_file_name
파라미터 | 설명 |
---|---|
bad_file_name | 오류 파일의 경로와 이름을 지정한다. (기본값: 데이터 파일명.bad) |
예제
BADFILE '/home/test/data.bad' BADFILE '../data.bad'
명시된 에러 번호에 대하여 오류 파일에 남기지 않도록 지정할 수 있다.
에러 번호를 지정하는 세부 내용은 다음과 같다.
문법
SKIP_ERRORS error_number, ...
파라미터 | 설명 |
---|---|
error_number | 오류 파일에 남기지 않을 에러 번호를 지정한다. |
예제
SKIP_ERRORS -10007 SKIP_ERRORS -10007, -10005
사용자가 지정한 테이블에 기존에 데이터가 존재할 경우 그 데이터를 처리하는 방법을 지정할 수 있다.
REPLACE와 TRUNCATE 옵션의 경우 테이블의 레코드가 삭제된 후에 자동 커밋되므로 tbLoader 유틸리티가 수행된 이후에 기존의 데이터를 복구할 수 없다.
기존 데이터의 처리 방법을 지정하는 세부 내용은 다음과 같다.
문법
APPEND|REPLACE|TRUNCATE|MERGE(column_name, .....)
파라미터 | 설명 |
---|---|
APPEND | 기존 데이터를 보존하면서 새로운 데이터를 추가한다. (기본값) |
REPLACE | DELETE 명령으로 기존의 데이터를 삭제하고 새로운 데이터를 추가한다. 사용자는 DELETE에 대한 권한을 가지고 있어야 한다. DELETE에 대한 트리거가 존재하는 경우 해당 트리거가 수행된다. 단, 해당 테이블에 참조 무결성 제약조건이 있는 경우 조건을 불능화한 후에 DELETE 옵션을 사용해야 한다. |
TRUNCATE | TRUNCATE 명령으로 기존의 데이터를 삭제하고 새로운 데이터를 추가한다. 단, 해당 테이블에 참조 무결성 제약조건이 있는 경우 조건을 불능화한 후에 TRUNCATE 옵션을 사용해야 한다. |
MERGE(column_name, .....) | MERGE할 컬럼의 리스트를 명시한다. 유틸리티는 사용자가 지정한 컬럼의 리스트를 키 값으로 사용한다. 새로운 데이터가 기존의 데이터와 키 값이 같은 경우 기존의 데이터를 새로운 데이터 값으로 UPDATE하고, 그렇지 않으면 해당 데이터를 입력한다. |
예제
control.ctl: LOAD DATA ... REPLACE ... (...)
control.ctl: LOAD DATA ... MERGE(EMPNO, EMPNM) ... (...)
필드의 데이터에 포함된 공백을 잘라내지 않고 그대로 데이터베이스에 입력할 때 사용한다.
예제
control.ctl: LOAD DATA ... PRESERVE BLANKS ... (...)
데이터 파일의 내용을 입력하고자 하는 대상 테이블의 이름을 지정한다.
테이블을 지정하는 세부 내용은 다음과 같다.
문법
INTO TABLE table_name
파라미터 | 설명 |
---|---|
table_name | 대상 테이블의 이름을 지정한다. 이때 테이블 이름으로 PUBLIC synonym 지정이 가능하다. |
예제
control.ctl: LOAD DATA ... INTO TABLE EMP ... (...)
로딩할 데이터 파일의 필드 값에 대한 조건을 지정한다.
조건을 지정하는 세부 내용은 다음과 같다.
문법
WHEN filter_expression [AND filter_expression...] filter_expression: {column_name|'(' column_pos ')'} operator value_string
파라미터 | 설명 |
---|---|
column_name | 비교할 컬럼 이름을 지정한다. |
column_pos | 비교할 컬럼 번호를 지정한다. 1부터 시작하며, 괄호로 감싸야 한다. |
operator | 비교 연산자를 지정한다. 등호(=)나 부등호(!=, <>)를 사용할 수 있다. |
value_string | 비교할 값을 지정한다. 홑따옴표 문자열만 사용할 수 있다. |
예제
control.ctl: LOAD DATA ... INTO TABLE EMP WHEN C1 = '1' ... (...)
Direct Path Load 방식으로 대상 테이블에 데이터를 로드할 때 테이블에 존재하는 인덱스의 생성 방법을 지정한다. MULTI INSERT 방식과 FAST BUILD 방식 중에 하나를 선택할 수 있다.
tbLoader 유틸리티를 사용하기 전에 대상 테이블에 기존 데이터가 많으면 MULTI INSERT 방식으로 인덱스를 생성하는 것이 유리하고, 그 외에는 FAST BUILD 방식이 유리하다. 단, tbLoader 유틸리티를 사용하여 DPL할 때 데이터 중복 등의 문제로 인해서 인덱스가 Unusable 상태로 변경될 수 있다.
인덱스 생성 방법을 지정하는 세부 내용은 다음과 같다.
문법
[MULTI INSERT INDEXES|FAST BUILD INDEXES]
파라미터 | 설명 |
---|---|
MULTI INSERT INDEXES | MULTI INSERT 방식으로 인덱스를 생성한다. |
FAST BUILD INDEXES | FAST BUILD 방식으로 인덱스를 생성한다. |
예제
control.ctl: LOAD DATA ... MULTI INSERT INDEXES ... (...)
데이터 파일로부터 레코드를 읽어 올 때 FIELD TERMINATED BY로 지정된 문자를 발견할 때까지 읽어서 하나의 필드로 취급한다.
필드 종료자를 지정하는 세부 내용은 다음과 같다.
문법
FIELDS TERMINATED BY field_terminator
파라미터 | 설명 |
---|---|
field_terminator | ASCII 문자열로 지정한다. |
예제
control.ctl: LOAD DATA ... FIELDS TERMINATED BY ',' ... (...)
데이터 파일로부터 레코드를 읽어 올 때 필드의 값의 시작과 끝을 감쌀 문자열을 지정한다.
필드의 값에 빈 문자(' ', '\t', '\r', '\n')나 필드 종료자, 라인 종료자와 같은 메타 문자열을 포함하고 있는 경우 tbLoader 유틸리티는 해당 문자열을 데이터 값으로 인식한다. 단, ESCAPED BY 문자열은 ENCLOSED BY 문자열에 의해서 감싸져 있어도, 메타 문자열로 인식한다.
주의해야 할 점은 필드의 값이 ENCLOSED BY로 지정된 문자열과 같은 문자열이 포함된 경우 ESCAPED BY로 지정된 문자열이 접두사로 사용되어야 필드의 값으로 해석된다. 만약 ESCAPED BY로 지정된 문자열이 접두사로 사용되지 않았을 경우 해당 문자열은 ENCLOSED BY 문자로 해석되어 필드 값의 나머지 부분을 인식하지 못한다.
ENCLOSED BY 문자열을 지정하는 세부 내용은 다음과 같다.
문법
FIELDS OPTIONALLY ENCLOSED BY enclosed_by_start_string
파라미터 | 설명 |
---|---|
enclosed_by_start_string | ASCII 문자열로 지정한다. |
예제
필드를 감쌀 시작 문자열과 종료 문자열이 같을 경우 다음과 같은 형식으로 지정한다.
control.ctl: LOAD DATA ... FIELDS OPTIONALLY ENCLOSED BY '"' ... (...)
필드를 감쌀 시작 문자열과 종료 문자열이 다를 경우 다음과 같은 형식으로 지정한다.
control.ctl: LOAD DATA ... FIELDS OPTIONALLY ENCLOSED BY '{$' AND '$}' ... (...)
마지막으로, 아래와 같이 파라미터 값이 지정된 경우 다음과 같은 형식으로 지정한다.
control.ctl: LOAD DATA ... FIELDS OPTIONALLY ENCLOSED BY '"' ESCAPED BY '\\' ... (...)
필드의 값으로 ENCLOSED BY로 지정된 문자열과 같은 문자열이 포함되는 경우 ESCAPED BY로 지정된 문자열이 접두사로 사용되지 않으면 필드의 값을 정확하게 인식하지 못한다.
”quotation mark[\”]”,0001→(quotation mark["],0001) ”quotation mark[”]”,0001→오류 발생
ESCAPED BY로 지정된 문자열을 만나면 뒤따르는 문자의 의미를 확장시켜서 특수문자 또는 문자열을 읽을 수 있다. 주의해야 할 점은 '\'를 지정하기 위해서는 2개의 '\\'를 사용해야 한다.
ESCAPED BY 문자열을 지정하는 세부 내용은 다음과 같다.
문법
ESCAPED BY escaped_by_string
파라미터 | 설명 |
---|---|
escaped_by_string | ASCII 문자열로 지정한다. |
예제
ESCAPED BY '\\' ESCAPED BY '$$!'
데이터 파일에서 한 라인의 길이를 지정할 수 있다. FIELDS 구문과 LINE TERMINATED BY, LINE STARTED BY 구문을 사용할 수 없다.
한 라인 길이를 지정하는 세부 내용은 다음과 같다.
문법
LINES FIX number
파라미터 | 설명 |
---|---|
number | 정수 값으로 지정한다. (단위: Byte) |
예제
control.ctl: LOAD DATA ... LINES FIX 5 ... (...)
위와 같이 파라미터를 지정하고, 아래의 내용이 저장된 데이터 파일을 읽는다고 가정해보자.
data.dat: abcdefghijklmnopqrst
tbLoader 유틸리티는 위의 데이터 파일을 읽어서 다음과 같이 해석한다.
LINE #1: abcde LINE #2: fghij LINE #3: klmno LINE #4: pqrst
데이터 파일로부터 라인 단위로 읽으면서 지정한 접두사 이후에 뒤따르는 데이터에 대해서만 로드의 대상으로 취급한다. 만약 접두사를 포함하지 않는 라인을 만나게 되면, 해당 라인 전체가 로드의 대상에서 제외된다. 단, 접두사는 성능향상을 위하여 동일한 문자를 반복해서 사용한다.
라인 시작 문자열을 지정하는 세부 내용은 다음과 같다.
문법
LINES STARTED BY line_start_string
파라미터 | 설명 |
---|---|
line_start_string | ASCII 문자열로 지정(최대 30Byte)한다. |
예제
control.ctl: LOAD DATA ... LINES STARTED BY '$$$' ... (...)
위와 같이 파라미터를 지정하고, 아래의 내용이 저장된 데이터 파일을 읽는다고 가정해보자.
data.dat: $$$0001,”SMITH” … something … $$$0002,”DAVID”
tbLoader 유틸리티는 위의 데이터 파일을 읽어서 다음과 같이 해석한다.
(0001, “SMITH”), (0002, “DAVID”)
데이터 파일로부터 데이터를 읽어 올 때 LINE TERMINATED BY 구문으로 지정된 문자열을 발견하면 하나의 레코드가 완성된 것으로 취급한다.
라인 종료 문자열을 지정하는 세부 내용은 다음과 같다.
문법
LINES TERMINATED BY line_terminator_string
파라미터 | 설명 |
---|---|
line_terminator_string | ASCII 문자열로 지정한다. (기본값: '\n') |
예제
다음은 LINE TERMINATOR 문자열을 2개의 ASCII 문자로 구성된 '|\n'으로 지정하는 예이다.
control.ctl: LOAD DATA ... LINES TERMINATED BY '|\n' ... (...)
Windows에서 작성된 데이타 파일일 경우에는 '|\r\n'과 같이 입력해야 한다.
데이터 파일의 레코드에 없는 마지막 컬럼의 데이터를 NULL로 취급한다. 만약 이 절을 추가하지 않으면, 레코드에 없는 NULL 컬럼의 데이터를 에러로 본다.
TRAILING NULLCOLS 구문의 세부 내용은 다음과 같다.
문법
TRAILING NULLCOLS
예제
다음은 첫 번째 레코드의 job 컬럼의 값이 NULL로 설정되는 예이다.
control.ctl: LOAD DATA ... TRAILING NULLCOLS ... ( id, name, job )
data.dat: 10 SMITH
데이터 파일의 처음부터 시작하여 지정한 수만큼의 라인을 로딩 대상에서 제외한다.
로딩 대상을 지정하는 세부 내용은 다음과 같다.
문법
IGNORE number LINES
파라미터 | 설명 |
---|---|
number | 정수 값으로 지정한다. (기본값: 0) |
예제
데이터 파일의 첫 번째 라인이 컬럼의 이름을 나타낼 경우 다음과 같이 파라미터를 지정하여 첫 번째 라인만 제외한다.
control.ctl: LOAD DATA ... IGNORE 1 LINES ... (...)
사용자가 데이터를 입력할 테이블의 컬럼 리스트를 명시한다. 단, 데이터 파일의 컬럼 순서와 동일하게 작성해야 한다.
컬럼의 속성은 각 절에서 설명한다.
대상 컬럼과 속성을 지정하는 세부 내용은 다음과 같다.
문법
(column_name [FILLER] [POSITION(from:to)] [INTEGER EXTERNAL(size) | FLOAT EXTERNAL(size) | DOUBLE EXTERNAL(size) | CHAR(size) | RAW(size) | DATE(size) date_fmt_string | TIMESTAMP(size) timestamp_fmt_string | TIME(size) time_fmt_string] [OUTFILE] [CONSTANT constant_value] [NULL TERMINATED] [PRESERVE BLANKS] [sql_expression], ..........)
파라미터 | 설명 |
---|---|
column_name | 대상 테이블의 컬럼 이름을 명시한다. |
데이터 파일에서 제외시킬 데이터에 해당하는 컬럼을 지정한다.
컬럼의 FILLER 구문의 세부 내용은 다음과 같다.
문법
FILLER
예제
고정된 레코드 형태인 경우 기존 문법 앞에 FILLER를 명시한다.
control.ctl: LOAD DATA ... ( empno position (01:04), ename position (06:15), job filler position (17:25), mgr position (27:30), sal position (32:39), comm position (41:48), deptno position (50:51) )
분리된 레코드 형태인 경우 컬럼 이름 뒤에 FILLER를 명시한다.
control.ctl: LOAD DATA ... ( empno, ename, job filler, mgr, sal, comm, deptno )
데이터 파일의 한 라인에서 해당 컬럼에 해당하는 값의 시작 위치와 마지막 위치를 지정한다.
POSITION 구문에서 지정하는 세부 내용은 다음과 같다.
문법
POSITION(from:to)
파라미터 | 설명 |
---|---|
from | 데이터 파일의 한 라인에서 해당 컬럼의 시작 위치를 지정한다. 라인의 위치는 1부터 시작한다. |
to | 데이터 파일의 한 라인에서 해당 컬럼의 마지막 위치를 지정한다. |
예제
고정된 레코드 형태인 경우 다음과 같이 컬럼의 목록과 함께 정확한 위치를 명시해야 한다.
control.ctl: LOAD DATA ... ( empno position (01:04), ename position (06:15), job position (17:25), mgr position (27:30), sal position (32:39), comm position (41:48), deptno position (50:51) )
분리된 레코드 형태인 경우 POSITION 구문을 반드시 사용할 필요는 없다.
control.ctl: LOAD DATA ... ( empno, ename, job, mgr, sal, comm, deptno )
tbLoader 유틸리티는 특정한 데이터 타입을 제공한다. 데이터 타입별로 기본값이 다르거나 컬럼의 데이터를 다른 방식으로 바인딩한다.
제공하는 데이터 타입은 다음과 같다.
숫자 데이터 타입
문자열 데이터 타입
바이너리 데이터 타입
날짜 데이터 타입
문자열 데이터를 Tibero 서버의 숫자형 컬럼에 로드하기 위해 사용한다. 컬럼에 NULL을 명시하면, tbLoader 유틸리티는 기본값으로 0을 바인딩하여 서버에 로드한다. 이와는 반대로 0이 아닌 NULL로 바인딩하려면, 문자열 데이터 타입을 선언하여 사용하면 된다.
숫자 데이터 타입(NUMERIC EXTERNAL)의 컬럼의 형식을 지정하는 세부 내용은 다음과 같다.
문법
INTEGER EXTERNAL(size)|FLOAT EXTERNAL(size)|DOUBLE EXTERNAL(size)
파라미터 | 설명 |
---|---|
INTEGER EXTERNAL(size) | 문자열 데이터가 정수 형태일 때 사용한다. |
FLOAT EXTERNAL(size) | 문자열 데이터가 실수 형태일 때 사용한다. |
DOUBLE EXTERNAL(size) | 문자열 데이터가 2배 정밀도(double precision) 실수 형태일 때 사용한다. |
size는 “5.9.19.4. 데이터 버퍼 크기”를 지정한다.
문자열 데이터를 Tibero 서버의 문자형(CHAR, VARCHAR, CLOB, NCLOB) 컬럼에 로드하기 위해 사용한다. 컬럼에 NULL을 명시하면, tbLoader 유틸리티는 기본값으로 NULL을 바인딩하여 서버에 로드한다. 이와는 반대로 NULL이 아닌 0으로 바인딩하려면, 숫자형 데이터 타입을 선언하여 사용하면 된다.
문자열 데이터 타입의 컬럼 형식을 지정하는 세부 내용은 다음과 같다.
문법
CHAR(size)
파라미터 | 설명 |
---|---|
CHAR(size) | 문자열 데이터에 사용한다. size는 “5.9.19.4. 데이터 버퍼 크기”를 지정한다. |
바이너리 데이터를 Tibero 서버의 대용량 객체형(RAW, BLOB, LONGRAW) 컬럼에 로드하기 위해 사용한다. 컬럼에 NULL을 명시하면, tbLoader 유틸리티는 기본값으로 NULL을 바인딩하여 서버에 로드한다.
바이너리 데이터 타입의 컬럼 형식을 지정하는 세부 내용은 다음과 같다.
문법
RAW(size)
파라미터 | 설명 |
---|---|
RAW(size) | 바이너리 데이터에 사용한다. size는 “5.9.19.4. 데이터 버퍼 크기”를 지정한다. |
문자열 데이터를 Tibero 서버의 날짜형(DATE, TIME, TIMESTAMP) 컬럼에 로드하기 위해 사용한다. 컬럼에 NULL을 명시하면, tbLoader 유틸리티는 기본값으로 NULL을 바인딩하여 서버에 로드한다.
Tibero의 클라이언트는 TB_NLS_DATE_FORMAT, TB_NLS_TIMESTAMP_FORMAT으로 DATE와 TIMESTAMP 타입의 컬럼 형식을 지정한다. 하지만 사용자가 tbLoader 유틸리티의 컨트롤 파일에서 컬럼별로 DATE, TIMESTAMP, TIME 타입의 컬럼의 형식으로 직접 지정할 수도 있다. 단, 반드시 큰따옴표(" ")로 감싸야 한다.
날짜 데이터 타입의 컬럼 형식을 지정하는 세부 내용은 다음과 같다.
문법
DATE date_fmt_string|TIMESTAMP timestamp_fmt_string|TIME time_fmt_string
파라미터 | 설명 |
---|---|
date_fmt_string | DATE 타입인 컬럼의 형식을 지정한다. |
timestamp_fmt_string | TIMESTAMP 타입인 컬럼의 형식을 지정한다. |
time_fmt_string | TIME 타입인 컬럼의 형식을 지정한다. |
예제
다음의 예는 tbLoader 유틸리티의 컨트롤 파일이다. 본 예제에서는 data.dat 파일 내부에 있는 컬럼 hiredate에 'YYYYMMDD'에 맞는 형식의 날짜를 명시한다.
control.ctl: LOAD DATA ..... INFILE 'data.dat' ..... ( empno, ename, hiredate DATE "YYYYMMDD" )
data.dat: 1111, JOHN, 19981112 2222, TOM, 20070802
tbLoader 유틸리티는 데이터 파일의 데이터를 읽어 데이터 버퍼에 저장하고, 해당 데이터를 Tibero 서버의 데이터 타입으로 변환한 후 로딩한다.
tbLoader 유틸리티는 기본적으로 분리된 레코드 형태의 데이터를 읽기 위해서 데이터베이스 내의 스키마 정보를 이용하여 적정한 크기의 버퍼를 할당한다. 반면에 고정된 레코드 형태의 데이터를 읽기 위해서 POSITION의 시작과 끝의 정보를 이용하여 버퍼를 할당한다.
만약 사용자가 데이터의 길이 정보를 정확히 안다면, 데이터 버퍼의 크기를 명시할 수 있다. 또한 BLOB, CLOB, LONG, LONG RAW와 같은 대용량 데이터를 읽기 위해 원하는 만큼의 데이터 버퍼의 크기(단위: Byte)를 명시할 수 있다.
예제
컨트롤 파일의 형식이 다음과 같다면 empno, hiredate 컬럼에 각각 5bytes, 10bytes의 데이터 버퍼를 할당한다.
control.ctl: LOAD DATA .... ( empno INTEGER EXTERNAL(5), hiredate DATE(10) "YYYY/MM/DD" )
사용자는 BLOB, CLOB, LONG, LONG RAW 타입처럼 대용량 데이터나, RAW와 같은 바이너리 데이터를 읽어 올 때 데이터 파일이 아닌 별도에 파일에서 읽어 올 수 있도록 OUTFILE속성을 지정할 수 있다. 단, 사용자는 데이터 파일에 해당 파일의 경로를 명시해야 한다.
사용자가 OUTFILE 속성을 지정하면, tbLoader 유틸리티는 내부적으로 파일의 데이터를 버퍼링하여 여러 번 서버로 로딩한다. 이와는 반대로 OUTFILE 속성을 지정하지 않으면, tbLoader 유틸리티는 대용량 데이터를 데이터 파일에서 직접 읽어 오고, 이를 위해 기본적으로 32KB의 데이터 버퍼를 할당한다. 따라서 이보다 큰 데이터를 데이터 파일에서 읽고 싶다면 직접 “5.9.19.4. 데이터 버퍼 크기”를 지정하면 된다.
예제
컨트롤 파일의 형식이 다음과 같다면,
control.ctl: LOAD DATA ..... INFILE 'data.dat' ..... ( empno, ename, resume OUTFILE )
data.dat 내부에 resume 컬럼의 위치에 다음과 같이 파일 경로를 입력하면, 해당 파일로부터 데이터를 읽어 들인다.
data.dat 1111, JOHN, ./clobdata.txt 2222, TOM, /home/test/clobdata.txt
CONSTANT 속성을 이용하여 특정 컬럼의 값을 데이터 파일의 값에 상관없이 상수 값으로 지정할 수 있다. 단, 상수 값에 빈 문자열도 포함될 수 있으므로, 반드시 큰따옴표(" ")로감싸야 한다.
예제
컨트롤 파일의 형식이 다음과 같다면 data.dat 파일 내부의 데이터 값에 상관없이 컬럼 empno 값을 숫자 1234로 지정한다.
control.ctl: LOAD DATA ..... INFILE 'data.dat' ..... ( empno constant "1234", ename )
“5.9.7. PRESERVE BLANKS 구문”와 같은 기능을 하지만 컬럼의 속성으로 사용하여 해당 컬럼에만 적용되도록 할 수 있다.
예제
컨트롤 파일의 형식이 다음과 같다면 컬럼 empno에 해당하는 첫 번째 필드의 모든 공백은 데이터 값으로 유지된다.
control.ctl: LOAD DATA ... ( empno PRESERVE BLANKS, ename )
특정 컬럼의 값을 표현하기 위해서 SQL에서 지원하는 표현을 사용할 수 있다. SQL 표현은 반드시 큰따옴표(" ")로 감싸야 한다. SQL 표현 안에서는 콜론(:) 기호와 컬럼 이름을 사용하여 컬럼의 데이터 값을 바인딩할 수 있다.
예제
컨트롤 파일의 형식이 다음과 같다면 컬럼 empno에 TO_CHAR 함수를 이용하여 SYSDATE 값을 'YYYYMMDD' 포맷으로 문자열로 만들어 저장한다. 컬럼 ename에는 데이터 파일의 컬럼 empno 필드 값을 데이터 값으로 바인딩한다.
control.ctl: LOAD DATA ... ( empno "TO_CHAR(SYSDATE, 'YYYYMMDD')", ename ":empno" )
본 절에서는 분리된 레코드 형태, 고정된 레코드 형태, BLOB과 CLOB 타입과 같은 대용량 데이터가 존재 하는 세 가지 경우에 대해 다음과 같은 순서로 데이터를 로드하는 예제를 살펴본다.
테이블을 생성한다(모든 예제에서 공통 사항이다).
컨트롤 파일을 작성한다.
데이터 파일을 작성한다.
tbLoader 유틸리티를 실행한다.
로그 파일과 오류 파일을 확인한다.
다음은 공통으로 사용할 테이블을 생성하는 예이다. 본 예제에서는 데이터베이스 이름을 default라 하고, 테이블의 소유자는 loader/loader_pw라고 가정한다.
CREATE TABLE MEMBER ( ID NUMBER(4) NOT NULL, NAME VARCHAR2(10), JOB VARCHAR2(9), BIRTHDATE DATE, CITY VARCHAR2(10), PICTURE BLOB, AGE NUMBER(3), RESUME CLOB ); CREATE TABLE CLUB ( ID NUMBER(6) NOT NULL, NAME VARCHAR2(10), MASTERID NUMBER(4) );
Conventional Path Load 방법을 이용하여 분리된 레코드 형태의 데이터를 Tibero 서버로 로드한다.
컨트롤 파일인 control.ctl의 내용은 다음과 같다.
LOAD DATA INFILE './data.dat' APPEND INTO TABLE club FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '|\n' IGNORE 1 LINES ( id integer external, name, masterid integer external )
다음은 컨트롤 파일에 지정된 정보이다.
데이터 파일
현재 디렉터리에 위치한 data.dat 파일이다.
로그 파일
사용자가 명령 프롬프트에서 로그 파일명을 명시하지 않는다면, 기본적으로 컨트롤 파일명으로 설정한 control.log 파일을 생성한다.
오류 파일
사용자가 명령 프롬프트에서 오류 파일명을 명시하지 않는다면, 기본적으로 데이터 파일명으로 설정한 data.bad 파일을 생성한다. 단, 오류 레코드가 존재하지 않을 때는 오류 파일을 생성하지 않는다.
대상 테이블
사용자는 club 테이블의 id, name, masterid 컬럼의 데이터를 로드하려고 한다.
FIELDS TERMINATED BY 문자열, FIELDS OPTIONALLY ENCLOSED BY 문자열, FIELDS ESCAPED BY 문자열, LINES TERMINATED BY 문자열
FIELDS TERMINATED BY 문자로써 콤마(,)를 사용하고, FIELDS OPTIONALLY ENCLOSED BY 문자열로써 큰따옴표(" ")를 사용하고, LINES TERMINATED BY 문자열로 '|\n'을 사용한다. FIELDS ESCAPED BY 문자열은 지정하지 않았으므로 기본값으로 '\\'를 사용한다.
로딩 대상
IGNORE LINES 구문이 있기 때문에 데이터 파일의 첫 번째 줄의 레코드는 무시한다.
데이터 파일인 data.dat의 내용은 다음과 같다.
id name masterid| 111111,FC-SNIFER,2345| dkkkkkkkkkk| 111112,"DOCTOR CLUBE ZZANG",2222| 111113,"ARTLOVE",3333| 111114,FINANCE,1235| 111115,"DANCE MANIA",2456| 111116,"MUHANZILZU",2378| 111117,"INT'L",5555
다음과 같이 tbLoader 유틸리티를 실행한다.
tbloader userid=loader/loader_pw@default control=./control.ctl
tbLoader 유틸리티를 실행한 후 생성된 로그 파일과 오류 파일을 확인한다.
tbLoader 유틸리티의 실행 과정을 기록한 로그 파일의 내용은 다음과 같다.
tbLoader 6 TmaxData Corporation Copyright (c) 2008-. All rights reserved. Data File : ./data.dat Bad File : ./data.bad Table 'CLUB' was loaded from the data file. Column Name Position DataType ------------------------------ ---------- ------------ ID 1 NUMERIC EXTERNAL NAME 2 CHARACTER MASTERID 3 NUMERIC EXTERNAL Record 2 was rejected. TBR-80053 : Some relatively positioned columns are not present in the record. Record 3 was rejected. TBR-80025 : Column data exceeds data buffer size. Record 6 was rejected. TBR-80025 : Column data exceeds data buffer size. Table 'CLUB' ---------------- 8 Rows were requested to load. 5 Rows were loaded successfully. 3 Rows were failed to load because of some errors Elapsed time was: 00:00:00.407089
tbLoader 유틸리티가 로드에 실패한 오류 데이터를 기록한 오류 파일은 다음과 같다. 사용자는 오류가 발생한 데이터를 수정하여 Tibero의 데이터베이스에 다시 업로드를 한다.
dkkkkkkkkkk| 111112,"DOCTOR CLUBE ZZANG",2222| 111115,"DANCE MANIA",2456|
Direct Path Load 방법을 이용하여 고정된 레코드 형태의 데이터를 Tibero 서버로 로드하려고 한다.
컨트롤 파일인 control.ctl의 내용은 다음과 같다.
LOAD DATA INFILE '/home/test/data.dat' APPEND INTO TABLE MEMBER ( id position (01:04) integer external, name position (06:15), job position (17:25), birthdate position (27:36), city position (38:47), age position (49:51) integer external )
다음은 컨트롤 파일에 지정된 정보이다.
데이터 파일
/home/test 디렉터리에 위치한 data.dat 파일이다.
로그 파일
사용자가 명령 프롬프트에서 로그 파일명을 명시하지 않는다면, 기본적으로 컨트롤 파일명으로 설정한 control.log인 로그 파일을 생성한다.
오류 파일
사용자가 명령 프롬프트에서 오류 파일명을 명시하지 않는다면, 기본적으로 데이터 파일명으로 설정한 data.bad인 오류 파일을 생성한다. 단, 오류 레코드가 존재하지 않을 때는 오류 파일을 생성하지 않는다.
대상 테이블
사용자는 member 테이블의 id, name, job, birthdate, city, age 컬럼의 데이터를 로드하려고 한다.
FIELDS TERMINATED BY 문자열, FIELDS OPTIONALLY ENCLOSED BY 문자열, FIELDS ESCAPED BY 문자열, LINES TERMINATED BY 문자열
FIELDS TERMINATED BY, FIELDS OPTIONALLY ENCLOSED BY, FIELDS ESCAPED BY 문자열들은 고정된 레코드 형태이기 때문에 사용하지 않는다. LINES FIX 구문을 사용하지 않았기 때문에 LINES TERMINATED BY 문자로 EOL을 사용한다.
로딩 대상
데이터 파일의 첫 번째 라인부터 데이터를 로딩한다.
데이터 파일인 data.dat의 내용은 다음과 같다. tbLoader 유틸리티가 고정된 레코드 형태의 데이터를 입력받기 때문에, 사용자는 정확한 위치에 컬럼의 데이터를 입력해야 한다.
7777 KKS CHAIRMAN 1975-11-18 SEOUL 33 7839 KING PRESIDEN DAEGU 45 7934 MILLER CLERK 1967-01-24 BUSAN 37 7566 JONES MANAGER 7499 ALLEN SALESMAN ddddddddd KYUNG-JU aaaa7654 MARTIN SALESMAN 7648 CHAN ANALYST 1979-10-11 INCHON 28
다음과 같이 tbLoader 유틸리티를 실행한다.
tbloader userid=loader/loader_pw@default control=./control.ctl direct=Y
tbLoader 유틸리티를 실행한 후 생성된 로그 파일과 오류 파일을 확인한다.
tbLoader 유틸리티의 실행 과정을 기록한 로그 파일의 내용은 다음과 같다.
tbLoader 6 TmaxData Corporation Copyright (c) 2008-. All rights reserved. Data File : ./data.dat Bad File : ./data.bad Table 'MEMBER' was loaded from the data file. Column Name Position DataType ------------------------------ ---------- ------------ ID 1 NUMERIC EXTERNAL NAME 2 CHARACTER JOB 3 CHARACTER BIRTHDATE 4 DATE CITY 5 CHARACTER AGE 6 NUMERIC EXTERNAL Record 4 was rejected. TBR-80053 : Some relatively positioned columns are not present in the record. Record 5 was rejected. TBR-80053 : Some relatively positioned columns are not present in the record. Record 6 was rejected. TBR-80053 : Some relatively positioned columns are not present in the record. Table 'MEMBER' ---------------- 7 Rows were requested to load. 4 Rows were loaded successfully. 3 Rows were failed to load because of some errors Elapsed time was: 00:00:00.338089
위의 로그 파일의 내용을 보면, 로드되지 않은 3개의 레코드에 마지막 컬럼의 값이 존재하지 않는다는 것을 알 수 있다. “5.9.17. TRAILING NULLCOLS 구문”을 이용하면 해당 레코드의 마지막 컬럼의 값을 NULL 문자로 바인딩할 수 있다.
tbLoader 유틸리티가 로드에 실패한 오류 데이터를 기록한 오류 파일은 다음과 같다. 오류가 발생한 데이터는 수정해서 Tibero의 데이터베이스에 다시 업로드를 해야 한다.
7566 JONES MANAGER 7499 ALLEN SALESMAN ddddddddd KYUNG-JU aaaa7654 MARTIN SALESMAN
Conventional Path Load 방법을 이용하여 고정된 길이의 레코드 형태를 가진 데이터를 Tibero 서버로 로드하려고 한다.
컨트롤 파일인 control.ctl의 내용은 다음과 같다.
LOAD DATA INFILE './data.dat' APPEND INTO TABLE MEMBER LINES FIX 51 TRAILING NULLCOLS ( id position (01:04) integer external, name position (06:15), job position (17:25), birthdate position (27:36), city position (38:47), age position (49:50) integer external )
다음은 컨트롤 파일에 지정된 정보이다.
데이터 파일
tbloader 명령을 수행하는 현재 디렉터리에 위치한 data.dat 파일이다.
로그 파일
사용자가 명령 프롬프트에서 로그 파일명을 명시하지 않는다면, 기본적으로 컨트롤 파일명으로 설정한 control.log인 로그 파일을 생성한다.
오류 파일
사용자가 명령 프롬프트에서 오류 파일명을 명시하지 않는다면, 기본적으로 데이터 파일명으로 설정한 data.bad인 오류 파일을 생성한다. 단, 오류 레코드가 존재하지 않을 때는 오류 파일을 생성하지 않는다.
대상 테이블
사용자는 member 테이블의 id, name, job, birthdate, city, age 컬럼의 데이터를 로드하려고 한다.
FIELDS TERMINATED BY 문자열, FIELDS OPTIONALLY ENCLOSED BY 문자열, FIELDS ESCAPED BY 문자열, LINES TERMINATED BY 문자열
FIELDS TERMINATED BY, FIELDS OPTIONALLY ENCLOSED BY, FIELDS ESCAPED BY 문자열들은 고정된 레코드 형태이기 때문에 사용하지 않는다. LINES FIX 구문을 사용했기 때문에 LINES TERMINATED BY 문자열은 사용하지 않는다.
로딩 대상
데이터 파일의 첫 번째 라인부터 데이터를 로딩한다.
“5.9.17. TRAILING NULLCOLS 구문”
데이터 파일의 레코드의 값이 존재하지 않는 경우 NULL 문자로 바인딩한다.
데이터 파일인 data.dat의 내용은 다음과 같다. tbLoader 유틸리티가 고정된 레코드 형태의 데이터를 입력받기 때문에, 사용자는 정확한 위치에 컬럼의 데이터를 입력해야 한다. 아래의 내용은 편의상 라인 구분을 하였지만, 실제 사용하는 경우에는 한 줄로 기술하여 사용해야 한다.
7777 KKS CHAIRMAN 1975-11-18 SEOUL 33 7839 KING PRESIDENT 1963-04-13 DAEGU 7934 MILLER CLERK 1967-01-24 BUSAN 41 7566 JONES MANAGER 1955-08-20 53 7499 ALLEN SALESMAN 1977-12-28 7648 CHAN ANALYST 1979-10-11 ULSAN 28
다음과 같이 tbLoader 유틸리티를 실행한다.
tbloader userid=loader/loader_pw@default control=./control.ctl
tbLoader 유틸리티를 실행한 후 생성된 로그 파일과 오류 파일을 확인한다.
tbLoader 유틸리티의 실행 과정을 기록한 로그 파일의 내용은 다음과 같다.
tbLoader 6 TmaxData Corporation Copyright (c) 2008-. All rights reserved. Data File : ./data.dat Bad File : ./data.bad Table 'MEMBER' was loaded from the data file. Column Name Position DataType ------------------------------ ---------- ------------ ID 1 NUMERIC EXTERNAL NAME 2 CHARACTER JOB 3 CHARACTER BIRTHDATE 4 DATE CITY 5 CHARACTER AGE 6 NUMERIC EXTERNAL Record 2 was rejected. TBR-5074: Given string does not represent a number in proper format. Record 4 was rejected. TBR-5045: Only TIME format can be omitted. Table 'MEMBER' ---------------- 6 Rows were requested to load. 4 Rows were loaded successfully. 2 Rows were failed to load because of some errors Elapsed time was: 00:00:00.022404
tbLoader 유틸리티가 로드에 실패한 오류 데이터를 기록한 오류 파일은 다음과 같다. 사용자는 오류가 발생한 데이터를 수정하여 Tibero 의 데이터베이스에 다시 업로드를 한다.
7839 KING PRESIDENT 1963-04-13 DAEGU 7566 JONES MANAGER 1955-08-20 53
Conventional Path Load 방법을 이용하여 분리된 레코드 형태의 데이터를 Tibero 서버로 로드하려고 한다. 본 예제는 대용량 바이너리 데이터를 저장하는 데이터 타입인 BLOB 컬럼을 포함하는 경우 사용자가 입력 파일을 작성하는 방법을 보여준다. 대용량 텍스트 데이터를 저장할 수 있는 데이터 타입인 CLOB의 경우도 이와 유사하다.
컨트롤 파일인 control.ctl의 내용은 다음과 같다.
LOAD DATA INFILE './data.dat' LOGFILE './logfile.log' BADFILE './badfile.bad' APPEND INTO TABLE member FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' ESCAPED BY '\\' LINES TERMINATED BY '\n' TRAILING NULLCOLS IGNORE 2 LINES ( id integer external, name, job, birthdate, city, age integer external, picture outfile )
다음은 컨트롤 파일에 지정된 정보이다.
데이터 파일
현재 디렉터리에 위치한 data.dat 파일이다.
로그 파일
사용자가 명령 프롬프트에서 로그 파일명을 명시하지 않는다면, 현재 디렉터리에 이름이 logfile.log인 로그 파일을 생성한다.
오류 파일
사용자가 명령 프롬프트에서 오류 파일명을 명시하지 않는다면, 현재 디렉터리에 이름이 badfile.bad인 오류 파일을 생성한다. 단, 오류 레코드가 존재하지 않을 때는 오류 파일을 생성하지 않는다.
대상 테이블
사용자는 member라는 테이블의 id, name, job, birthdate, city, age, picture 컬럼의 데이터를 로드하려고 한다.
FIELDS TERMINATED BY 문자열, FIELDS OPTIONALLY ENCLOSED BY 문자열, FIELDS ESCAPED BY 문자열, LINES TERMINATED BY 문자열
FIELDS TERMINATED BY로써 콤마(,), FIELDS OPTIONALLY ENCLOSED BY 문자열로써 큰따옴표(" "), FIELDS ESCAPED BY 문자열은 '\\'를 LINES TERMINATED BY 문자열로 '\n'를 사용한다.
로딩 대상
IGNORE LINES 구문이 있기 때문에 데이터 파일의 세 번째 라인부터 데이터를 로딩한다.
“5.9.17. TRAILING NULLCOLS 구문”
데이터 파일의 레코드의 값이 존재하지 않는 경우 NULL 문자로 바인딩한다.
데이터 파일인 data.dat의 내용은 다음과 같다. BLOB 컬럼에 바이너리 데이터를 업로드하기 위해서 해당 바이너리 파일이 위치한 경로를 입력한다.
첫 번째 라인 무시 7782,"Clark","Manager",1981-01-11 , DAEGU,26,./blob.jpg 7839,"King",President,1960/11/17,SEOUL,47 7934,"Miller","Clerk",1977/10/12,BUSAN,30,./blob2.jpg 7566,"Jones",Manager\, ,1981/04/02,31 7499, "Allen", "Salesman" a,1981:02/20,26 7654, "Martin", "Sale smn", 1981/10/28,26 7658, "Chan",Ana lyst, 1982/05/03,25,25
다음과 같이 tbLoader 유틸리티를 실행한다.
tbloader userid=loader/loader_pw@default control=./control.ctl
tbLoader 유틸리티를 실행한 후 생성된 로그 파일과 오류 파일을 확인한다.
tbLoader 유틸리티의 실행 과정을 기록한 로그 파일의 내용은 다음과 같다.
tbLoader 6 TmaxData Corporation Copyright (c) 2008-. All rights reserved. Data File : ./data.dat Bad File : ./badfile.bad Table 'MEMBER' was loaded from the data file. Column Name Position DataType ------------------------------ ---------- ------------ ID 1 NUMERIC EXTERNAL NAME 2 CHARACTER JOB 3 CHARACTER BIRTHDATE 4 DATE CITY 5 CHARACTER AGE 6 NUMERIC EXTERNAL PICTURE 7 RAW Record 4 was rejected. TBR-80025 : Column data exceeds data buffer size. Table 'MEMBER' ---------------- 6 Rows were requested to load. 5 Rows were loaded successfully. 1 Rows were failed to load because of some errors Elapsed time was: 00:00:00.055475
tbLoader 유틸리티가 로드에 실패한 오류 데이터를 기록한 오류 파일은 다음과 같다. 오류가 발생한 데이터는 수정해서 Tibero의 데이터베이스에 다시 업로드를 해야 한다.
7499, "Allen", "Salesman" a,1981:02/20,26