본문 바로가기

database

import, export사용

imp, exp

linux라는 사용자로 연결한다
SQL> connect linux/linux
연결되었습니다.
SQL> set pagesize 30

linux가 가진 테이블은 다음과 같다
SQL> select * from tab;
TNAME                                  TABTYPE     CLUSTERID
--------------------------- ------------ ----------
S_CUSTOMER                          TABLE
S_DEPT                                   TABLE
S_EMP                                    TABLE
S_IMAGE                                 TABLE
S_INVENTORY                          TABLE
S_ITEM                                   TABLE
S_LONGTEXT                           TABLE
S_ORD                                    TABLE
S_PRODUCT                            TABLE
S_REGION                               TABLE
S_TITLE                                  TABLE
S_WAREHOUSE                       TABLE
TEST                                      TABLE
13 개의 행이 선택되었습니다.
SQL> quit
Oracle8 Release 8.0.5.0.0 - Production
PL/SQL Release 8.0.5.0.0 - Production에서 분리되었습니다.
[linux@localhost db]$ ls -l /usr/local/Oracle
total 2
drwxr-xr-x   3 oracle   dba          1024 Sep 22 13:23 app
drwxr-xr-x   3 oracle   dba          1024 Sep 22 13:26 oradata
[linux@localhost db]$ ls -l /usr/local/Oracle/oradata
total 1
drwxr-xr-x   2 oracle   dba          1024 Sep 22 13:34 kang
[linux@localhost db]$ ls -l /usr/local/Oracle/oradata/kang
total 131172
-rw-r-----   1 oracle   dba       1435648 Oct  5 23:46 control01.ctl
-rw-r-----   1 oracle   dba       1435648 Oct  5 23:46 control02.ctl
-rw-r-----   1 oracle   dba       1435648 Oct  5 23:46 control03.ctl
-rw-r-----   1 oracle   dba      15730688 Oct  5 23:44 rbs01.dbf
-rw-r-----   1 oracle   dba        512512 Oct  5 23:41 redokang01.log
-rw-r-----   1 oracle   dba        512512 Oct  5 23:42 redokang02.log
-rw-r-----   1 oracle   dba        512512 Oct  5 23:44 redokang03.log
-rw-r-----   1 oracle   dba      83888128 Oct  5 23:44 system01.dbf
-rw-r-----   1 oracle   dba       1050624 Oct  5 23:42 temp01.dbf
-rw-r-----   1 oracle   dba      26216448 Oct  5 23:42 tools01.dbf
-rw-r-----   1 oracle   dba       1050624 Oct  5 23:42 users01.dbf

linux의 테이블을 export한다. OCP에서는 이 툴을 이용하는 백업을 논리적(logical) 백업이라고 한다
그냥 명령인자없이 주면 interactive하게 진행할 수 있다.
이 경우 direct백업(특별한 경우가 아닌 이상, 이 방법으로 하면 속도가 빨라진다.)이 불가능하다(디폴트로 N)
[linux@localhost db]$ exp linux/linux
Export: Release 8.0.5.0.0 - Production on 화 Oct 5 23:46:43 1999
(c) Copyright 1998 Oracle Corporation.  All rights reserved.

연결할 곳: Oracle8 Release 8.0.5.0.0 - Production
PL/SQL Release 8.0.5.0.0 - Production
배열 인출 버퍼 크기 입력: 4096 >
엑스포트 파일: expdat.dmp > 그냥 엔터(디폴트 화일명은 expdat.dmp이다)

논리적 백업은 3가지가 있는데 아래에 있는 user, table과 아래에 나오지 않은 full백업이 있다
(full백업은 보통 dba만이 할 수 있다, 만일 백업만을 전담할 사용자를 둔다면, exp_full_database, imp_full_database 권한을 주면 된다.).
user는 사용자가 가진 스키마의 모든 것들을 export하는 것이고, table은 말 그대로 사용자의 지정된 table만을 export하는 것이다.
full은 전체 DB를 백업한다


