'Oracle'에 해당되는 글 45건
RMAN으로 복구 하기
Oracle/Backup & Recovery
1. RMAN으로 복구 하기
RMAN 복구 방법 역시 전통적인 방법과 동일하게 Restore 와 Recovery 라는 개념으로 나뉘게 된다.
Restore 는 백업 파일로부터의 복원이고 Recovery 는 Redo Log / ArchiveLog 를 적용시켜 복구 하는 것임
전통적인 방법과의 차이라면 순서와 원리는 동일하지만 전통적인 방법은 이 과정을 관리자가 수동으로 수행했던 것을
RMAN 유틸리티가 수행한다는 것입니다. 아래에서 자세히 각 Case 별로 어떻게 복구하는 지 살펴 보겠다.

Step 1. 실습을 위해 신규 테이블 스페이스를 생성 후 full backup 을 수행
SYS>create tablespace rtest
2 datafile '/app/oracle/oradata/testdb/rtest01.dbf' size 10M;

Tablespace created.

(RMAN으로 접속해서 전체 백업을 수행.)
RMAN> backup as compressed backupset database
2> format '/data/backup/rman/%T_full_%U';

Step 2. rtest01.dbf 파일을 삭제
RMAN> report schema;
Report of database schema for database with db_unique_name TESTDB
List of Permanent Datafiles
===========================
File Size(MB) Tablespace RB segs Datafile Name
---- -------- -------------------- ---------- --------------------------------------------------
1 720 SYSTEM *** /app/oracle/oradata/testdb/system01.dbf
2 660 SYSAUX *** /app/oracle/oradata/testdb/sysaux01.dbf
3 354 UNDOTBS1 *** /app/oracle/oradata/testdb/undotbs01.dbf
4 748 USERS *** /app/oracle/oradata/testdb/users01.dbf
5 345 EXAMPLE *** /app/oracle/oradata/testdb/example01.dbf
6 10 RTEST *** /app/oracle/oradata/testdb/rtest01.dbf
List of Temporary Files
=======================
File Size(MB) Tablespace Maxsize(MB) Tempfile Name
---- -------- -------------------- ---------------- -----------------------------------------------
1 100 TEMP100 100 /app/oracle/oradata/testdb/temp100.dbf
(-- rtest01.dbf 파일을 삭제합니다 --)

RMAN> exit

Recovery Manager complete.

[oracle@localhost ~]$ rm -f /app/oracle/oradata/testdb/rtest01.dbf
[oracle@localhost ~]$ ls /app/oracle/oradata/testdb/rtest01.dbf
ls: /app/oracle/oradata/testdb/rtest01.dbf: 그런 파일이나 디렉토리가 없음

Step 3. 삭제된 파일을 복구
1) 독립형 명령어
RMAN> sql 'alter tablespace rtest offline immediate' ;

RMAN> restore tablespace rtest ;

RMAN> recover tablespace rtest ;

RMAN> sql 'alter tablespace rtest online' ;
2. 작업형 명령어(장애를 한번더 일으켜서 복구)
[oracle@localhost ~]$ rm -f /app/oracle/oradata/testdb/rtest01.dbf
[oracle@localhost ~]$ ls /app/oracle/oradata/testdb/rtest01.dbf
ls: /app/oracle/oradata/testdb/rtest01.dbf: 그런 파일이나 디렉토리가 없음

[oracle@localhost ~]$ rman target sys/oracle

Recovery Manager: Release 11.2.0.2.0 - Production on Sun Aug 18 00:27:31 2013
Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.
connected to target database: TESTDB (DBID=2581382545)

RMAN> run {
2> sql 'alter tablespace rtest offline immediate';
3> restore tablespace rtest ;
4> recover tablespace rtest ;
5> sql 'alter tablespace rtest online ';
6> }
2.Offline 이 안되는 데이터 파일이 삭제된 경우 - DB 종료 후 복구
이번 경우는 Offline 이 안되는 system tablespace 를 삭제 한 후 복구한다.
1 ) 현재 상태 확인 후 system01.dbf 삭제하기
RMAN> report schema;

Report of database schema for database with db_unique_name TESTDB
List of Permanent Datafiles
===========================
File Size(MB) Tablespace RB segs Datafile Name
---- -------- -------------------- ---------- --------------------------------------------------
1 720 SYSTEM *** /app/oracle/oradata/testdb/system01.dbf
2 660 SYSAUX *** /app/oracle/oradata/testdb/sysaux01.dbf
3 354 UNDOTBS1 *** /app/oracle/oradata/testdb/undotbs01.dbf
4 748 USERS *** /app/oracle/oradata/testdb/users01.dbf
5 345 EXAMPLE *** /app/oracle/oradata/testdb/example01.dbf
6 10 RTEST *** /app/oracle/oradata/testdb/rtest01.dbf
List of Temporary Files
=======================
File Size(MB) Tablespace Maxsize(MB) Tempfile Name
---- -------- -------------------- ---------------- -----------------------------------------------
1 100 TEMP100 100 /app/oracle/oradata/testdb/temp100.dbf

RMAN> exit

Recovery Manager complete.

[oracle@localhost ~]$ rm -f /app/oracle/oradata/testdb/system01.dbf
[oracle@localhost ~]$ ls /app/oracle/oradata/testdb/system01.dbf
ls: /app/oracle/oradata/testdb/system01.dbf: 그런 파일이나 디렉토리가 없음
2) DB종료 후 재시작하여 에러 확인
[oracle@localhost ~]$ rman target sys/oracle

