글
데이터 이동하기 (Export / Import)
운영서버 -> 개발서버 또는 개발서버 -> 운영서버로의 테이블 이동 등에 사용
그리고 DB가 No Archive log mode 로 운영 중 Open 상태에서 백업을 받아야 하는 경우 데이터를 DB에서 OS 파일로 저장할 떄 사용하는 것이 논리적 백업 툴인 export 이고 export로 백업받은 파일을 서버로 입력하는 툴이 import
중요한 특징 중 한가지는 Export 와 import 유틸리티는 DB가 OPEN 된 상태에서만 사용 가능하다는 것. 또 OS 기종이나 오라클 버전에 달라도 데이터를 이동시킬 수 있다. 데이터가 많을 경우 물리적 백업보다 시간이 많이 걸린다는 단점이 있다.
원리
Export 유틸리티로 데이터와 데이터베이스의 정의를 복사하고 이 내용을 오라클 내부 포맷의 바이너리 파일로 변환해 OS에 저장.
1. Conventional Path Export
Data -> Database buffer cache -> Evaluation Buffer -> Dmp 파일로 변환(binary)
※ 무조건 시작시점의 데이터가 반영되고 중간에 다른 사용자에 의해 변경된 데이터는 반영되지 않는다. 이유는 다른 사용자들은 DB버퍼캐시에서 작업을 하고 exp 작업은 evaluation buffer에서 작업하기 때문이다.
2. Direct Path Export
Data -> Database buffer cache -> Dmp 파일로 변환
※ 이 작업 중에는 다른 사용자들이 못쓰게 Holding 된다. 잘못쓰면 역적됨. 조심.
Import 유틸리티가 저장된 바이너리 파일을 읽어 데이터베이스에 저장. 아래는 import 순서.
1. create table ~
2. insert into ~
3. create index ~
4. constraint ~ ※ 중간에 에러가 나면 이후 모든 작업이 중단된다.
EXPORT 수행하기
들어가기 앞서..
Data Dictionary Views.
----------------------
EXPORT 또는 IMPORT utility 를 사용하기 전에, 반드시 이
utilities 에 의해 서용될 Data Dictionary가 준비되어야만
합니다. 다음 script를 실행하면 됩니다.
UNIX : SQL> @$ORACLE_HOME/rdbms/admin/catexp.sql
Windows: SQL> @%ORACLE_HOME%\rdbms\admin\catexp.sql
이 CATEXP.SQL script는 반드시 SYS user로 실행되어야만 합니다.
이 script는 CATALOG.SQL script에 의해 자동으로 호출됩니다.
CATEXP.SQL 와 CATALOG.SQL script는 하나의 database에 단지
한번만 실행되면 됩니다. 정상적인 상태라면 export나 import
전에 이 script를 실행해 줄 필요는 결코 없습니다.
CATEXP.SQL는 다음과 같은 일을 해서 database를 export와 import
에 대해 준비시켜 줍니다.
- data dictionary에 필요한 export와 import views들을 생성합니다.
- EXP_FULL_DATABASE role 과 IMP_FULL_DATABASE role을 생성합니다.
- EXP_FULL_DATABASE role 과 IMP_FULL_DATABASE role에
필요한 모든 privileges를 할당합니다.
- EXP_FULL_DATABASE 과 IMP_FULL_DATABASE 를 DBA role에 할당합니다.
- sys.props$ table을 export 와 import views의 version으로 update
합니다.
출처 : http://www.syhds.com/it_kor/support/date.php?ptype=view&code=pds&idx=32
export 수행 모드
1) full=y 옵션을 사용하여 데이터베이스 전체 exp
2) tablespaces 옵션을 사용하여 특정 tablespace 전체를 exp
3) owner 옵션을 사용하여 특정 schema를 exp ---> 중요!! 많이 씀!!
4) tables 옵션을 사용하여 원하는 테이블만 골라서 exp
※ export / import 는 temporary tablespace 공간을 사용하기때문에 용량이 없다는 에러가 뜨면 바로 아래와 같이 다른 temporary tablespace 생성 후 디폴트로 설정해준다.
sql> create temporary tablespace temp2 tempfile '/app/oracle/temp2.dbf' size 20M autoextend on;
sql> alter database default temporary tablespace temp2;
※ SYS 계정으로 작업한건 exp 되지 않는다. 무조건 SYSTEM 계정으로!!
※ EXP-00107: Feature (BINARY XML) of column WAREHOUSE_SPEC in table OE.WAREHOUSES is not supported. The table will not be exported.
exp 중간에 이런 에러가 뜨는 이유는 11g에서 새롭게 추가된 XML 저장기능 때문.
나중에 나오는 Datapump 부터 지원된다.
실습1. Conventional path 로 full export (기본모드)
[oracle@server128 ~]$ time exp system/oracle full=y file=/data/exp/full01.dmp log=/data/exp/full_log01.log
실습2. Direct path 로 full export
[oracle@server128 ~]$ time exp system/oracle full=y file=/data/exp/full02.dmp log=/data/exp/full_log02.log direct=y
Export: Release 11.2.0.2.0 - Production on Fri Apr 17 18:05:26 2015
Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.
Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - Production
With the Partitioning option
Export done in KO16MSWIN949 character set and AL16UTF16 NCHAR character set
About to export the entire database ...
. exporting tablespace definitions
실습3. export를 저장하는 파일을 분할해서 받기 (분할백업) -> SIZE 계산 중요!
[oracle@server128 ~]$ time exp system/oracle full=y file=/data/exp/full04_1.dmp , /data/exp/full04_2.dmp , /data/exp/full04_3.dmp filesize=10M
Export: Release 11.2.0.2.0 - Production on Fri Apr 17 19:05:50 2015
Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.
Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - Production
With the Partitioning option
Export done in KO16MSWIN949 character set and AL16UTF16 NCHAR character set
About to export the entire database ...
. exporting tablespace definitions
Export file: expdat.dmp > /data/exp/full04_4.dmp
continuing export into file /data/exp/full04_4.dmp
(이하생략)
실습4. 특정 Tablespace 만 exp 하기
[oracle@server128 ~]$ time exp system/oracle file=/data/exp/ex_users.dmp tablespaces=example,users
실습5. 특정 Table 만 exp 하기
[oracle@server128 ~]$ exp scott/tiger tables=emp,dept file=emp_dept.dmp
실습6. 여러 사용자를 동시에 exp 하기
[oracle@server128 ~]$ time exp system/oracle file=/data/exp/scott_hr.dmp owner=scott,hr
실습7. evaluateion buffer 값이 export 에 주는 영향 테스트
(버퍼가 크다고 속도가 향상되는건 아님)
SYS>alter database datafile '/data/yeje/users01.dbf' autoextend on;
Database altered.
SYS>alter database datafile '/data/yeje/undotbs01.dbf' autoextend on;
Database altered.
SYS> begin
2 for i in 1..5000000 loop
3 insert into scott.test01
4 values (i, dbms_random.string('A',49) ,
5 dbms_random.string('Q',49) ) ;
6 end loop;
7 commit;
8 end;
9 /
실습8. parameter file 을 이용한 exp
[oracle@server128 ~]$ vi full.dat
file=/data/exp/full02.dmp
full=y
direct=y
[oracle@server128 ~]$ exp system/oracle parfile=full.dat
실습9. 특정 조건만 exp 받기 - query 옵션 사용하기 (escape 문자 주의)
[oracle@server128 ~]$ exp scott/tiger query=\"where ename like \'F%\'\" tables=emp file=/data/exp/test06.dmp
-> 이름 첫글자가 F인 사람만
[oracle@server128 ~]$ exp scott/tiger query=\"where job=\'CLERK\' and sal \>1000\" file=/data/exp/scott2.dmp tables=emp
-> emp 테이블에서 job 이 CLERK 이고 급여가 1000 이상인 사람만
[oracle@server128 ~]$ vi par2.dat
tables=emp query="where job='CLERK' and sal>1000"
file=/data/exp/scott3.dmp
[oracle@localhost ~]$ exp scott/tiger parfile=par2.dat
실습10. schema 별로 자동 exp 백업받는 스크립트
[oracle@server128 ~]$ vi exp_script.sh
export LANG=C
export ORACLE_BASE=/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/11g
export PATH=$ORACLE_HOME/bin:$PATH
export ORACLE_SID=testdb
sqlplus /nolog<<EOF3
conn / as sysdba
set head off
set time off
set timing off
set feedback off
set echo off
set line 200
col name for a100
spool /app/oracle/exp.tmp
select 'mkdir -p /data/backup/exp/'||to_char(sysdate,'yyyy-mm-dd-hh24-mi') from dual;
select distinct 'exp system/oracle'||' owner='||lower(owner)||' file=/data/backup/exp/'||to_char(sysdate,'yyyy-mm-dd-hh24-mi')||'/'||lower(owner)||'.dmp'||' filesize=100m direct=y' from dba_tables where owner not in ('SYS','DBSNMP','WMSYS','IX','SYSTEM','OE','PM','EXFSYS','CTXSYS','OLAPSYS','MDSYS','SYSMAN','LOADER','XDB','ORDSYS','OUTLN','TSMSYS','DMSYS');
spool off
!cat /app/oracle/exp.tmp | egrep -v SQL | egrep -v SYS > /app/oracle/exp.sh
!sh /app/oracle/exp.sh
exit
EOF3
Import 수행하기
imp 실행순서
1) create table ~
2) insert into ~
3) create index ~
4) constraint 생성 ※ 중간과정에서 하나라도 에러가 나면 모든 작업이 캔슬됨.
Import 작업은 DDL과 DML을 수행하는 것이므로 Redo log 와 Undo segment 를 사용한다.
따라서 대량의 데이터를 import 할 때는 반드시 충분한 용량의 Undo tablespace 가 필요하다.
용량이 부족하면 마지막에 에러나면서 전부 rollback 될 수도 있음.
이런 위험을 줄이기 위해서는 import 할 때 commit=y 로 변경하고 수행하면 array 단위로 commit 을 수행하기 때문에 전체가 rollbak 되는 현상은 막을 수 있다.
실습에 앞서 전체 full export 수행
time exp system/oracle file=/data/exp/full11.dmp full=y
실습1. 전체 데이터 import 수행
[oracle@server128 ~]$ imp system/oracle file=/data/exp/full11.dmp ignore=y full=y
실습2. 특정 사용자의 데이터만 import
[oracle@server128 ~]$ imp system/oracle file=/data/exp/full11.dmp fromuser=scott tables=test01 ignore=y
실습3. scott 사용자의 test02 테이블을 hr 사용자 소유로 변경
SCOTT> create table test02 (no number , addr varchar2(10));
SCOTT> begin
for i in 1..1000 loop
insert into test02 values(i,dbms_random.string('A',10));
end loop;
commit;
end;
/
SCOTT> select count(*) from test02;
COUNT(*)
----------
1000
실습4. 실제 데이터는 import 하지 않고 DDL 문장만 추출하기
[oracle@server128 ~]$ imp scott/tiger file=/data/exp/test02.dmp show=y log=test02.log
[oracle@server128 ~]$ vi test02.log
'Backup&Recovery' 카테고리의 다른 글
Log Miner 활용 (0) | 2015.04.20 |
---|---|
Parameter file 관리 및 장애복구 (0) | 2015.04.20 |
Redo Log File 장애 case (0) | 2015.04.15 |
Controlfile 장애복구 (0) | 2015.04.14 |
닫힌백업(cold backup / closed backup) (0) | 2015.04.13 |