(2)U(사용자), 또는 (3)T(테이블): (2)U > 여기서는 2을 선택했다
권한부여 엑스포트 (yes/no): yes > 그냥 엔터
테이블 데이터 엑스포트 (yes/no): yes > 그냥 엔터
확장 영역 압축 (yes/no): yes > 그냥 엔터
KO16KSC5601 문자 설정과 KO16KSC5601 NCHAR 문자 설정에서 엑스포트가 종료되었습니다
. LINUX 사용자를 위해 외래 함수 라이브러리 이름을 엑스포트합니다
. LINUX 사용자에 대한 개체 유형 정의를 엑스포트 합니다
LINUX의 개체를 엑스포트하려고 합니다 ...
. 데이터베이스 링크 엑스포트 중
. 순차 번호 엑스포트 중
. 클러스터 정의 엑스포트 중
. LINUX의 테이블을 엑스포트하려고 합니다 via 규정 경로...
. . 테이블                     S_CUSTOMER(를)을 엑스포트 중         15 행이 엑스포트됨
. . 테이블                         S_DEPT(를)을 엑스포트 중         12 행이 엑스포트됨
. . 테이블                          S_EMP(를)을 엑스포트 중         25 행이 엑스포트됨
. . 테이블                        S_IMAGE(를)을 엑스포트 중         19 행이 엑스포트됨
. . 테이블                    S_INVENTORY(를)을 엑스포트 중        114 행이 엑스포트됨
. . 테이블                         S_ITEM(를)을 엑스포트 중         62 행이 엑스포트됨
. . 테이블                     S_LONGTEXT(를)을 엑스포트 중         33 행이 엑스포트됨
. . 테이블                          S_ORD(를)을 엑스포트 중         16 행이 엑스포트됨
. . 테이블                      S_PRODUCT(를)을 엑스포트 중         33 행이 엑스포트됨
. . 테이블                       S_REGION(를)을 엑스포트 중          5 행이 엑스포트됨
. . 테이블                        S_TITLE(를)을 엑스포트 중          8 행이 엑스포트됨
. . 테이블                    S_WAREHOUSE(를)을 엑스포트 중          5 행이 엑스포트됨
. . 테이블                           TEST(를)을 엑스포트 중         16 행이 엑스포트됨
. 동의어 엑스포트 중
. 뷰 엑스포트 중
. 저장 프로시저 엑스포트 중
. 참조 무결성 제약조건 엑스포트 중
. 트리거 엑스포트 중
. 이후 테이블 처리를 엑스포트 중
. 스냅샷 엑스포트 중
. 스냅샷 로그 엑스포트 중
. 작업 대기열을 엑스포트 중
. 리프레쉬 그룹과 자식 엑스포트 중
엑스포트가 경고 없이 정상적으로 종료되었습니다.
[linux@localhost db]$ ls -l
total 96
-rw-rw-r--   1 linux    linux        3340 Aug 15 22:30 JdbcTest.class
-rw-r--r--   1 linux    linux        3112 Aug 15 22:43 JdbcTest.java
drwxrwxr-x   2 linux    linux        1024 Oct  1 01:10 db_ex
-rw-rw-r--   1 linux    linux       40960 Oct  5 23:46 expdat.dmp
-rw-r--r--   1 linux    linux       41841 Jun 30 11:59 summit.sql
-rw-rw-r--   1 linux    linux        4096 Oct  5 23:46 사용자관리-백업_리스토어.txt

kang이라는 사용자로 import를 수행한다.
[linux@localhost db]$ imp kang/kang
Import: Release 8.0.5.0.0 - Production on 화 Oct 5 23:48:1 1999
(c) Copyright 1998 Oracle Corporation.  All rights reserved.

연결할곳: Oracle8 Release 8.0.5.0.0 - Production
PL/SQL Release 8.0.5.0.0 - Production
임포트 파일: expdat.dmp >
삽입 버퍼 크기를 입력하십시오 (최소치는 4096) 30720>
엑스포트 파일은 규정 경로를 거쳐 EXPORT:V08.00.05 에 의해 생성되었습니다
경고: 개체는 다른 사용자 LINUX(이)가 엑스포트한 것입니다.
임포트 파일의 내용만 표시합니다. (yes/no): no >
개체 존재로 인해 발생한 생성 오류는 무시합니다. (yes/no): no >
권한부여 임포트 (yes/no): yes >
테이블 데이터 임포트 (yes/no): yes >
엑스포트 파일 전체를 임포트합니다. (yes/no): no >
사용자명:linux 여기서 kang이라고 입력하지 않도록 주의한다
테이블(T) 또는 분할(T:P)명을 입력하십시오. 널 목록은 사용자의 모든 테이블을 의미합니다.
테이블(T) 또는 분할(T:P)명을 입력하거나 완료 시에는 .을 입력하십시오.
. LINUX 개체를 KANG(으)로 임포트하는 중입니다.
. . 테이블                   "S_CUSTOMER"(를)을 임포트 중         15 행이 임포트되었습니다
. . 테이블                       "S_DEPT"(를)을 임포트 중         12 행이 임포트되었습니다
. . 테이블                        "S_EMP"(를)을 임포트 중         25 행이 임포트되었습니다
. . 테이블                      "S_IMAGE"(를)을 임포트 중         19 행이 임포트되었습니다
. . 테이블                  "S_INVENTORY"(를)을 임포트 중        114 행이 임포트되었습니다
. . 테이블                       "S_ITEM"(를)을 임포트 중         62 행이 임포트되었습니다
. . 테이블                   "S_LONGTEXT"(를)을 임포트 중         33 행이 임포트되었습니다
. . 테이블                        "S_ORD"(를)을 임포트 중         16 행이 임포트되었습니다
. . 테이블                    "S_PRODUCT"(를)을 임포트 중         33 행이 임포트되었습니다
. . 테이블                     "S_REGION"(를)을 임포트 중          5 행이 임포트되었습니다
. . 테이블                      "S_TITLE"(를)을 임포트 중          8 행이 임포트되었습니다
. . 테이블                  "S_WAREHOUSE"(를)을 임포트 중          5 행이 임포트되었습니다
. . 테이블                         "TEST"(를)을 임포트 중         16 행이 임포트되었습니다
사용 가능한 제약 조건에 관해서...
임포트가 경고 없이 정상적으로 종료되었습니다.
[linux@localhost db]$ sqlplus
SQL*Plus: Release 8.0.5.0.0 - Production on 화 Oct 5 23:48:37 1999
(c) Copyright 1998 Oracle Corporation.  All rights reserved.
사용자명 입력: kang
암호 입력:
Connected to:
Oracle8 Release 8.0.5.0.0 - Production
PL/SQL Release 8.0.5.0.0 - Production