Recovery Manager: Release 11.2.0.2.0 - Production on Sun Aug 18 00:36:19 2013
Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.
connected to target database: TESTDB (DBID=2581382545)

RMAN> shutdown immediate;

using target database control file instead of recovery catalog

RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of shutdown command at 08/18/2013 00:36:24
ORA-01116: error in opening database file 1
ORA-01110: data file 1: '/app/oracle/oradata/testdb/system01.dbf'
ORA-27041: unable to open file
Linux Error: 2: No such file or directory
Additional information: 3 <--- 정상 종료가 안되는 것이 확인 됩니다.
RMAN> shutdown abort; <--- 강제로 비정상 종료를 시킵니다.
Oracle instance shut down

RMAN> startup


connected to target database (not started)
Oracle instance started
database mounted
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of startup command at 08/18/2013 00:36:42
ORA-01157: cannot identify/lock data file 1 - see DBWR trace file
ORA-01110: data file 1: '/app/oracle/oradata/testdb/system01.dbf'
(system01.dbf 파일이 없어서 open 이 안됩니다.)
3) 파일을 복원
RMAN> restore tablespace system ;
( 지면 관계상 복원 내용은 생략합니다. 파일 크기가 커서 오래 걸릴 수도 있습니다 )


RMAN> recover database; <-- 비정상 종료가 되었기에 전체 데이터베이스를 복구합니다.
(지면 관계상 복구 내용은 생략합니다)


RMAN> alter database open;
database opened
정상적으로 복구 완료되었다. 위에서는 독립형 명령어로 작업을 했지만 당연히 작업형 명령어로도 가능하다. 직접 해 보시기 바랍니다.
(RMAN) 압축하면서 백업 수행하기(10g, 11g 공통)
Oracle/Backup & Recovery
Oracle 10g RMAN 부터 백업을 수행할 때 압축을 할 수 있다
RMAN에서 지원하는 압축은 기본값은 BZip2 이고 ZLIB 는 옵션으로 선택할 수 있고,
BZip2 방법은 압축 효율은 가장 좋지만 , CPU 부하가 많이 걸릴수 있고 속도 느리다.
그래서 11g R1부터는 Zlib 압축이 추가가 되었는데 CPU 부하는 적고 속도는 빠르지만 압축
효율이 Bzip2 에 비해 상대적으로 좋지 못하다.

ZLIB을 사용하려면 11g 이상 Advanced Compression Option 이 설치되어야 함.
아래 실습은 전, 후 용량 비교와 RMAN의 기본압축인 BZIP2방식을 이용해서 실습하겠음.

1) 압축하지 않고 기본 모드로 전체 Database 백업 수행
RMAN > backup database format '/data/backup/rman/%T_full_%U' ;
2) 압축 하면서 전체 database 백업 수행
RMAN > backup as compressed backupset database
2> format '/data/backup/rman/%T_full_comp_%U' ;
3) 압축하면서 전체 Archive log file 백업
RMAN > backup as compressed backupset archivelog all
2> format '/data/backup/rman/%U_%T';

그 외 각종 백업 옵션들
1) keep - backup 수행 시 bacjupset 보존기간 설정하기
RMAN> backup as compressed backupset tablespace example
2> format '/data/backup/rman/%U_%T'
3> keep until time 'sysdate+90' ;
2) not backuped up - 백업 안된 데이터파일만 골라서 백업
이 옵션은 특정 시점 이후 추가된 테이블 스페이스나 데이터 파일이 있을 경우
그 부분만 백업을 수행하는 기능입니다. 실습을 위해서 전체 백업을 수행 후
테이블 스페이스의 데이터 파일을 추가 한 후 이 옵션을 사용하여 백업을 수행하겠다.
[oracle@localhost ~]$ rman target sys/oracle

RMAN > backup as compressed backupset database
2> format '/data/backup/rman/%U_%T';

Starting backup at 02-DEC-13
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=40 device type=DISK
channel ORA_DISK_1: starting compressed full datafile backup set
channel ORA_DISK_1: specifying datafile(s) in backup set
input datafile file number=00001 name=/app/oracle/oradata/testdb/system01.dbf
input datafile file number=00002 name=/app/oracle/oradata/testdb/sysaux01.dbf
input datafile file number=00005 name=/app/oracle/oradata/testdb/example01.dbf
input datafile file number=00004 name=/app/oracle/oradata/testdb/users01.dbf
input datafile file number=00003 name=/app/oracle/oradata/testdb/undotbs01.dbf
( 이하 내용은 생략합니다 )
위와 같이 5개의 데이터 파일을 백업 수행했다.
그 후에 아래와 같이 test tablespace 를 신규로 생성하고
users tablespace 에 users02.dbf 를 추가 하고 기존에 존재하던 example Tablespace 에
테스트용 테이블 tt500 을 생성하고 데이터를 100 건 추가해서 내용을 변경했습니다.
RMAN> exit

Recovery Manager complete.
[oracle@localhost ~]$ sqlplus sys/oracle as sysdba
SQL*Plus: Release 11.2.0.2.0 Production on Mon Dec 2 02:57:00 2013
Copyright (c) 1982, 2010, Oracle. All rights reserved.

Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SYS>create tablespace test
2 datafile '/app/oracle/oradata/testdb/test001.dbf' size 10M;

Tablespace created.

SYS>alter tablespace users add datafile
2 '/app/oracle/oradata/testdb/users02.dbf' size 5M;

Tablespace altered.

SYS>create table tt500 (no number) tablespace example;

Table created.

