1. 程式人生 > >Oracle exp/imp匯入不同的表空間

Oracle exp/imp匯入不同的表空間

    我們在做Oracle資料庫表遷移時,通常會有這種需求,在開發階段,可能所有使用者的資料都放在一個表空間中,比如users表空間,但是在生產中,我們希望將每個使用者的資料分別放到不同表空間中,此時直接使用exp/imp是不具備選擇表空間功能的(expdp/impdp可以),這裡我們提供了一種方法來實現這種功能。

    正常情況下,我們使用exp匯出,再用imp匯入,它會將資料匯入到原來表空間中。

   這裡我測試新建了一個使用者test01,三張表t1、t2、t3,預設表空間為users

SQL> select table_name,TABLESPACE_NAME from dba_tables where owner='TEST01';

TABLE_NAME		       TABLESPACE_NAME
------------------------------ ----------------------------------------
T1			       USERS
T2			       USERS
T3			       USERS

此時我們使用exp匯出

exp system/oracle file=test01.dmp owner=test01 buffer=10240 log=test01.log
在匯出檔案中,裡面會包含建表語句,而語句中會包含表空間資訊,這裡擷取一部分
strings test01.dmp |grep TABLESPACE
CREATE TABLE "T1" ("OWNER" VARCHAR2(30) NOT NULL ENABLE, "TABLE_NAME" VARCHAR2(30) NOT NULL ENABLE, "TABLESPACE_NAME" VARCHAR2(30), "CLUSTER_NAME" VARCHAR2(30), "IOT_NAME" VARCHAR2(30), "STATU
S" VARCHAR2(8), "PCT_FREE" NUMBER, "PCT_USED" NUMBER, "INI_TRANS" NUMBER, "MAX_TRANS" NUMBER, "INITIAL_EXTENT" NUMBER, "NEXT_EXTENT" NUMBER, 
"MIN_EXTENTS" NUMBER, "MAX_EXTENTS" NUMBER, "PCT_INCREASE" NUMBER, "FREELISTS" NUMBER, "FREELIST_GROUPS" NUMBER, "LOGGING" VARCHAR2(3), 
"BACKED_UP" VARCHAR2(1), "NUM_ROWS" NUMBER, "BLOCKS" NUMBER, "EMPTY_BLOCKS" NUMBER, "AVG_SPACE" NUMBER, "CHAIN_CNT" NUMBER, "AVG_ROW_LEN" NUMBER, 
"AVG_SPACE_FREELIST_BLOCKS" NUMBER, "NUM_FREELIST_BLOCKS" NUMBER, "DEGREE" VARCHAR2(20), "INSTANCES" VARCHAR2(20), "CACHE" VARCHAR2(10), 
"TABLE_LOCK" VARCHAR2(8), "SAMPLE_SIZE" NUMBER, "LAST_ANALYZED" DATE, "PARTITIONED" VARCHAR2(3), "IOT_TYPE" VARCHAR2(12), "TEMPORARY" VARCHAR2(1),
 "SECONDARY" VARCHAR2(1), "NESTED" VARCHAR2(3), "BUFFER_POOL" VARCHAR2(7), "ROW_MOVEMENT" VARCHAR2(8), "GLOBAL_STATS" VARCHAR2(3), 
"USER_STATS" VARCHAR2(3), "DURATION" VARCHAR2(15), "SKIP_CORRUPT" VARCHAR2(8), "MONITORING" VARCHAR2(3), "CLUSTER_OWNER" VARCHAR2(30),
 "DEPENDENCIES" VARCHAR2(8), "COMPRESSION" VARCHAR2(8), "DROPPED" VARCHAR2(3))  PCTFREE 10 PCTUSED 40 INITRANS 1 
MAXTRANS 255 STORAGE(INITIAL 393216 NEXT 1048576 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT) TABLESPACE "USERS" LOGGING NOCOMPRESS


所以此時我們做imp匯入時,即使新建使用者指定了預設表空間,也很會匯入到原來的表空間中(除非原來預設的表空間已經被刪除掉了,否則即便換使用者也不行)

此時我們提供另一種方式來更改資料表的表空間,假設使用者為test01,步驟如下:

1、建立使用者,注意一定要加預設表空間

create user test01 identified by test01 default tablespace test01;

2、賦予許可權,注意不要賦予dba許可權,如果實在需要可以匯入後再賦權,當然匯入操作可以用system來做

GRANT CONNECT TO test01;
GRANT IMP_FULL_DATABASE TO test01;
GRANT RESOURCE TO test01;

3、收回使用者test01無限制表空間許可權

revoke unlimited tablespace from test01;

4、將原來表空間的許可權收回

alter user test01 quota 0 on USERS;

5、賦予新表空間許可權

alter user test01 quota unlimited on test01;

需要注意的是,假如users表空間可以刪除,則可以直接匯入到新的預設表空間test01中

此時我們直接匯入,發現表全部在新的預設空間中

imp system/oracle file=test01.dmp fromuser=test01 touser=test01 buffer=10240 commit=y log=imptest01.log

TABLE_NAME		       TABLESPACE_NAME
------------------------------ ------------------------------------------------------------------------------------------
T1			       TEST01
T2			       TEST01
T3			       TEST01