본문 바로가기
OraclE

TAPE로 EXPORT, IMPORT!, LOADER 사용하기(PIPE 사용)

by 타마마임팩트_쫀 2010. 5. 25.




======================================================
TAPE로 EXPORT, IMPORT!, LOADER 사용하기(PIPE 사용)
======================================================

    Purpose
    -------
     대용량의 DATA를 BACKUP 받거나 DATA를 처리할 때에는 TAPE을 이용하는
    경우가 있다. 이럴 때 EXPORT, IMPORT!, SQL*LOADER에서 TAPE 를 이용하는
    방법을 종류별로 정리하였다.

    Explanation
    -----------
    1. TAPE DEVICE로 EXPORT 받기
    %  exp userid=system/manager full= y file=/dev/rmt/0m volsize=245M
     FILE은 TAPE이 있는 DEVICE 이름이고 VOLSIZE는 TAPE에 들어갈 DATA의
    SIZE이다. 만약 첫번 째 TAPE이 245M에 이르게 되면 다음 TAPE를 넣으라는
    메시지가 나온다.
     (주의) VOLSIZE should be < tape capacity

    2.  Tape device에서 import!받기
    %  imp  userid=system/manager  full=y  file=/dev/rmt/0m  volsize=245M
      첫번째 TAPE이 245M에 이르면 다음 TAPE를 위한 메시지가 나온다.

    3. PIPE와 DD를 이용한 tape의 export
    %  mknod  /tmp/exp_pipe  p                    # Make the pipe
    %  dd  if=/tmp/exp_pipe  of=<tape device>  &  # Write from pipe to tape
    %  exp file=/tmp/exp_pipe <other options>     # Export to the pipe

    4. PIPE와 DD를 이용한 tape의 import!
    %  mknod  /tmp/imp_pipe  p                    # Make the pipe
    %  dd  if=<tape device>  of=/tmp/imp_pipe  &  # Write from tape to pipe
    %  imp file=/tmp/imp_pipe  <other options>    # Import! from the pipe

    5. PIPE 와 DD를 이용한 remote server의 tape device에 export하기
    %  mknod  /tmp/exp_pipe  p
    %  dd  if=/tmp/exp_pipe | rsh <hostname> dd  of=<file or device> &
    %  exp file=/tmp/exp_pipe <other options>

    6. PIPE 와 DD 를 이용한 remote server의 tape device에서 import!하기
    %  mknod /tmp/imp_pipe  p
    %  rsh <hostname> dd if=<file or device | dd of=/tmp/imp_pipe &
    %  imp file=/tmp/imp_pipe <other options>

    7. TAPE에 있는 DATA FILE을 SQL*LOADER로 받기.
    %  mknod  /tmp/load_pipe  p
    %  dd  if=<tape_device>  of=/tmp/load_pipe  &
    (주의)  만약 tape이 EBCDIC이면 다음 명령으로 ASCII로 바꾸어 줍니다.
    %  dd if=<tape_device  conv=ascii  of=/tmp/load_pipe  &
    %  sqlldr userid=user/pass control=contol.ctl log=loader.log
       infile='/tmp/load_pipe'
    * PIPE는 I/O operation의 보다 빠른 상호 작용을 위한 memory 안의 가상
     화일이다. PIPE buffer는 Sun Solaris에서는 5K, HP에서는 8K, SGI에서는
     10K이다. 이것은 FIFO를 따르며 command는 다음과 같다.
    % mknod filename p
    * DD는 한 device로부터 다른 곳으로 data를 raw copy하는 명령어이다.
 
 
===========================================
LOADER에서 MAXIMUM SPECIFIED LENGTH
===========================================

    PURPOSE
    ---------
    sql*loader로 작업시 "Field in data file exceeded maximum specified
    length" 메세지가 발생하는 원인과 해결 방안에 대해 알아보도록 한다.

    Explanation
    -----------
    sql*loader로 작업을 하다보면 varchar2 column이 255 character가 넘는
    경우에 "Field in data file exceeded maximum specified length"라는
    message를 .log에 남기면서 해당 field가 reject되는 경우가 있다.
    이경우의 해결 방법은 control file의  column의 길이를 "col1 char(300)"
    처럼 기술해 주면 된다.
    그 이유는 다음과 같다.
    sql*loder는 보통 default로 buffer를 64K로 잡아둔다. 작업이 시작되면
    loader는 이 buffer에 얼마나 많은 row를 넣을 것인지를 결정하기 위하여
    control file 내의 column의 최대길이에 대한 계산을 하게 된다. 이때 그
    값이 data type에 의하거나 명시적으로 기술되어 있지 않으면 loader는
    나름대로의 길이를 가정하게 되는데 이때 char값은 255로 가정되게 된다.
    그러므로 255가 넘는 값은 위에서와 같은 error를 만들게 된다.
    한가지 더 알아둘 필요가 있는 것은 작은 filed의 길이를 명시해 두는 경우가
    loader의 효율을 높일수 있다는 것이다. 명시된 값은 그 길이만큼 buffer에
    넣을때 적용이 되므로 255보다 적은 값이 결과적으로 buffer에 들어갈 filed의
    길이를 적게 만들어서 한번에 더 많은 row를 load할 수 있게 한다.