제5장 tbLoader

내용 목차

5.1. 개요
5.2. 빠른 시작
5.3. 입출력 파일
5.3.1. 컨트롤 파일
5.3.2. 데이터 파일
5.3.3. 로그 파일
5.3.4. 오류 파일
5.4. 로드 방식
5.5. 제약조건
5.5.1. 동일한 구분자의 사용
5.5.2. ESCAPED BY 옵션 값을 지정하지 않은 경우
5.5.3. 테이블 owner와 수행 user가 다른 경우
5.6. 공백 정책
5.6.1. 필드 값 전체가 공백인 경우
5.6.2. 필드 값 일부가 공백인 경우
5.6.3. 필드 값의 공백을 데이터로 인식하려는 경우
5.7. 명령 프롬프트에서의 파라미터 지정
5.7.1. 파라미터 목록
5.8. 고급 기능
5.8.1. Parallel DPL
5.8.2. 접속 정보 암호화 기능
5.9. 컨트롤 파일의 옵션 지정
5.9.1. CHARACTERSET 구문
5.9.2. INFILE 구문
5.9.3. LOGFILE 구문
5.9.4. BADFILE 구문
5.9.5. SKIP_ERRORS 구문
5.9.6. 기존 데이터 처리 방법
5.9.7. PRESERVE BLANKS 구문
5.9.8. 테이블 지정 방법
5.9.9. 로딩 조건 지정 방법
5.9.10. 인덱스 생성 방법
5.9.11. FIELDS 구문의 TERMINATED BY 구문
5.9.12. FIELDS 구문의 OPTIONALLY ENCLOSED BY 구문
5.9.13. FIELDS 구문의 ESCAPED BY 구문
5.9.14. LINES 구문의 FIX 구문
5.9.15. LINES 구문의 STARTED BY 구문
5.9.16. LINES 구문의 TERMINATED BY 구문
5.9.17. TRAILING NULLCOLS 구문
5.9.18. IGNORE LINES 구문
5.9.19. 대상 컬럼 및 속성
5.9.20. 주석 삽입
5.10. 수행 예제
5.10.1. 분리된 레코드 형태
5.10.2. 고정된 레코드 형태 - 레코드 구분자가 EOL 문자인 경우
5.10.3. 고정된 레코드 형태 - 고정된 길이의 레코드인 경우
5.10.4. 대용량 객체형 데이터를 포함하는 경우

본 장에서는 tbLoader 유틸리티를 소개하고 사용 방법을 설명한다.

tbLoader는 대량의 데이터를 한번에 Tibero 데이터베이스에 저장하기 위한 유틸리티이다.이 유틸리티를 통해 SQL 문장을 일일이 작성하여 데이터베이스에 입력할 데이터를 입력하는 대신, 컬럼 데이터만 일반 텍스트 파일로 만들어서 한꺼번에 적재할 수 있다. 따라서 많은 데이터를 Tibero의 데이터베이스에 한 번에 저장할 때 유용한다.

tbLoader 유틸리티를 사용하면 사용자가 데이터 파일을 쉽게 작성할 수 있으며, 데이터를 적재하기 위한 시간을 단축할 수 있다.

tbLoader 유틸리티는 Tibero를 설치하는 과정에서 함께 설치되며, Tibero를 제거하면 함께 제거된다.

tbLoader 유틸리티는 명령 프롬프트에서 다음과 같은 형식으로 실행한다.

$ tbloader [options]

명령 프롬프트에서 지정할 수 있는 옵션에 대한 자세한 내용은 “5.7. 명령 프롬프트에서의 파라미터 지정”을 참고한다.

다음은 tbLoader 유틸리티를 실행하는 예이다.


tbLoader 유틸리티는 컨트롤 파일(Control file)과 데이터 파일(Data file)을 입력으로 받아서 로그 파일(Log file)과 오류 파일(Bad file)을 출력한다. 컨트롤 파일과 데이터 파일은 입력 파일로써 사용자가 작성하며, 로그 파일과 오류 파일은 tbLoader 유틸리티에서 자동으로 생성되는 출력 파일이다. tbLoader 유틸리티의 입출력 파일은 모두 일반 텍스트 파일이므로 사용자가 입력 파일을 생성하기가 매우 용이하다.

본 절에서는 tbLoader 유틸리티를 사용할 때 필요한 입력 파일인 컨트롤 파일, 데이터 파일과 로드 결과로 출력되는 로그 파일, 오류 파일을 설명한다.

데이터 파일은 데이터베이스의 테이블에 저장할 데이터가 들어있는 텍스트 파일이다. 데이터 파일은 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 구문”이 없다면 오류가 발생한다.

tbLoader 유틸리티에서 데이터를 로드하는 방식은 다음과 같이 두 가지가 있다.