SYS>begin
2 for i in 1..100 loop
3 insert into tt500 values (i);
4 end loop;
5 commit;
6 end;
7 /
PL/SQL procedure successfully completed.
그 후 위 옵션을 사용하여 추가된 데이터 파일만 백업 하겠다.
SYS>exit

[oracle@localhost ~]$ rman target sys/oracle

RMAN> backup as compressed backupset database
2> format '/data/backup/rman/%U_%T'
3> not backed up ;

Starting backup at 02-DEC-13
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=46 device type=DISK
skipping datafile 1; already backed up on 02-DEC-13
skipping datafile 2; already backed up on 02-DEC-13
skipping datafile 3; already backed up on 02-DEC-13
skipping datafile 4; already backed up on 02-DEC-13
skipping datafile 5; already backed up on 02-DEC-13
channel ORA_DISK_1: starting compressed full datafile backup set
channel ORA_DISK_1: specifying datafile(s) in backup set
input datafile file number=00006 name=/app/oracle/oradata/testdb/test001.dbf
input datafile file number=00007 name=/app/oracle/oradata/testdb/users02.dbf
channel ORA_DISK_1: starting piece 1 at 02-DEC-13
channel ORA_DISK_1: finished piece 1 at 02-DEC-13
piece handle=/data/backup/rman/0moqfidj_1_1_20131202 tag=TAG20131202T030211
comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:01
Finished backup at 02-DEC-13
위와 같이 마지막 백업 후 데이터 파일이 추가된 부분만 백업이 수행됨을 확인 할 수 있다.
즉 example Tablespace 와 같이 파일 추가 없이 내용만 변경된 것은 이 방법으로 백업 안됨.
만약 기준일을 주고 싶으면 (예를 들어 오늘을 기준으로 최근 5일 이내 추가된 파일) 아래와 같이 since 옵션을 사용하면 된다.
RMAN> backup as compressed backupset database
2> format '/data/backup/rman/%U_%T'
3> not backed up since time='sysdate - 5' ;

3) RMAN 백업 작업 진행사항 확인하기
RMAN 작업을 하다 보면 얼마나 진행되었고 얼마나 남았는지 궁금할 경우가 있다.
이럴 때는 아래의 방법으로 조회하면 결과를 알 수 있음
SYS> SELECT SID, SERIAL#, CONTEXT, SOFAR, TOTALWORK,
2 ROUND(SOFAR/TOTALWORK*100,2) "%_COMPLETE"
3 FROM V$SESSION_LONGOPS
4 WHERE OPNAME LIKE 'RMAN%'
5 AND OPNAME NOT LIKE '%aggregate%'
6 AND TOTALWORK != 0
7 AND SOFAR <> TOTALWORK ;
SID SERIAL# CONTEXT SOFAR TOTALWORK %_COMPLETE
---------- ---------- -------------- ------------- --------------- -----------------
15 18683 1 57530 202640 28.39
SYS> /
SID SERIAL# CONTEXT SOFAR TOTALWORK %_COMPLETE
---------- ---------- ------------- ------------- --------------- ------------------
15 18683 1 64890 202640 32.02
…  …   …   …   …   …   …   …   …   …   …   …   … ..
SYS> /
no rows selected <- 작업이 완료되면 이렇게 나옴

'Oracle > Backup & Recovery' 카테고리의 다른 글

RMAN 임시경로에서 복구하기  (0) 2014.11.14
RMAN으로 복구 하기  (0) 2014.11.14
RMAN 증분백업(incremental backup)  (0) 2014.11.13
RMAN backup 종류  (0) 2014.11.13
RMAN (Recovery manager) channel 설정  (0) 2014.11.13
RMAN 증분백업(incremental backup)
Oracle/Backup & Recovery

1. 차등 증분 백업 (Incremental backup)
증분 백업이란 이전에 백업 받았던 백업파일과 비교해서
변경된 부분만 골라서 백업을 수행하는 것을 말한다.
차등 증분 백업과 누적 증분 백업이 있고, 이 기능은 Enterprise Edition 에서만 지원된다
그리고 10g 버전부터는 Block change tracking 이라는 기능이 지원이 되어 더 빠른 incremental backup이 지원됨.

                                                                             

                                                                             차등 등분 백업



차등 증분 백업은 백업 받을 때 설정했던 숫자가 자기보다 작거나 같으면 그 시점부터 지금까
지 모든 데이터를 백업을 받는 것을 말함
차등 증분 백업을 수행하는 명령어 예를 보겠다.

RMAN> run {
2> allocate channel c1 type disk;
3> backup
4> incremental level 0 <-- 차등 증분 백업을 의미합니다.
5> database
6> format '/data/backup/rman/%U_%T';
7> }

위 그림의 예를 들어 일요일에 level 0으로 a라는 데이터를 백업 받았고,
월요일까지 b라는 데이터가 추가되었다면 월요일에 level 3으로 백업을 수행하면
월요일보다 level 숫자가 같거나 작은 날을 찾아서 그 날짜 이후로 변경된 것만 백업을 받는 것이니
월요일보다 level 숫자가 작거나 같은날은 일요일이니까 월요일에는
일요일과 월요일 사이에 변경된 b 라는 데이터만 백업 받게 된다.
화요일은 level 3으로 받게 되면 화요일 이전에 백업 받았던 날짜의 level 을 순서대로 찾아서

화요일의 level 3과 같거나 작은 날을 찾게 되는데 월요일도 level 3이므로 월요일과 화요일
사이에 변경된 데이터 c 만 백업 받게 되는 것이다.

