'sql loader 사용'에 해당되는 글 1건

  1. 2021.11.01 로더로 대용량 데이터 DB에 넣기
2021. 11. 1. 10:53

대용량 로그를 SQL Developer 또는 프로그램에서 넣으니까...

 

아카이브에 백업 로그가 엄청 쌓여서 풀찬다.

 

그래서, 찾아보니, sql로더를 사용해서 넣으라고 하더라...

 

먼저 sqlldr 이 설치 되어 있는지 확인해 보고, 없으면 설치해야한다.

 

cmd 명령 프롬프트에서 sqlldr을 실행해보고, 찾을수 없으라고 뜨면, 설치부터 진행

 

 

구조를 설명하면, ctl 파일(콘트롤파일)에 입력값에대한 정보를 작성해야한다.

 

그리고, sqlldr 를 실행하면 된다.

 

C\user> sqlldr 디비접속정보 CONTROL= ctl파일명 LOG = 로그파일명

 

하지만, 저렇게 하면, 매번 써야되는 불편함이 있어서, 

 

bat 파일을 생성해서 위 실행문을 미리 적어 놓고, bat 파일을 실행했다.

 

 

먼저 ctl 파일부터 설명하면, 

LOAD DATA
CHARACTERSET  UTF8
INFILE 'log_202004.txt' 
BADFILE 'log_202004.bad'
DISCARDFILE 'log_202004.dsc'
APPEND
INTO TABLE "DB_USER_NAME"."TABLE_NAME"
FIELDS TERMINATED BY X'9'
(FIELD1_NM,
FIELD2_NM,
FIELD3_NM char(4000),
FIELD4_NM char(4000),
FIELD5_NM char(4000),
FIELD6_NM)

CHARACTERSET 은 한글이 있으므로, UTF8로 적어준다.

 

INFILE 은 넣을 DATA의 TXT 파일이다.

BADFILE은 입력이 들어가지 않은 라인의 정보 모음이다.

BADFILE 이 생성되면, 들어가지 않은 데이터가 생겼으므로, BAD 파일의 로그만 따로 정리해서 다시 실행하면 된다.

(이게 생각보다 편하다... 전체 지우고 다시 넣는게 아니라...값이 잘못된서 못 들어간 정보만 확인해서 다시 넣을 수 있으므로..)

 

그리고, INTO TABLE 에 처음에 DB 유저명을 적고,  점 뒤에 넣을 테이블 명을 적으면 된다.

밑에 ( 괄호부터는 필드 명을 적어주는데, char(4000)적은거는, 따로 적어주지 않으면, 기본 default로 255자로 잡혀서 그 이상은 오류가 발생한다.

에러 "Field in data file exceeds maximum length" 가 생길때, 처리하기 위해서

char(4000) 최대값을 적어준거다. char 안적은거는 255로 잡힌다.

 

 

자 이제 ctl 파일은 준비가 되었다.

여러개를 입력해야하니, 그때마다 명령어를 쓰기 힘드니, 

에디터를 열고, bat 파일을 만들어 준다.(예, test.bat)

 

sqlldr 디비접속정보 CONTROL= ctl파일명 LOG = 로그파일명

sqlldr db_user/db_password@db_ip CONTROL = log_info.ctl LOG= importlog.log

@뒤에 db_ip에는 tns에 세팅이 되어있으면, tns명을 넣어줘도 된다.

 

 

저장하고, 명령 프롬프트에서 bat를 실행하면 된다.

 

로더를 사용하면, 생각보다 속도도 빠르고, 잘못된 필드값 정리도 되서, 오히려 작업하는데 유용하다.

처음 세팅이 복잡해서 그렇지, 한번하면, 그 이후에는 빠르게 작업할 있다.

 

실행하면, 아래처럼 레코드 수가 뜨고, 작업양을 볼수 있다.

SQL*Loader: Release 11.1.0.6.0 - Production on 수 9월 15 20:23:47 2021

Copyright (c) 1982, 2007, Oracle.  All rights reserved.

커밋 시점에 도달 - 논리 레코드 개수 18
커밋 시점에 도달 - 논리 레코드 개수 36
커밋 시점에 도달 - 논리 레코드 개수 54
커밋 시점에 도달 - 논리 레코드 개수 72
커밋 시점에 도달 - 논리 레코드 개수 90
커밋 시점에 도달 - 논리 레코드 개수 108
커밋 시점에 도달 - 논리 레코드 개수 126
커밋 시점에 도달 - 논리 레코드 개수 144
커밋 시점에 도달 - 논리 레코드 개수 162
커밋 시점에 도달 - 논리 레코드 개수 180

 

Posted by Tyson