정말 import가 되었는지 확인하자
SQL> select * from tab;
TNAME                                  TABTYPE     CLUSTERID
--------------------------- ------------ ----------
S_CUSTOMER                          TABLE
S_DEPT                                   TABLE
S_EMP                                    TABLE
S_IMAGE                                 TABLE
S_INVENTORY                          TABLE
S_ITEM                                   TABLE
S_LONGTEXT                           TABLE
S_ORD                                    TABLE
S_PRODUCT                            TABLE
S_REGION                               TABLE
S_TITLE                                  TABLE
S_WAREHOUSE                       TABLE
TEST                                      TABLE
13 개의 행이 선택되었습니다.


다시 system으로 접속해서 kang이라는 사용자를 지운다.
이때 kang이라는 사용자의 schema에는 테이블이 존재하므로 cascade옵션을 사용해야 한다

SQL> connect system
암호 입력:
연결되었습니다.
SQL> drop user kang;
drop user kang
*
1행에 오류:
ORA-01922: 'KANG'(을)를 삭제하려면 CASCADE를 지정하여야 합니다

SQL> drop user kang cascade;
사용자가 삭제되었습니다.

추가: 2001-12-20
imp에서 show패러미터는 export파일의 내용을 보여주고, 실제 import는 수행하지 않는다.
보여주는 내용이 SQL문으로 되어 있으므로 어떤 경우, 유용하게 사용될 수 있다.

imp system/xxxxxx full=y show=y file=full_20011220.dmp log=exp_content.sql


복구과정
1. 가장 최근의 exp파일에서 full=y inctype=system으로 imp를 수행하여 data dictionary와 DB구조들을 재생성
   (이때 적용될 exp파일은 complete, cumulative, incremental의 종류에 관계없이 가장 최근의 exp파일이다.)
2. 가장 최근의 complete exp파일에서 full=y inctype=restore로 import한다.
   (나머지 exp파일들에 대해 full=y와 inctype=restore로 계속 수행한다)
3. 가장 최근의 complete exp파일 이후로 수행된 cumulative exp파일들을 처리
4. 가장 최근의 cumulative exp파일 이후로 수행된 incremental exp파일들을 처리

export시 DB를 restricted session에 두고,(alter system enable restricted session)
exp 패러미터중 consistent를 Y에 두면 최소한의 읽기일관성 보장한다.
단, consistent패러미터는 complete, cumulative에서만 사용할 수 있다.
consistent패러미터는 incremental에서는 사용될 수 없으므로, incremental수행시에는
DB를 restricted session에 두고 수행하는 것이 좋다.


-- 읽기일관성 문제 예
테이블 데이터가 먼저 export되고, index는 그 다음에 수행된다.
따라서, 테이블데이터에 있지 않으나, 인덱스에는 해당 데이터가 있을 수도 있다.
export수행중, 변경된 데이터는 export파일에 저장되지 않는다.


conventional Vs direct
디폴트는 conventional path를 이용해 export된다.
conventional path는 SQL을 SQL*PLUS에서 수행하는 것과 동일한 방식으로 실행된다.
direct패러미터는 디폴트가 N이므로 명시적으로 Y값으로 설정해야 한다.
direct는 데이터 정의와 몇몇 SQL을 skip하여 수행되므로 백업의 속도가 빠르다.
direct path를 사용할 때는 buffer패러미터가 사용되지 않는다.


full=y로 수행된 export파일은 import시 user,table,full 모두에 사용될 수 있다