수요일은 level 2로 백업 받게 되면 이전 날짜들의 백업을 역순으로 조사해 보는데 화요일은
3으로 수요일보다 크니까 통과하고, 월요일도 3이니까 통과하고 일요일이 0 이니까 일요일
이후부터 수요일까지 변경된 데이터 b,c,d 모두를 백업 받게 됨.


1. 누적 증분 백업 (Incremental backup)

차등 증분 백업은 현재 날짜와 이전 날짜의 level 숫자가 작거나 또는 같으면 그 이전 날짜와

지금 날짜 사이의 변경된 모든 데이터를 백업 받았지만,

누적 증분 백업은 방식은 차등 증분 백업과 동일하다.

하지만 기준되는 날짜를 찾기 위해 작은 날짜가 와야 한다는 점이 차이점.


누적 증분 백업





RMAN> run { 2> allocate channel c2 type disk; 3> backup 4> incremental level 3 cumulative <-- 누적 증분 백업 옵션 5> table

위 그림에서 화요일 과 금요일, 토요일에 level 에 C 가 붙은 것이 누적 증분 백업이다
나머지 내용들은 다 동일하고 화요일에 누적 증분 백업을 받는다면 화요일의 3보다 작은 숫자
를 가진 날짜인 일요일 이후에 변경된 모든 내용을 백업 받아야 하기 때문에 화요일은 월,
화요일 사이에 변경된 b, c 데이터를 모두 백업 받게 되는 것입니다. 금요일과 토요일도 동일한
내용이지요.
이 경우에 만약 수요일 백업 전에 장애가 발생했다면 일요일 전체 백업 파일과 화요일 백업
파일 하나만 복구하면 전체 데이터를 다 복구 할 수 있다.



RMAN backup 종류
Oracle/Backup & Recovery

1. RMAN 백업 종류


(*RMAN Backup시에 주의 사항*)
- open 상태에서 백업을 받으려면 데이터베이스가 archive log mode 로 운영되어야 합니다.
- 데이터베이스가 마운트 또는 오픈되어 있어야 합니다.
- 운영중인 온라인 리두 로그 파일은 백업이 불가합니다
- 노 아카이브모드 에서는 Clean 백업만 사용 가능합니다.
(Clean Backup이란 오프라인 테이블스페이스나 읽기전용 테이블스페이스 백업을 의미합니다.)
- 해당 테이블스페이스는 백업모드이어서는 안됩니다.
- RMAN으로 백업을 수행하는 것은 Begin backup 시의 조건들과 동일해야 합니다.

1) backupset 으로 백업 수행 (default)
Backupset 이란 RMAN이 백업파일을 만들 때 RMAN만이 알 수 있는 형태로
백업파일을 생성하는데 이것을 backupset 이라고 하며 기본값.
이 방법으로 백업을 수행해야 RMAN 백업의 장점들을 모두 사용할 수 있다.
Backup piece란 backupset 의 크기가 너무 클 경우 분할해서 여러 개의 파일로 나누어서 백업 받을 수 있는데
분할되는 하나의 백업 파일을 backup piece라고 부른다.

2) Image copy로 백업 수행
Image copy 란 OS 명령어로 Begin backup 하는 것과 가장 유사한 방법.
RMAN> copy
2> datafile '/app/oracle/oradata/testdb/example01.dbf'
3> to '/data/backup/rman/example01.dbf.bak';
2. RMAN 명령어 종류
1) 작업형 명령
작업형 명령어는 마치 프로그램의 스크립트처럼 여러 개의 명령어를 한꺼번에 사용할 수 있는 방법.
작업형 명령어는 run { 수행할 명령들; } 의 형식으로 구성이 된다.
RMAN> run {
2> allocate channel ch1 type disk
3> format '/data/backup/close/%T_example.bak' ;
4> backup tablespace example ;
5> }
2) 독립형 명령 (stand alone)
이 명령방식은 RMAN> prompt 에 1개의 명령어만 들어가는 방식.
RMAN> backup tablespace example ; <- 1 개의 명령어가 입력됩니다.
RMAN> backup <- 이부분을 여러줄로 쓴다 해도 ; 이 한 개이므로 1개의 명령어.
2> tablespace 마치 SQL문장을 여러 줄에 써도 ; 이 한 개이면 한 개의 명령어.
3> example; 인 것과 마찬가지임.
RMAN (Recovery manager) channel 설정
Oracle/Backup & Recovery
1. channel 설정하기
RMAN 에서 Channel 이란 쉽게 말하면 백업과 복구를 하는 경로를 의미한다..
백업을 수행하기 전에 Channel을 할당 해 줘야 RMAN이 백업 / 복구를 수행할 수 있고
복구를 할 때는 Channel을 할당하지 않아도 되지만 백업을 할 경우는 반드시 Channel을 할당해 줘야 한다.
Channel을 할당하는 방법은 자동 Channel설정과 수동Channel 설정이 있다.

