다른 Tablespace 로 Import 하기  
#################################################################################
다른 Tablespace 로 Import 시키기
메타링크 원문 : 1012307.6
A. Table Level 로
B. User Level 로 [ 다른 디비로 동일 유저로 ]
C. From User A to user B 로 [ 동일 디비에서 다른 유저로 ]

#################################################################################
A. Table Level 로
1. Tablespace Check [ Export 할 Table 가 속한 ]
2.
 2.1 충분한 공간이 확보 된다면, Import 전에,
     Rename Table 및 Index Drop, 성공적으로 Import 후 삭제 조치
 2.2 충분한 공간이 없다면, Import 전에, Table 을 Drop 하라.
# Dump 화일 정상 체크
   imp username/password full=y file=expdat.dmp show=yes log=imp.log
   ==> 실제 Object 가 Create 되거나, Import 되어지지 않는다.

3. INDEXFILE=<filename> 을 가지고 Import 하라.
   그리하여, create table 과 create index 문장을 획득하라.        

4. Tablespace 절을 새로운 Tablespace 로 Editing 하라.
   Import 속도를 위해서 Create Index 문장을 삭제 하라.  

5. 새로운 Tablespace 에 대해서 Quota 를 부여하라.

6. Editing(4번) 한 Script 를 실행 하라   

7. Import 하라 ( IGNORE = Y ), 해서 New Table 을 원하는 Tablespace 에
   위치시키고, Index 를 생성하라.
   fromuser=scott
   touser=scott
   commit=y
   ignore=y
   indexes=n

################################################################################
예제
From
SID : TESTDOM
Username : SCOTT
Table : EMP
SQL> create tablespace ts_tg_d datafile
     '/u01/ORACLE/MIGDOM/MIGDOM/ts_tg_d_01.dbf'
     size 100M autoextend on next 100m maxsize 500m
     extent management local autoallocate
     segment space management auto ;
    
SQL> create tablespace ts_tg_i datafile
     '/u01/ORACLE/MIGDOM/MIGDOM/ts_tg_i_01.dbf'
     size 100M autoextend on next 100m maxsize 500m
     extent management local autoallocate
     segment space management auto ;    

To
SID : MIGDOM
Username : SCOTT
Table : EMP
SQL> create tablespace ts_mig_d datafile
     '/u01/ORACLE/MIGDOM/MIGDOM/ts_mig_d_01.dbf'
     size 100M autoextend on next 100m maxsize 500m
     extent management local autoallocate
     segment space management auto ;
    
SQL> create tablespace ts_mig_i datafile
     '/u01/ORACLE/MIGDOM/MIGDOM/ts_mig_i_01.dbf'
     size 100M autoextend on next 100m maxsize 500m
     extent management local autoallocate
     segment space management auto ;    
  
SQL> create user scott identified by tiger
     default tablespace users
     temporary tablespace temp ;


SQL> grant connect, resource to scott ;

SQL> alter user scott default tablespace ts_mig_d ;

A.
A.1 EXPORT
more exp.par
userid=system@TESTDOM
buffer=10000
file=emp.dmp
log=emp.log
statistics=none
tables=('SCOTT.EMP')


exp parfile=exp.par
....
Export terminated successfully without warnings.


A.2 EXPORT 결과물 체크

imp system/oracle123 full=y file=emp.dmp show=y log=imp.log


A.3 INDEXFILE=<filename> 을 통한 Script 생성
imp system/oracle123 full=y file=emp.dmp indexfile=index.sql

A.4 Editing
cp index.sql table.sql
vi table.sql - tablespace 이름 변경, 인덱스 부분 제거
vi index.sql - 인덱스 생성 Tablespace 변경, Nologging, Parallel 로 생성 후
               Logging, Noparallel 로 다시 변경을 포함

A.5 Tablespace 에 대한 권한 및 공간 체크

A.6 Create Table [ by A.4 ]

A.7 Import 수행 아래 Option 을 포함
   fromuser=scott
   touser=scott
   commit=y
   ignore=y
   indexes=n
   Index 생성
#################################################################################
B. User Level 로 [ 동일 유저를 타 디비로 이관 ]
1. 유저 Level 혹은 Database Level 로 Export 수행
2. Drop or Rename Objects
# Dump 화일 정상 체크
   imp username/password full=y file=expdat.dmp show=yes log=imp.log
   ==> 실제 Object 가 Create 되거나, Import 되어지지 않는다.
