http://wiki.gurubee.net/display/STUDY/SQL*Loader
데이터 로딩과 언로딩
#데이터 로딩툴
- SQL*Loader
- External 테이블 : external 테이블은 운영체제 파일을 데이터베이스 테이블처럼 조회할 수 있는 기능(9i이상사용,10g이상 테이블의 데이터를 추출해서 운영체제 파일을 생성할 수도 있다.)
#데이터 언로딩 기술
- flat file unload - 사용자가 정의한 포멧에 맞게 만들며 스프레드 시트와 같은 다른 유형에 호환가능한 결과도 만들수 있다.
- data pump unload - 바이너리포멧으로서 데이터 펌프툴과 external 테이블로 접근할 수 있다.
SQLLDR는 매우 짧은 시간에 대용량의 데이터를 로드하는데 사용할 수 있고 2가지 모드가 있다.
1 | conventional path | 데이터를 로드하는데 sql insert를 사용 buffer cache를 거쳐서 data file에 쓰게 됨 |
2 | direct path | direct path모드에서 sql을 사용하지 않고 직접 메모리에 data block을 만들어서 해당 table에 저장 플랫 파일의 데이터를 읽으면서 sql엔진을 거치지않는다 언두를 생성하지도 않으며 어떤 경우에는 리두 또한 생성하지 않는다 |
sqlldr 도움말$sqlldr SQL*Loader: Release 11.2.0.3.0 - Production on 화 11월 27 19:13:38 2012 Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved. 사용법: SQLLDR keyword=value [,키워드=값,...] 적절한 키워드: userid -- ORACLE 사용자 이름/비밀번호 control -- 제어 파일 이름입니다. log -- 로그 파일 이름입니다. bad -- 부적합한 파일 이름입니다. data -- 데이터 파일 이름 discard -- 폐기 파일 이름 discardmax -- 허용할 폐기 수 (기본값 all) skip -- 건너 뛸 논리 레코드 수 (기본값 0) load -- 로드할 논리 레코드 수 (기본값 all) errors -- 허용할 오류 수 (기본값 50) rows -- 기본 경로 바인드 배열 또는 직접 경로 데이터 저장 사이의 행 수 (기본값: 규약 경로 64, 직접 경로 전체) bindsize -- 기본 경로 바인드 배열 크기(바이트) (기본값 256000) silent -- 실행 중 메시지 숨기기(헤더,피드백,오류,폐기,분할 영역) direct -- 직접 경로 사용 (기본값 FALSE) parfile -- 매개변수 파일: 매개변수 사양을 포함하는 파일 이름 parallel -- 병렬 로드 수행 (기본값 FALSE) file -- 확장 영역을 할당할 파일 skip_unusable_indexes -- 사용할 수 없는 인덱스 또는 인덱스 분할 영역 허용 안함/허용 (기본값 FALSE) skip_index_maintenance -- 인덱스 유지 관리 안함, 영향을 받은 인덱스를 사용 불가로 표시 (기본값 FALSE) commit_discontinued -- 로드가 중단되는 경우 로드된 행 커밋 (기본값 FALSE) readsize -- 읽기 버퍼 크기 (기본값 1048576) external_table -- 로드를 위해 외부 테이블 사용: NOT_USED, GENERATE_ONLY, EXECUTE (기본값 NOT_USED) columnarrayrows -- 직접 경로 열 배열에 대한 행 수 (기본값 5000) streamsize -- 직접 경로 스트림 버퍼 크기(바이트) (기본값 256000) multithreading -- 직접 경로에서 다중 스레드 사용 resumable -- 현재 세션에 대한 재개를 사용 또는 사용 안함으로 설정합니다. (기본값 FALSE) resumable_name -- 재개 가능한 명령문 식별에 도움이 되는 텍스트 문자열 resumable_timeout -- RESUMABLE에 대한 대기 시간(초) (기본값 7200) date_cache -- 날짜 변환 캐시 크기(항목) (기본값 1000) no_index_errors -- 인덱스 오류 발생 시 로드 중단 (기본값 FALSE) 주: 명령행 매개변수는 위치 혹은 키워드로 지정될 수 있습니다. 위치 또는 키워드별입니다. 전자의 예는 'sqlldr scott/tiger foo'; 후자의 예는 'sqlldr control=foo' 하나는 이전 위치에 의해 매개변수를 지정할 수 있으나 매개변수가 키워드에 의해 지정한 이후에는 할 수 없습니다. 예를 들어, 'sqlldr scott/tiger control=foo logfile=log'는 허용되지만 'sqlldr scott/tiger control=foo log'는 위치가 맞더라도 허용되지 않습니다 |
_참조 : http://docs.oracle.com/cd/E11882_01/server.112/e22490/ldr_params.htm#g1014550_
SQLLDR를 사용하기위해서는 contol file이 필요하다.
컨트롤 파일에 포함 될 수 있는 내용
- 입력 대상 테이블에 대한 정보
- 레이아웃
- 데이터타입등 입력 데이터를 설명하는 정보
- 로드해야할 데이터
Control file 생성방법
1 | LOAD DATA |
|
2 | INFILE * |
|
3 | INTO TABLE |
|
4 | FILEDS TERMINATED BY ',' |
|
5 | (DEPTNO,DNAME,LOC) |
|
6 | BEGINDATA |
|
7 | 10,SALES,VIRGINIA | 실제데이터 |
8 | 20,ACCOUNTING,VIRGINIA | 실제데이터 |
9 | 30,CONNSULTING,VIRGINIA | 실제데이터 |
10 | 40,FINANCE,VIRGINIA | 실제데이터 |
#데이터 로딩과 관련한 SQLLDR FAQ
1. 로그파일의 '최대 길이 초과'가 왜 발생하는가?
2. 구분자를 포함하는 데이터 로드 방법
3. 고정 길이 포맷 데이터 로드 방법
4. 날짜 데이터 로드 방법
5. 함수를 사요한 데이터 로드 방법
6. 개행문자를 포함한 데이터 로드 방법
7. LOB 데이터 로드
8. lnline LOB 데이터 로딩
9. Out of Line LOB 데이터 로딩
10. 객체 컬럼에 LOB 데이터 로딩
11. 저장 프로시저에서 SQLLDR를 호출하는 방법
1. 로그파일의 '최대 길이 초과'가 왜 발생하는가?
Record 4:Rejected - Error on table DEPT, column DNAME. field in data file exceeds maximun legnth 위의 오류는 입력 레크도를 처리하는 과정에서 SQLLDR의 기본 데이타타입인 char(255)를 초과하는 문자열 데이타타입이 입력되었기 때문. |
2. 구분자를 포함하는 데이터 로드 방법
- 1) 콤마로 구분 된 데이터
- 2) 탭으로 구분된 데이터
3. 고정 길이 포맷 데이터 로드 방법
- SQLLDR로 로드하는 데 최적의 데이터 포멧
- 가장 빠른 로드 방법일 것.
- 로드해야할 데이터가 대용량이라면, 고정 위치 포맷으로 변환하는 것이 가장 최상의 방법
- 구분자를 갖는 파일보다 크기가 훨씬 클 수 있다.
4. 날짜 데이터 로드 방법
- 날짜를 로딩하는 방법은 컨트롤 파일 내에 date 테이터타입을 사용해서 date mask를 명시할 수 있다.
5. 함수를 사용한 데이터 로드 방법
- 함수를 사용할때는 반드시 SQL엔진을 경유해야 되기 때문에 direct path에서는 작동하지 않는다.
6. 개행문자를 포함한 데이터 로드 방법(p855)
- 오라클 8.1.6이상 버전에서 내장된 개행문자를 처리하는 옵션들
1) 개행문자 대신 다른 문자를 사용 - 문장에 개행문자가 있을 때마다 \n을 넣음(\n을 CHR(10)으로 대체하는 SQL함수 사용)
2) FIX 속성 사용 - 고정길이 플랫 파일 로드
3) VAR 속성 사용 - 각 줄의 첫 몇 바이트가 그줄에 해당하는 길이를 명시하는 포맷을 사용
4) STR 속성 사용 - 가변 길이 파일 로드
7. LOB 데이터 로드
- LOB : BLOB,CLOB 데이터타입
- LOB필드 로딩하기 위한 방법
1) PL/SQL(DBMS_LOB패키지 사용)
2) SQLLDR
1) PL/SQL로 LOB로딩
|
---|
DBMS_LOB 패키지 프로시저 사용방법 |
1. DB에 DIRECTORY 객체 생성
|
2) BLOB or CLOB에 데이터를 로드 |
a. demo table 생성create table demo ( id int primary key, theClob clob ) / |
b. test.txt 파일 생성host echo 'Hello World\!'>/tmp/test.txt |
c. dbms_lob 패키지로 파일 업로드declare l_clob clob; l_bfile bfile; begin insert into demo values( 1, empty_clob() ) -- CLOB을 EMPTY_CLOB()로 초기화 returning theClob into l_clob; l_bfile := bfilename( 'DIR1', 'test.txt'); -- BFIEL 객체 생성 dbms_lob.fileopen(l_bfile); -- LOB를 OPEN 함으로써 LOB를 읽을 수 있다. dbms_lob.loadfromfile(l_clob, l_bfile, -- INSERT했던 LOB locator에 운영체제파일 /tmp/test.txt의 전체내용을 로드 dbms_lob.getlength(l_bfile)); -- DBMS_LOB.GETLENGTH()를 사용해서 BFILE에 로드된 전체 바이트수를 LOADFROMFILE()루틴에 전달 dbms_lob.fileclose(l_bfile); -- CLOB을 로드하고 BFILE CLOSE end; / |
d. 수행 결과 학인sys@BWD> select dbms_lob.getlength(theClob), theClob from demo; DBMS_LOB.GETLENGTH(THECLOB) THECLOB --------------------------- -------------------- 13 Hello World! |
2) SQLLDR로 LOB 데이터 로딩1) inline 데이터인경우(LOB데이터가 다른 데이터 로우와 같은블록에 저장되는 경우) |
8. lnline LOB 데이터 로딩
- LOB는 일반적으로 개행문자와 특수문자를 포함하고있다.
- 개행문자를 포함한 데이터 로드방법에서 다뤘던 네가지 방법중 하나로 TEST
9. Out of Line LOB 데이터 로딩
- 로드해야 할 LOB 데이터 파일의 이름만 있는것(한 테이블 내에 구조화 된 데이터와 LOB 데이터가 함께있는게 아님)
- LOBFILE - 개행문자를 처리하는 방법보다 더 많은 유연성을 제공
LOBFILE 포멧
- 고정길이 필드( 예를들어 LOBFILE로 부터 100에서 1000바이트를 로드)
- 구분자를 가진 필드( enclosed by 구분자 또는 terminated by 구분자) – 가장 일반적인 형태
- 길이와 값을 가진 가변 길이 필드
10. 객체 컬럼에 LOB 데이터 로딩
- LOB와 복합객체 타입을 가진 테이블에 데이터를 로드
- 복합객체타입은 이미지처리를 사용할 때 가장많이 나타난다.
- 이미지 처리는 복합 객체 타입인 ORDSYS.ORDIMAGE를 사용해서 실행
11. 저장 프로시저에서 SQLLDR를 호출하는 방법
- 저장 프로시저에서는 SQLLDR을 호출할 수 없다.
#SQLLDR 사용 시 주의사항
1. TRUNCATE가 다르게 동작하는 것처럼 보이는 현상
truncate table t reuse storage
|
2. SQLLDR 기본값은 CHAR(255)
Record N: Rejected - Error on table T, column C. Field in data file exceeds maximum length
|
3. 명령어는 컨트롤 파일보다 더 우선시됨
- SQLLDR의 다양한 옵션은 컨트롤 파일 내 또는 명령어 라인에 사용할 수 있다. ex)DATA=FILENAME, INFILE FILENAME
- 명령어는 컨트롤 파일내의 어떠한 옵션보다 우선시 되기때문에 컨트롤 파일내의 실제 사용된 옵션만을 믿어서는 안된다.
#SQLLDR 정리
- 데이터 로딩의 많은 영역과 일반적으로 발생하는 문제를 다루었다.
- direct path로더를 사용한 대용량 데이터 로드에 대해 간단히 언급했다.
- SQLLDR를 사용할 때 자주 발생하는 문제의 답을 제시했다.
문서정보
- 이 문서는 구루비에서 작성하였습니다.
- 이 문서를 다른 블로그나 홈페이지에 게재하실 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^
- 출처 : http://wiki.gurubee.net/display/STUDY/SQL*Loader?
- 구루비 지식창고의 모든 문서는 크리에이티브 커먼즈의 저작자표시-비영리-동일조건변경허락(BY-NC-SA) 라이선스에 따라 자유롭게 사용할 수 있습니다.
'Database' 카테고리의 다른 글
ORACLE SYSTEM 계정 비밀번호 분실시 해결방법 (0) | 2017.02.06 |
---|---|
(Oracle) 오라클 버전 확인 (0) | 2016.11.30 |
(Oracle) String Aggregation Techniques (0) | 2016.11.30 |
(Oracle) Deterministic Function의 비밀 (0) | 2016.09.30 |
오라클 임시 테이블 with ... as (0) | 2016.07.29 |