1) 자동 channel 설정하기
자동 Channel이란 백업을 수행할 때 별도의 경로를 주지 않아도 정해진 위치로 백업을 받는
것을 말하며 default channel 의 의미가 있다.
아래와 같이 설정합니다.
[oracle@localhost ~]$ rman target / catalog rcuser/rcuser@rcserver (복구 카탈로그 서버 사용시)
[oracle@localhost ~]$
[oracle@localhost ~]$ rman target sys/oracle (복구 카탈로그  서버 사용 안할시)
[oracle@localhost ~]$
자동 channel 명령어
RMAN > configure default device type to disk (자동 channel 설정 명령어)
(이렇게 설정하면 default device가 파라미터 파일의 db_recovery_file_dest 파라미터의 경로로 설정이 됩니다.)
자동 특정 경로 명령어
[oracle@localhost ~]$ mkdir /data/backup/rman (rman이라는 디렉토리 생성)
[oracle@localhost ~]$ rman target sys/oracle (RMAN 접속)
RMAN > configure channel device type disk
2> format '/data/backup/rman/%U_%T'; (%U는 파일명 중복 안되게,%T는 백업날짜)
RMAN > backup tablespace example ;
2) 수동 channel 명령어
RMAN> run {
2> allocate channel ch1 type disk (ch1 명은 마음대로 줘도 됨)
3> format '/data/backup/close/%U_%T' ;
4> backup tablespace example;
5> }
위의 작 업은 아래와 같이 독립형 명령어로도 가능하다.
RMAN> backup tablespace example
2> format '/data/backup/open/%U_%T' ;
이름으로 직접 지정
RMAN> backup tablespace example
2> format '/data/backup/rman/%T_example.bak';
tablespace생성과 자동으로 사이즈 늘리기
Oracle/SQL
SQL> create tablespace spider
 2   datafile '/app/oracle/oradata/sprider01.dbf' size 10m autoextend on;
테이블 스페이스를 10m로 생성하고 10m가 가득차면 자동으로 사이즈를 늘린다.

'Oracle > SQL' 카테고리의 다른 글

테이블스페이스 소유자 확인  (2) 2015.01.13
중복된 row 데이터 삭제하는 방법  (0) 2014.11.11
SQL*Loader 실행하기  (0) 2014.11.10
[ORA-12988] cannot drop column owned by sys 에러  (0) 2014.10.31
PL/SQL 결과물 출력하기  (0) 2014.10.31
중복된 row 데이터 삭제하는 방법
Oracle/SQL
ROWID를 이용해서 중복된 데이터를 제거할수있다.
SQL> delete from taran a
  2  where rowid > (select min(rowid) from taran b
  3   where b.no = a.no);

3 rows deleted.
중복 된 데이터값중에 rowid가 큰값 제거
SQL> DELETE FROM emp a
     WHERE ROWID < (SELECT MAX(ROWID) 
                    FROM emp b
                    WHERE a.empno = b.empno);
나중에 들어온 데이터를 살릴경우
SQL*Loader 실행하기
Oracle/SQL

아무옵션 없이 sqlldr 명령어만 실행하면 옵션들이 나옵니다.

[oracle@localhost ~]$ sqlldr

SQL*Loader: Release 11.2.0.2.0 - Production on Thu Mar 28 04:02:10 2013

Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.


Usage: SQLLDR keyword=value [,keyword=value,...]

Valid Keywords:

    userid -- ORACLE username/password
   control -- control file name
       log -- log file name
       bad -- bad file name
      data -- data file name
   discard -- discard file name
discardmax -- number of discards to allow          (Default all)
      skip -- number of logical records to skip    (Default 0)
      load -- number of logical records to load    (Default all)
    errors -- number of errors to allow            (Default 50)
      rows -- number of rows in conventional path bind array or between direct path data saves
               (Default: Conventional path 64, Direct path all)
  bindsize -- size of conventional path bind array in bytes  (Default 256000)
    silent -- suppress messages during run (header,feedback,errors,discards,partitions)
    direct -- use direct path                      (Default FALSE)
   parfile -- parameter file: name of file that contains parameter specifications
  parallel -- do parallel load                     (Default FALSE)
      file -- file to allocate extents from
skip_unusable_indexes -- disallow/allow unusable indexes or index partitions  (Default FALSE)
skip_index_maintenance -- do not maintain indexes, mark affected indexes as unusable  (Default FALSE)
commit_discontinued -- commit loaded rows when load is discontinued  (Default FALSE)
  readsize -- size of read buffer                  (Default 1048576)
external_table -- use external table for load; NOT_USED, GENERATE_ONLY, EXECUTE  (Default NOT_USED)
columnarrayrows -- number of rows for direct path column array  (Default 5000)
streamsize -- size of direct path stream buffer in bytes  (Default 256000)
multithreading -- use multithreading in direct path
 resumable -- enable or disable resumable for current session  (Default FALSE)
resumable_name -- text string to help identify resumable statement
resumable_timeout -- wait time (in seconds) for RESUMABLE  (Default 7200)
date_cache -- size (in entries) of date conversion cache  (Default 1000)
no_index_errors -- abort load on any index errors  (Default FALSE)

PLEASE NOTE: Command-line parameters may be specified either by
position or by keywords.  An example of the former case is 'sqlldr
scott/tiger foo'; an example of the latter is 'sqlldr control=foo
userid=scott/tiger'.  One may specify parameters by position before
but not after parameters specified by keywords.  For example,
'sqlldr scott/tiger control=foo logfile=log' is allowed, but
'sqlldr scott/tiger control=foo log' is not, even though the
position of the parameter 'log' is correct.
[oracle@localhost ~]$
위 값중에 errors 값이 default 50으로 되어있는데 50값보다 많은 에러가 발생하면 작업이 중단되어
더 이상 진행이 되지 않는다는 의미 이므로 옵션을 줄때 아주 충분히 값을 지정해 작업해야 합니다.

1) SQL*Loader 실습 1 - 입력할 데이터가 외부 프로그램 자료일 경우
(아래 그림의 엑셀 데이터를 오라클의 F_Animal 테이블로 입력할 경우)

엑셀을 열어서 위와 같이 데이터를 입력했습니다.

위의 엑셀 데이터를 csv(쉼표로구분) 파일로 저장합니다. 그리고 파일이름은 a1으로 하겠습니다.

