[原]使用可傳輸表空間修改Schema Name
我同學(xué) Frank 嘗試通過修改數(shù)據(jù)字典表來達到修改 Schema Name 的目的,但是引出了一大堆問題,詳看這兩博客:
Change Schema Name & ORA-01031: insufficient privileges (on SYS.DMBS_SESSION), ORA-28100, etc...
以往我會通過 exp/imp 或者 expdp/impdp 完成類似的數(shù)據(jù)遷移,但是如果數(shù)量比較大,導(dǎo)出的可能性比較低,如果僅為修改一個Schema Name 而去導(dǎo)入導(dǎo)出2~3T的數(shù)據(jù),那簡直就是又一出“一個饅頭引發(fā)的血案”。
考慮到以上問題,我嘗試使用可傳輸表空間來完成這項任務(wù)。
創(chuàng)建測試環(huán)境
為 frank 建立用戶和相應(yīng)的表空間:
create tablespace frank datafile '/u02/oradata/ora10g/ORA10G/ora10g/frank01.dbf' size 20M autoextend on logging segment space management auto extent management local; create user frank identified by frank default tablespace frank; grant connect to frank; grant resource to frank; revoke unlimited tablespace from frank; alter user frank quota unlimited on frank;
使用用戶 frank 進行登錄,然后創(chuàng)建一些對象,例如表 objects :
create table objects as select * from all_objects insert into objects select * from objects ; insert into objects select * from objects ; insert into objects select * from objects ; insert into objects select * from objects ; commit;
現(xiàn)在 objects 這個表有“很多很多”數(shù)據(jù),移動起來“非常非?!崩щy,但我又必須修改 frank 這個 Schema Name 為 killkill
導(dǎo)出成可傳輸表空間
我選用數(shù)據(jù)泵配合可傳輸表空間,所以需要創(chuàng)建一個 directory 出來:
create or replace directory DATAPUMP as '/home/ora10g/datapump'; grant read,write on directory DATAPUMP to public ;
將表空間 frank 設(shè)為只讀:
alter tablespace frank read only;
在命令行將表空間 frank “導(dǎo)出”,其實是導(dǎo)出數(shù)據(jù)字典,這個文件很小。
expdp system/oracle dumpfile=expdp_frank.dmp directory=datapump transport_tablespaces=frank
清理舊的Schema
將表空 frank offline :
alter tablespace frank offline ;
然后將數(shù)據(jù)文件改名,以適應(yīng)新的表空間命名規(guī)范,在命令行中執(zhí)行:
cd /u02/oradata/ora10g/ORA10G/ora10g/ mv ./frank01.dbf ./killkill01.dbf
清理 Frank,我比較狠,關(guān)于Frank 的東西全部干掉:
drop user frank cascade; drop tablespace frank including contents;
從可傳輸表空間導(dǎo)入
首先,要為新的 Schema 建一個用戶,就叫 killkill 吧:
create user killkill identified by killkill; grant connect to killkill; grant resource to killkill;
我們稍后再為 killkill 指定默認表空間。
在命令行中導(dǎo)入:
impdp system/oracle DUMPFILE=expdp_frank.dmp DIRECTORY=DATAPUMP \ TRANSPORT_DATAFILES=/u02/oradata/ora10g/ORA10G/ora10g/killkill01.dbf \ REMAP_SCHEMA=(frank:killkill) \ REMAP_TABLESPACE=(frank:killkill)
注意,REMAP_SCHEMA 就是修改 Schema Name 的關(guān)鍵,順便將表空間的名字也改過來(REMAP_TABLESPACE)。
導(dǎo)入完畢,將新導(dǎo)入的表空間 killkill 設(shè)為 read write 模式,并設(shè)定為用戶 killkill 的默認表空間:
alter tablespace killkill read write ; alter user killkill default tablespace killkill ;
登錄驗收
這個就很簡單了:
connect killkill/killkill select count(*) from objects;
小結(jié)
回顧整個過程,我們所需的磁盤空間實際上就是導(dǎo)出 expdp_frank.dmp 的文件大小,本次實驗,該文件大小為 80K ,非常小;將數(shù)據(jù)文件改名,只要不是夸文件系統(tǒng)的移動,那幾乎就是不需要時間和I/O的;導(dǎo)入可傳輸表空間,也就是導(dǎo)入那個80K的文件,即使普通的PC機也不是什么難事。
雖然整個過程比較繁瑣,但是基本不會出錯。
但是話說回來,如果用戶 Frank 有幾個Schema,所有 Schema 都放在一個表空間中,那么就不能用這個方法了。
浙公網(wǎng)安備 33010602011771號