본 절에서는 tbLoader 유틸리티의 제약조건을 설명한다.

본 절에서는 tbLoader 유틸리티에서 공백(Whitespace)을 처리하는 방법에 대해 설명한다.

tbLoader 유틸리티는 빈 문자(' '), 탭 문자('\t') 및 EOL 문자('\n')를 공백으로 취급한다. 단, 해당 문자가 FIELD TERMINATED BY 구문이나 LINE TERMINATED BY 구문으로 선언되어 있는 경우는 공백으로 취급하지 않는다. 공백은 필드의 시작과 끝에 존재할 수 있다. 단, 필드의 중간에 존재하는 공백은 데이터의 한 부분으로 취급한다.

tbLoader 유틸리티는 공백에 대해서 데이터 파일의 형태에 따라서 다르게 취급한다.

고정된 레코드 형태인 경우

필드 값의 앞에 존재하는 공백은 실제 데이터로 취급하고, 뒤에 따르는 공백은 필요 없는 공백으로 간주하여 잘라낸다. 사용자가 필드 값의 앞에 존재하는 공백은 임의로 제거할 수 있지만, 뒤에 따르는 공백은 위치를 조정하기 위해 부가적으로 삽입하는 경우가 많기 때문이다.

다음과 같이 사용자가 필드 값의 앞과 뒤에 공백을 둔 경우 뒤쪽의 공백은 잘라낸다.

" aaa \t" -> " aaa"

분리된 레코드 형태인 경우

필드 값의 앞과 뒤에 존재하는 공백을 모두 필요 없는 것으로 간주하여 잘라낸다. 단, 사용자가 필드 값의 앞과 뒤에 공백을 삽입하고 싶다면, ENCLOSED BY 문자열로 감싸준 후에 공백을 삽입하면 공백은 필드의 데이터로 인식된다.

다음과 같이 사용자가 필드 값의 앞과 뒤에 공백을 둔 경우 앞과 뒤의 공백을 모두 잘라낸다.

" aaa \t" -> "aaa"

본 절에서는 명령 프롬프트에서 지정할 수 있는 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 유틸리티의 파라미터의 예이다.


항목설명
userid

Tibero의 데이터베이스 사용자명과 패스워드 및 데이터베이스명을 다음의 형식으로 지정한다.

userid=userid/passwd@databasename
control

파라미터 정보를 포함하는 컨트롤 파일의 경로와 이름을 지정하는 파라미터이다.

절대 경로와 현재 디렉터리에 대한 상대 경로 방식을 모두 사용할 수 있다.

data

실제 데이터를 포함하고 있는 텍스트 파일의 경로와 이름을 지정하는 파라미터이다.

절대 경로와 현재 디렉터리에 대한 상대 경로 방식을 모두 사용할 수 있다.

사용자가 명령 프롬프트와 컨트롤 파일에서 모두 경로를 지정하였다면, 명령 프롬프트에서 지정한 값을 우선시한다.

log

데이터 로딩 과정에서 발생하는 로그를 기록할 파일의 경로와 이름을 지정하는 파라미터이다. (기본값: 컨트롤 파일명.log)

절대 경로와 현재 디렉터리에 대한 상대 경로 방식을 모두 사용할 수 있다.

사용자가 명령 프롬프트와 컨트롤 파일에서 모두 경로를 지정하였다면, 명령 프롬프트에서 지정한 값을 우선시한다.

bad

데이터 로딩에 실패한 레코드를 기록할 파일에 대한 경로와 이름을 지정하는 파라미터이다. (기본값: 데이터 파일명.bad)

절대 경로와 현재 디렉터리에 대한 상대 경로 방식을 모두 사용할 수 있다.

사용자가 명령 프롬프트와 컨트롤 파일에서 모두 경로를 지정하였다면, 명령 프롬프트에서 지정한 값을 우선시한다.

skip

데이터 파일의 처음부터 지정한 수만큼의 라인을 로드의 대상에서 제외하는 파라미터이다. (기본값: 0)

컨트롤 파일의 옵션 중 “5.9.18. IGNORE LINES 구문”과 같은 기능을 한다.

errors

데이터를 업로드할 때 최대로 허용할 에러의 개수를 지정하는 파라미터이다.

(기본값: 50)

tbLoader 유틸리티는 사용자가 지정한 에러의 개수를 넘지 않는 범위 내에서 데이터를 업로드한다. 만약, 지정한 개수를 만날 경우 데이터의 업로드를 중지한다.

  • ERRORS는 -1과 0부터 Integer의 최댓값(2147483647) 중의 한 값이다.

  • ERRORS를 0으로 지정하면 단 하나의 에러도 허용하지 않는다.

  • ERRORS를 양의 정수 N으로 지정하면 N개의 에러가 발생한 경우 데이터의 업로드를 중지한다. 즉, N-1개의 에러까지만 허용한다.

  • ERRORS를 -1로 지정하면 모든 에러를 건너띄고 에러가 발생하지 않는것만 업로드한다.