저장이 완료 된 파일은 winscp나 xftp를 이용해서 oracle home의 원하는 디렉토리에 옮깁니다.
SQL> !vi /app/oracle/tran_ex/tran.cvs

15,Heracules baboon,21cm,Hysterocrates hercules,사나움,보통,나이지리아,10년이상,버로우
16,King baboon,23cm,Citharischius crawshayi,사나움,빠름,탄자니아 케냐 등,15년,버로우
~
~
vi editor를 이용해 xftp로 옮긴 tran.csv파일을 연다.
필요한것만 빼고 위처럼 만들어준 후에 저장 종료한다.

control file
SQL> !vi /app/oracle/tran_ex/tran.ctl

load data
infile "/app/oracle/tran_ex/tran.csv"
append
into table taran
fields terminated by ','
(no,name,max_size,technical_name,personality,growth,habitat,max_age,type)
~
~
위처럼 control file 만들어준후에 저장종료한다.

이제 데이터를 넣을 테이블을 만들어주면 된다.
SQL> create table taran
  2  (no number,
  3  name varchar2(50),
  4  max_size varchar2(50),
  5  technical_name varchar2(50),
  6  personality varchar2(50),
  7  growth varchar2(50),
  8  habitat varchar2(50),
  9  max_age varchar2(50),
 10  type varchar2(10)) to tablespace spider;

created table
테이블을 생성했으면 이제 데이터를 넣어주면 된다.
[oracle@dbserver ~]$
[oracle@dbserver ~]$ sqlldr scott/tiger control='/app/oracle/tran_ex/tran.ctl'

SQL*Loader: Release 11.2.0.2.0 - Production on Tue Nov 11 09:12:39 2014

Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.

Commit point reached - logical record count 2
[oracle@dbserver ~]$
2개의 데이터가 들어갔다.
확인해보자

SQL> select * from taran
  2  order by 1;

  NO NAME                                MAX_SIZE TECHNICAL_NAME                 PERSONALIT GROWTH     HABITAT                        MAX_AGE         TYPE
---- ----------------------------------- -------- ------------------------------ ---------- ---------- ------------------------------ --------------- ----------
   0 Mexican Golden Redrump              15cm     Brachypelma ruhnaui            온순함     느림       멕시코                         20년이상        배회성
   1 Mexican_Redknee                     13cm     Brachypelma_smithi             온순함     느림       멕시코                         15년 이상       배회성
   2 Mexican_redleg                      15cm     Brachypelma_emilia             온순함     느림       멕시코                         15년 이상       배회성
   3 Antilles Pinktoe                    14cm     Avicularia versicolor          예민함     보통       마티니크섬                     14년            나무위성
   4 Giant Mustard stripe                18cm     Grammastola aureostriatum      온순함     보통       프랑스챠코                     20년 이상       배회성
   5 Mexican Pink                        15cm     Brachypelma Klaasi             온순함     느림       멕시코                         20년 이상       배회성
   6 Mexican flame knee                  15cm     Brachypelma Klaasi             온순함     느림       멕시코                         20년 이상       배회성
   7 Mexico Fireleg                      14cm     Brachypelma Klaasi             온순함     느림       멕시코                         20년 이상       배회성
   8 Costa Rican Zebra                   12cm     Aphonopelma seemani            온순함     보통       파나마 과태말라 열대우림       20년 이상       배회성
   9 Brazillian giant white knee         22cm     Acanthoscurria geniculata      보통       빠름       브라질 아마존                  15년            배회성
  10 Mexican true red leg                13cm     Brachypelma emillia            온순함     보통       멕시코                         15년 이상       배회성
  11 Goliath birdeater                   30cm     theraphosa blondi              사나움     빠름       베네수엘라 등                  25년            배회성
  12 Peruvian Blonde                     15cm     Lasiodoredes polycuspulatus    온순함     보통       페루                           null            null
  13 Brazillian salmon pink              15cm     Lasiodoredes parahybana        공격적     빠름       브라질                         20년            배회성
  14 Amazon Spaier Pinktoe               12cm     Avicularia fasciculata         온순함     보통       브라질                         10년이상        나무위성
  15 Heracules baboon                    21cm     Hysterocrates hercules         사나움     보통       나이지리아                     10년이상        버로우
  16 Usambara Orange Baboon              15cm     Pterinochilus Murinus          엄청사나움 엄청빠름   탄자니아 케냐 등               12년            3성
  17 King baboon                         23cm     Citharischius crawshayi        사나움     빠름       탄자니아 케냐 등               15년            버로우

18 rows selected.

SQL>
데이터가 정상적으로 들어가져 있다.
(*추가적으로 실습하면서 같이 썼던 쿼리들*)
SQL> insert into taran(clumns.....) /데이터 여 넣기
  2  values(key....)
-------------------------------------------
SQL> alter table taran  /type 바꾸기
  2  modify(clumns type);
-------------------------------------------
SQL> alter table taran /컬럼추가
  2  add (clumns type)
-------------------------------------------
update taran  /업데이트. where절 조심
  2  set 변경할 컬럼 = 변경된 값
  3  where 조건
-------------------------------------------
SQL*Loader 수행 전 확인해야 할 사항들
Oracle

오라클을 설치할 때 기본적으로 설치되는 유틸리틴데

예를들어 신규 ERP 구축 프로그램에서 기존 엑셀 데이터를 오라클DB로 입력해야 할 경우 굉장히 많은 

데이터를 일일이 수동으로 입력해야 하는데 이럴 때 쓰이는 유틸리티가 SQL*Loader 입니다.


1) SQL*Loader 수행 전 확인해야 할 사항들

