본문 바로가기

DataBase/Oracle

[펌] import/export 사용

* import/export.

데이터베이스의 백업(backup)과 복구(recovery), 다른 머신으로 데이터나 데이터 베이스를 옮기기 위해 사용된다. 오라클의 imp/exp 유틸은 오라클전용 binary file 형식으로 데이터를 가공하므로 오라클 사이에서만 쓸수 있다.  정리해 볼까?

import/export 유틸리티의 사용목적

- 백업과 복구 ( 작은 디비의 경우 )

- 데이터 재구성 ( re - fragmentation,  organization )

- 디비가 날아갈 것에 대비해서.

- 디비간의 tablespace 이동.

 

* 사용법

imp/exp 라고 쳐도 아무 응답이 없는 경우... DBA등 시스템 관리자가 보안상의 이유로 막았을 수 있고( 이럴경우, 전화해야지), 아닌 경우는 path 에 추가되지 않아서 이다. path 에 $ORACLE_HOME/bin 를 추가한다.  도움말이 필요한 경우, "exp help=yes" 또는 "imp help=yes" 라고 친다.

 

* 테이블에서 특정 subset 만 옮기고 싶다.

oracle 8i 부터 지원되는데, 옵션에 'QUERY='를 추가한다.

예 ) exp scott/tiger tables=emp query=\"where deptno=10\"

 

* import 시에, 모니터링 하고 싶다면..

방법 1.

select substr(sql_text,instr(sql_text,'INTO "'),30) table_name,
         rows_processed,
         round((sysdate-to_date(first_load_time,'yyyy-mm-dd hh24:mi:ss'))*24*60,1) minutes,
         trunc(rows_processed/((sysdate-to_date(first_load_time,'yyyy-mm-dd hh24:mi:ss'))*24*60)) rows_per_min
  from   sys.v_$sqlarea
  where  sql_text like 'INSERT %INTO "%'
    and  command_type = 2
    and  open_versions > 0;

방법 2.

FEEDBACK=n 이라는 옵션을 붙이면, N Row 가 들어가면 '.' 이 찍힌다.

 

* 다른 Tablespace 로 테이블을 이동시킬 수 있는가?

오라클에서 이것을 지원한 특별한 옵션이 있는 건 아니고... 다음 방법중 하나를 사용한다.

 

방법 1. 올바른 테이블스페이스에서 테이블을 다시 만들어 낸다.

1. INDEXFILE= 옵션을 통해서, 덤프파일을 import 한다.

2. 위의 인덱스 파일을 수정해서, 올바른 tablespace 로 수정한다.

3. 인덱스 파일을 실행한다. 이러면 테이블도 같이 만들어진다.

4. IGNORE=Y 옵션을 사용하여 테이블을 옮긴다.

 

방법 2. 사용자의 default tablespace 를 바꿔라.

1. 사용자에게 UNLIMITED TABLESPACE 권한을 없앤다.

2. export 된 테이블스페이스의 사용자 쿼터를 없앤다. 흠.. 이렇게 하믄, 사용자의 default tablespace 에 테이블을 만들게 된다고 한다.

3. tablespace 를 새로 만들고, 테이블을 import 한다.

 

* import 하기전에, sequence, index 는 drop해라.

 

* 다른 버전 사이에서 imp/exp

upwards compatible. 당연하게도,, 신버전은 구버전을 받아올 수 있다. 반대, 즉 backwards compatibility 를 위해서는 catexpX.sql  를 사용한다.  예를 들어, $ORACLE_HOME/rdbms/admin/catexp7.sql 를 사용해서 오라8 에서 오라7.3 으로 imp/exp 할 수 있다.

 

* 파일 여러개로 export 하는 법.

파일 사이즈를 지정해서 여러 파일로 나누어서 export 한다. 이렇게 하면, 유닉스의 2기가 한계도 피해 갈 수 있다.

예) exp SCOTT/TIGER FILE=D:\F1.dmp,E:\F2.dmp FILESIZE=10m LOG=scott.log

 

* 유닉스의 2기가 한계를 피하는 법

만들면서 바로 gzip 을 이용해 압축하는 방법을 사용한다.

        # create a named pipe
        mknod exp.pipe p
        # read the pipe - output to zip file in the background
        gzip < exp.pipe > scott.exp.gz &
        # feed the pipe
        exp userid=scott/tiger file=exp.pipe ...


 

* imp/exp 의 수행능력을 향상시키는 방법

EXPORT

- BUFFER 옵션의 값을 좀더 높게 준다. (예를 들어, 2M)

- RECORDLENGTH  옵션의 값을 좀더 많이 ( 예를 들어, 64 K )

- 불필요한 프로그램의 실행을 중지하고,

- multi export 라면, 다른 물리공간을 사용하도록 한다.

- NFS 파일 시스템으로 export 하지 마라.

IMPORT

- 인덱스 파일을 만들어라. 파일내에 있는 인덱스는 import 되지 않는다.

- 데이터 파일과 인덱스 파일은 물리적인 디스크 공간을 분리하라.

- init$SID.ora 파일의 DB_CACHE_SIZE (DB_BLOCK_BUFFERS : 9i 이전 버전)의 사이즈를 크게한다.

- LOG_BUFFER 의 크기를 늘인다.

- redo log archiving 을 중지한다. (ALTER DATABASE NOARCHIVELOG;)

- 큰 사이즈의 rollback segment 를 가지는 큰 tablespace 를 만든다. system rollback segment 를 제외한 나머지 rollback segment 를 offline 상태로 만든다.

- COMMIT=N

- ANALYZE=N

 

* imp/exp 할때 만나는 에러.

ORA-00001: Unique constraint (...) violated

중복되었단 이야기고, IGNORE=NO 를 통해서 이미 존재하는 테이블을 건너뛴다.

ORA-01555: Snapshot too old

사용자가 export를 멈출 것인지 물어보거나, CONSISTENT=NO를 옵션을 준다.

ORA-01562: Failed to extend rollback segment

rollback segment 의 크기를 늘여주거나 import 할때 COMMIT=Y 옵션을 사용한다.

IMP-00015: Statement failed ... object already exists...

 IGNORE=Y  옵션을 준다. 조심할 것은 중복된 row 가 생기지 않게..

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

중복행제거  (0) 2008.08.07
[펌] 쿼리 - 사용자별 테이블 생성 스크립트 알아내기  (0) 2008.08.05
[펌] 오라클 딕셔너리  (0) 2008.08.05
[펌] 오라클(ORACLE) 실무강좌  (0) 2008.08.05
ALTER명령어 모음  (0) 2008.07.10