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