a. 우선 NLS_LANG 환경변수를 먼저 체크해서 서버의 Character set과 동일하게 설정하세요.

이 환경변수는 서버에게 현재 클라이언트가 입력할 데이터 유형을 알려주는 역할을 하게 된다.

만약 이 변수가 서버의 Character set과 다를 경우 내부적으로 변환이 일어나기 때문에 속도 저하 

및 데이터가 입력되다가 에러가 발생할 수도 있게 된다.


[oracle@localhost ~]$ env | grep NLS_LANG
NLS_LANG=AMERICAN_AMERICA.KO16MSWIN949
[oracle@localhost ~]$
b.ORACLE_HOME 환경변수를 확인하세요.
[oracle@localhost ~]$ env | grep ORACLE_HOME
ORACLE_HOME=/app/oracle/product/11g
[oracle@localhost ~]$
c.LD_LIBRARY_PATH 환경변수를 확인하세요(UNIX만 해당)
[oracle@localhost ~]$ env | grep LD_LIBRARY_PATH
LD_LIBRARY_PATH=/app/oracle/product/11g/lib:/lib:/usr/lib:/usr/local/lib
d.ORA_NLS33이나 ORA_NLS10 환경변수를 설정하세요.
[oracle@localhost ~]$ env | grep ORA_NLS33
ORA_NLS33=/app/oracle/product/11g/ocommon/nls/admin/data
[oracle@localhost ~]$
[oracle@localhost ~]$ env | grep ORA_NLS10
[oracle@localhost ~]$
ORA_NLSxx란 환경변수는 Character set을 저장하고 있는 .nlb 파일의 위치를 지정하는 변수입니다.
이는 오라클 버전마다 다르며 ORA_NLS32파라미터는 8버전이상부터 사용할 필요가 없고
ORA_NLS33파라미터는 10G 이상 버전부터 사용할 필요가 없습니다.
2) SQL*Loader의 구조



위 그림처럼 SQL*Loader는 OS에서 다른 응용프로그램에서 생성된 특정 규칙을 가진 텍스트 파일을 메모리에 거치지 않고
데이터파일로 직접 대량 입력하게 됩니다.
a. 입력 파일을 여러 개 가질 수 있다.
b. 입력 파일의 여러 개의 레코드를 입력 시 하나의 논리적 레코드로 가공하여 한꺼번에 입력이 가능하다.
c. 입력 필드가 고정길이나 가변길이로 가능합니다.
d. 입력 데이터가 문자, binary,날짜,packed 십진 데이터,zone 십진 데이터 등의 여러가지 형태가 가능합니다.
e. 하나의 입력 데이터로 여러 테이블에 동시 입력이 가능하다.
f. 테이블의 기존 데이터를 변경하거나 지우고 다시 입력하거나 추가하는 등의 작업도 가능합니다.
g. SQL 함수를 사용하여 입력 가능합니다.
h. Sequence를 사용하여 데이터를 순차적으로 입력할 수 있습니다.

3)SQL*Loader를 구성하는 주요 파일들 



위 그림에서 보는것과 같이 SQL*Loader에는 2개의 "입력 관련 파일과" 3개의 "출력 관련 파일"을 사용할 수 있습니다.
아래에서 각각의 파일에 대해서 자세히 살펴보겠습니다.


*Control File*
이 파일은 Oracle을 운영하기 위해 사용하는 conrol file이 아니라 SQL*Loader를 사용하기 위한 정보를 가진 control file입니다.
피 파일 안에 SL*Loader를 실행시키기 위한 각종 정보가 들어 있으며 확장자는 ctl로 합니다. 자세한건 아래와 같습니다.

--sample control file--

LOAD DATA : 새로운 데이터 입력이 시작됨을 의미합니다.
만약 작업이 중단 되었다가 다시 시작해야 할 경우 CONTINUE LOAD DATA 문장을 사용합니다.
INFILE* : 입력하고자 하는 데이터파일이 외부에 있을 경우에는 * 대신 파일이름을 적어주면 되고
CONTROL FILE 내부에 데이터가 있을 경우 *를 사용합니다.
DISCARDFILE "DISFILE.DSC' : 폐기된 파일 목록을 저장할 파일 WHERE 절의 조건에 해당하지 않아 폐기되는 파일을 기록함
필요할 경우만 생성하며 내용을 수정해서 다시 사용 가능합니다.
RELACE : 테이블의 기존 행을 모두 삭제(DELETE)한 후 다시 입력하라는 의미
INSERT : 내용이 없는 테이블에 신규 데이터를 입력할 경우 사용합니다.
TRUNCATE : 기본 내용을 모두 TRUNCATE한 후 다시 입력 하라는 의미
APPEND : 기존 내용 아래에 신규 내용을 추가하라는 의미
INTO TABLE STEST : 데이터를 입력할 테이블명을 적어줍니다.
WHEN : 입력하고자 하는 조건이 있을 경우 이곳에 적어줍니다.
FIELDS TERMINATED BY ',' : 각 필드의 구분 기호를 이곳에 적어줍니다.
OPTIONALLT ENCLOSED BY ',' : (A,B,C...) < 데이터가 있을 경우 칼럼 이름을 적어줍니다.
BEGINDATA : A,B,C ... > 실제 데이터를 적어줍니다.

위에서 본 여러가지 옵션들을 활용해서 SQL*Loader 실습을 해보겠습니다.


'Oracle' 카테고리의 다른 글