3. Tablespace 관련 권한 조치
  3.1 유저의 Default Tablespace 변경
    ALTER USER <username> DEFAULT TABLESPACE <new tablespace>;
  3.2 유저의 Old Tablespace QUOTA 를 "0"으로 조치
    ALTER USER <username> QUOTA 0 ON <old tablespace>;
  3.3 신규 Tablespace 에 대한 QUOTA 설정 
    ALTER USER <username> QUOTA <bytes> ON <new tablespace>;
  3.4 "RESOURCE" 권한이 부여됐다면, "UNLIMITED TABLESPACE" 를 REVOKE 하라.
    SELECT GRANTED_ROLE FROM DBA_ROLE_PRIVS
    WHERE GRANTEE='SCOTT'
    -- RESOURCE 가 RETUNN 된다면 아래와 같이 진행
    REVOKE  UNLIMITED TABLESPACE FROM SCOTT ;
    -- DBA 가 RETURN 된다면 아래와 같이 진행
    REVOKE DBA FROM SCOTT ;
   
4. 기존 Tablespace 에 Table 을 생성 할 수 없는지 다시 한번 체크 하라 .
   CREATE TABLE JUNK (A NUMBER) TABLESPACE <old tablespace>;
   ORA-01950 이 Return 되면 성공

5. User Level 로  Import 를 진행하라 .

6. 작업을 위해서 한시적으로 Revoke 하였던 Resource, DBA 권한을 원복 하라.      
   
3. INDEXFILE=<filename> 을 가지고 Import 하라.
   그리하여, create table 과 create index 문장을 획득하라.   
  
#################################################################################
예제
...
#################################################################################
C. From User A to user B 로 [동일 디비내에서 다른 유저로 이관 ]
   Import 되어지는 유저의 Default Tablespace 와 상관없이 Export 되어질때의
   Tablespace 로 Import 된다.
   FROMUSER=USER_A(USER_A_TS) TOUSER=USER_B(USER_B_TS)
   환경에서 Import 를 진행 하면, USER_A_TS 로 IMPORT 되어진다.
1. USER_A 의 User Level 로 Export 진행
2.
 2.1USER_B 의 USER_A_TS, USER_B_TS 의 QUOTA 를 체크
   USER_A_TS - QUOTA 를 "0" 으로
   SELECT * FROM DBA_TS_QUOTAS where username = 'USER_B';
   ALTER USER USER_B QUOTA 0 ON TABLESPACE USER_A_TS;
 2.2 RESOUCE ROLE 이 있다면 REVOKE UNLIMITED TABLESPACE 하라.
   SELECT GRANTED_ROLE FROM DBA_ROLE_PRIVS WHERE GRANTEE='USER_B';
   REVOKE UNLIMITED TABLESPACE from USER_B ;
3. USER_A_TS 에 대해서 더이상 권한이 없음을 확인 하라
   CREATE TABLE JUNK (A NUMBER) TABLESPACE <USER_A_TS>;
  
4. Import 수행
5. 권한 원복 수행
   ALTER USER <userB> QUOTA nn ON TABLESPACE <USER_A_TS>;
      
!! 테스트 하진 않았지만,
   요점은 원래의 Tablespace 가 있어야 한다는 것으로 보여진다.
   있지만, 권한이 없다면 USER_B 의 Default Tablespace 로 Import 되어질것으로
   예상된다.
################################################################################  
요약
- TABLE LEVEL 시에는 INDEXFILE=<indexfile> 을 통한 editing 을 통해서 제어   
- 시나리오 B,C 는 별차이가 없다.
- DEFAULT TABLESPACE 변경 및 원래의 TABLESPACE 에 대해서는 QUOTA "0" 조치  
################################################################################

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

Oracle Standby DB 생성  (0) 2009.03.25
10G: TEMPORARY TABLESPACES GROUP  (0) 2009.03.16
Oracle Backup  (0) 2009.02.20
Wait event 에 대한 간단한 Tuning 방법  (0) 2009.02.03
Oracle 성능분석방법론  (0) 2009.02.02

+ Recent posts