rows사용자가 대용량 데이터를 업로드할 때 커밋을 수행할 레코드 개수를 지정하는 파라미터이다. 단, tbLoader는 성능을 고려하여 지정한 레코드의 개수를 정확히 맞추어서 서버로 데이터를 보내지는 않는다.
message

tbLoader 유틸리티가 현재 처리하고 있는 논리적인 레코드의 개수를 화면에 출력하는 파라미터이다.

별도로 명시하지 않을 경우 화면에 진행 상황을 출력하지 않는다. 단, 너무 작은 값을 명시할 경우 성능에 영향을 미칠 수 있다.

readsize

tbLoader는 데이터 파일의 내용을 버퍼링을 사용하여 읽어들인다. 이때 사용하는 읽기 전용 버퍼 크기(READ BUFFER SIZE)를 지정하는 파라미터이다.

(단위: Byte, 기본값: 65536(64KB), 최댓값: 2,097,152(2MB))

disable_idx

데이터를 로딩하기 전 테이블에 정의된 모든 인덱스를 비활성화할지를 지정하는 파라미터이다.

  • Y: 모든 인덱스를 UNUSABLE 상태로 변경한다.

  • N: 인덱스 상태를 변경하지 않는다. (기본값)

direct

사용자가 데이터를 로드할 때 Conventional Path Load 또는 Direct Path Load 방법 중 하나를 지정하는 파라미터이다.

  • Y: Direct Path Load로 지정한다. 이 외의 값이나 빈 문자를 입력한 경우는 Conventional Path Load로 데이터를 로드한다.

  • N: Conventional Path Load로 데이터를 로드한다. (기본값)

dpl_log

Direct Path Load 방법으로 데이터를 로드할 때 서버의 로그 파일에 로그를 남길지를 지정하는 파라미터이다.

  • Y: 데이터를 업로드할 때 서버의 로그 파일에 로그를 남긴다. 장애가 발생하는 경우 복구가 가능하나 로딩할 때 성능이 저하되는 단점이 있다.

  • N: 데이터를 업로드할 때 서버의 로그 파일에 로그를 남기지 않는다. 장애가 발생했을 때 복구할 수 없다. (기본값)

dpl_parallel

Direct Path Load 방법으로 데이터를 로드할 때 Parallel Loading으로 전송할지를 지정하는 파라미터이다.

  • Y: Parallel Direct Path Load를 사용한다.

  • N: 기본 Direct Path Load로 로드한다.

multithread

Direct Path Load 방법으로 데이터를 로드할 때 멀티 스레드를 사용할지를 지정하는 파라미터이다.

tbLoader 유틸리티는 두 개의 스레드를 사용하여, 하나의 스레드는 사용자의 데이터 파일로부터 데이터를 읽어 들여 Direct Path Load를 위한 스트림 버퍼에 적재하고, 나머지 스레드는 적재된 스트림 버퍼를 서버로 로딩한다.

여러 개의 CPU를 가진 머신이나 클라이언트와 서버가 다른 머신에 존재하는 경우에 성능 향상을 기대할 수 있다.

  • Y: 파일로부터 데이터를 읽는 스레드와 서버로 해당 데이터를 로딩하는 스레드가 별도로 존재한다. (기본값)

  • N: 하나의 스레드가 파일로부터 데이터를 읽어서 서버로 해당 데이터를 로딩한다.

bindsize

Direct Path Load 방법으로 데이터를 로드할 때 클라이언트에서 사용하는 Direct Path Stream의 크기를 지정하는 파라미터이다.

Tibero 클라이언트는 데이터가 지정한 크기만큼 바인딩이 되기 전까지는 서버로 업로드가 되지 않는다. 따라서, 대용량의 데이터를 업로드할 때 효율적으로 사용할 수 있다.

(단위: Byte, 기본값: 65536(64KB), 최댓값: 10,485,760(10MB))

본 절에서는 tbLoader 유틸리티를 통해서 추가된 고급 기능에 대해 설명한다.

본 절에서는 컨트롤 파일의 옵션을 지정하는 방법에 대해 설명한다.

사용자는 컨트롤 파일에서 다음의 정보를 지정할 수 있다.

  • 데이터 파일에 포함된 문자 집합

  • 데이터를 포함하는 데이터 파일

  • 로드 수행 중에 발생한 로그를 기록할 로그 파일

  • 로드에 실패한 데이터를 기록하는 오류 파일

  • 오류 파일에 남기지 않을 에러 번호 지정

  • 테이블에 존재하는 기존 데이터에 대한 처리 방법(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.

사용자가 지정한 테이블에 기존에 데이터가 존재할 경우 그 데이터를 처리하는 방법을 지정할 수 있다.

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)
      ...
      (...)