SQL* Loader로 외부 데이터 입력하기  (0) 2014.11.10
윈도우 Client로 Oracle Server 접속하기  (0) 2014.11.04
toad for oracle 설치 및 세팅  (0) 2014.11.04
OEL5 + Oracle 11g rac rawdevice  (0) 2014.09.28
oracld 11g rac asm  (0) 2014.09.26
SQL* Loader로 외부 데이터 입력하기
Oracle



오라클에서 데이터를 입력하는 방식은 2가지로 나뉩니다.
1. Convertional path
2. Direct path
Direct path는 다른말로 Bulk Load방식이라고 부르기도 합니다.

SQL Loader는 위 기능 중 Direct path 방식을 이용하여 대량의 데이터를 아주 빠른 속도로 입력할수 있는 유틸리티 중에 하나인데,
이 기능을 사용하려면 입력하는 테이블에 select 할 수 있는 권한만 있으면 가능합니다.

1) Convertonal Path Method 기본모드
데이터가 입력되거나 조회될때 항상 메모리(database buffer cache)를 통해서 작업된다.
사용자가 select를 수행하면 우선 database buffer cache에 해당 블록이 load되어 있는지를 살펴보고
있으면 바로 Fetch를 하고 없으면 data file에서 해당 block을 불러와(load) Fetch를 하게 됩니다.





또한 새로운 데이터를 insert할 경우 database buffer cache의 free list에서 빈 블록을 찾아보고 없을 경우 

data file에서 빈 블록을 database buffer cache로 이동(load)한 후 데이터를 insert하게 됩니다.


단, 데이터를 load하는 도중에 다른 사용자와 작업 승인 테이블을 공유해서 작업 할 수 있다는 장점이 있지만

속도가 Direct load보다 느리고 redo log와 undo data가 많이 발생한다는 단점이 있습니다.


convertional path방식은 자주 사용하는 블록을 메모리에 공유해서 디스크 I/O를 줄이기 위해서 도입된 방식입니다.

그래서 자주 사용하는  블록은 메모리에 저장해서 재활용하고 없을경우에만 디스크에 찾아서 메모리로 적재합니다.

하지만 만약에라도 재사용하지 않는 블록이 메모리에 남게되면 오히려 심각한 성능 저하를 발생시킬 수가 있습니다.


이럴경우 메모리에 걸쳐 사용하지 않고 직접 블록에 작업하는것이 훨씬 더 빠를건데 그래서 등장한 방법이

Direct Path 방법입니다. 아래에서 더 자세하게 살펴보겠습니다.


2)Direct path Mothod



위 그림에서 보는것처럼 메모리(database buffer cache)에 저장하지않고 바로 data file로 데이터를 입력합니다.


3) 입력원리


Convertional Path 방법에서는 위 그림처럼 High Water Mark 왼쪽에 있는 빈 블록(free block)에 데이터를 입력하게 됩니다.

*HWM*

Data file에서 사용한  블록을 표시하는 마크로써 일종의 책갈피와 같은 역할을 하게 해주는게 HWM이다.

데이터를 입력할 때는 HWM 왼쪽부터 입력하는데 왼쪽블록을 다 사용하게 되면 잠시 일시정지하고 HWM을

오른쪽으로 이동하여 빈 블록들(EXTENT)을 확보한후 다시 데이터를 입력하게 됩니다. 

이러한 과정을 반복하게 되는데 이것을 HWM Bump up 이라고 한다.


하지만 이렇게 HWM Bump Up을 하면서 데이터를 입력하게 되면 HWM Bump up을 하면서 소요되는 시간이 많이 걸리기 때문에

대량의 데이터를 입력할 때는 문제가 많은 방식입니다.


반면에 Direct path 방식은 처음부터 HWM 오른쪽에 비어있는 블록을 한꺼번에 데이터를 입력하고 commit을 한 번만 하는 방식입니다.

그래서 HWM Bump up이 별도로 필요 없고 HWM오른쪽에 입력되는 블록이라 다른 세산과 공유도 되지 않기에 undo data도 필요없습니다.

만약 roll back을 하더라도 실제 block을 그대로 두고 dictionary 정보만 roll back 하기에 roll back시간도 적게 걸립니다.


하지만, redo를 사용하지 않으므로 중간에 장애가 생길 경우 처음부터 다시 입력해야 합니다. 

속도고 빠르다는 장점이 있지만 반면에 Direct path의 단점은 data를 입력하는 작업을 할때 해당 테이블에 Exclusive Lock을 설정하기 때문에

다른 트랜잭션이 DML을 일으키지 못하도록 막게 되어 동시에 변경 작업을 할 수 없게 된다는 점입니다.


즉 Direct path로 입력하는 작업은 사용량이 적은 시간에 해야한다는 점과 해당 테이블에서 nologging 옵션이 활성화 되어있어야 합니다.

오라클에서는 대량의 데이터를 입,출력할때 Direct path방법을 지원하며, Direct path방법은 아래와 같이 분류됩니다.

          1.정렬할 때 (Temp segment에 읽고 쓰기 합니다)

          2.병렬 작업 할 때(Parallel,Append 옵션을 사용할때)

          3.Direct 옵션 사용시(export,datapump 등)

disk I/O가 오라클 성능에 괸장한 영향을 주므로 각 상황에 맞도록 방법을 선택해서 사용하여야 합니다.

'Oracle' 카테고리의 다른 글

SQL*Loader 수행 전 확인해야 할 사항들  (0) 2014.11.10
윈도우 Client로 Oracle Server 접속하기  (0) 2014.11.04
toad for oracle 설치 및 세팅  (0) 2014.11.04
OEL5 + Oracle 11g rac rawdevice  (0) 2014.09.28
oracld 11g rac asm  (0) 2014.09.26