데이터 파일로부터 레코드를 읽어 올 때 필드의 값의 시작과 끝을 감쌀 문자열을 지정한다.

필드의 값에 빈 문자(' ', '\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_stringASCII 문자열로 지정한다.
  • 예제

    필드를 감쌀 시작 문자열과 종료 문자열이 같을 경우 다음과 같은 형식으로 지정한다.

    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→오류 발생

사용자가 데이터를 입력할 테이블의 컬럼 리스트를 명시한다. 단, 데이터 파일의 컬럼 순서와 동일하게 작성해야 한다.

컬럼의 속성은 각 절에서 설명한다.

대상 컬럼과 속성을 지정하는 세부 내용은 다음과 같다.

  • 문법

    (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대상 테이블의 컬럼 이름을 명시한다.

tbLoader 유틸리티는 특정한 데이터 타입을 제공한다. 데이터 타입별로 기본값이 다르거나 컬럼의 데이터를 다른 방식으로 바인딩한다.

제공하는 데이터 타입은 다음과 같다.

  • 숫자 데이터 타입

  • 문자열 데이터 타입

  • 바이너리 데이터 타입

  • 날짜 데이터 타입

숫자 데이터 타입

문자열 데이터를 Tibero 서버의 숫자형 컬럼에 로드하기 위해 사용한다. 컬럼에 NULL을 명시하면, tbLoader 유틸리티는 기본값으로 0을 바인딩하여 서버에 로드한다. 이와는 반대로 0이 아닌 NULL로 바인딩하려면, 문자열 데이터 타입을 선언하여 사용하면 된다.

숫자 데이터 타입(NUMERIC EXTERNAL)의 컬럼의 형식을 지정하는 세부 내용은 다음과 같다.

문자열 데이터 타입

문자열 데이터를 Tibero 서버의 문자형(CHAR, VARCHAR, CLOB, NCLOB) 컬럼에 로드하기 위해 사용한다. 컬럼에 NULL을 명시하면, tbLoader 유틸리티는 기본값으로 NULL을 바인딩하여 서버에 로드한다. 이와는 반대로 NULL이 아닌 0으로 바인딩하려면, 숫자형 데이터 타입을 선언하여 사용하면 된다.

문자열 데이터 타입의 컬럼 형식을 지정하는 세부 내용은 다음과 같다.

바이너리 데이터 타입

바이너리 데이터를 Tibero 서버의 대용량 객체형(RAW, BLOB, LONGRAW) 컬럼에 로드하기 위해 사용한다. 컬럼에 NULL을 명시하면, tbLoader 유틸리티는 기본값으로 NULL을 바인딩하여 서버에 로드한다.

바이너리 데이터 타입의 컬럼 형식을 지정하는 세부 내용은 다음과 같다.

날짜 데이터 타입

문자열 데이터를 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_stringDATE 타입인 컬럼의 형식을 지정한다.
    timestamp_fmt_stringTIMESTAMP 타입인 컬럼의 형식을 지정한다.
    time_fmt_stringTIME 타입인 컬럼의 형식을 지정한다.
  • 예제

    다음의 예는 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

“5.9.7. PRESERVE BLANKS 구문”와 같은 기능을 하지만 컬럼의 속성으로 사용하여 해당 컬럼에만 적용되도록 할 수 있다.

  • 예제

    컨트롤 파일의 형식이 다음과 같다면 컬럼 empno에 해당하는 첫 번째 필드의 모든 공백은 데이터 값으로 유지된다.

    control.ctl:
      LOAD DATA
      ...
      (
          empno PRESERVE BLANKS,
          ename
      ) 

본 절에서는 분리된 레코드 형태, 고정된 레코드 형태, BLOB과 CLOB 타입과 같은 대용량 데이터가 존재 하는 세 가지 경우에 대해 다음과 같은 순서로 데이터를 로드하는 예제를 살펴본다.

  1. 테이블을 생성한다(모든 예제에서 공통 사항이다).

  2. 컨트롤 파일을 작성한다.

  3. 데이터 파일을 작성한다.

  4. tbLoader 유틸리티를 실행한다.

  5. 로그 파일과 오류 파일을 확인한다.

다음은 공통으로 사용할 테이블을 생성하는 예이다. 본 예제에서는 데이터베이스 이름을 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 유틸리티를 실행한다.

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 유틸리티를 실행한다.

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
)

다음은 컨트롤 파일에 지정된 정보이다.

데이터 파일 작성

데이터 파일인 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 유틸리티를 실행한다.

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의 내용은 다음과 같다. 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 유틸리티를 실행한다.

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