今天又一同事讓我幫忙說現在服務器的主板換了,說想把oracle的數據遷移到別人服務器上,讓我幫忙,使用imp/exp或者是impdp/expdp這種效率有點低,所以研究下傳輸表空間做數據的遷移,先將研究過程記錄如下:
一、實現原理:
1、使用export或者是Pump export數據泵將需要操作的表空間中的對象的元數據導出(Metadata);
2、將表空間對應的數據文件和剛剛導出的文件複製到目標服務器上;
3、再將表空間的對象元數據imp/impdp導入到目標數據庫上;
注:我自己覺得,沒查找資料,元數據應該是類似對象的一些定義,那麼我們做數據遷移,不關要做數據對象的遷移,還有數據,那麼數據是存放到數據文件中的,定義是存放在system下的,所以,我們導出元數據是導出數據對象,導出數據是複製數據文件,因爲元數據只還有對象的定義,所以應該很小,所以導出很快,這樣tts的速度上可以提升不少;
二、使用條件:
1、跨系統的要求;
從oracle10g版本以後,傳輸表空間可以跨系統,可以同過v$transportable_platform視圖查詢,例如:
其中endian_format是自己順序,及處理和存儲的順序,要想傳輸表空間,要兩個系統的endian_format相同,否則要轉化endian_format;
2、在傳輸表空間前,要被傳輸的表空間必須處於read only的狀態,如果是生產庫可以使用RMAN,這裏不研究;alter tabespace *** read only;
3、源庫和目標庫的本地字符集和國家字符集必須相同;
4、被傳輸的表空間如果還有XMLTypes,在導出元數據的時候必須使用exp,不能使用expdp,且constraints和triggers參數必須設置成Y;
可以使用
select distinct p.tablespace_name from dba_tablespaces p,dba_xml_tables x,dba_users u,
all_all_tables t where t.table_name=x.table_name and
t.tablespace_name=p.tablespace_name and x.owner=u.username;查詢哪些表空間中還有XMLTypes
5、不能傳輸system和sys擁有的默認表空間;
6、表空間爲自包含表空間;
三、實戰操作:
1、確定平臺是否支持,及endian format,我們可以使用
select d.name,i.version,d.platform_name,endian_format from
v$transportable_platform tp,v$database d,v$instance i
where tp.platform_name=d.platform_name and d.name=upper(i.instance_name);
--怎麼轉化字節順序
2、選擇自包含表空間集
如何判斷表空間是否是自包含的呢,我們可以使用DBMS_TTS包來驗證,使用DBMS_TTS必須擁有execute_catalog_role或者是DBA的權限;
表空間的自包含有兩種檢驗方式:
1、非嚴格方式:檢查待傳輸表空間中對象,是否引用了其他未被傳輸的表空間中的對象;
2、嚴格方式:在非嚴格的基礎上,還要檢查是否被其他未傳輸的表空間的對象引用,
使用DBMS_TTS的默認情況下是非嚴格方式, 執行完之後可以使用transport_set_violations視圖查看是否有引用的對象,例如:
SQL> exec dbms_tts.transport_set_check('oacms_space',true);
PL/SQL 過程已成功完成。
SQL> select * from transport_set_violations;
未選定行
3、生成可傳輸表空間
1、將表空間至於read only狀態下:alter tablespace oacms_space read only;
2、導出表空間元數據,可以使用exp/expdp 根據本人習慣使用exp
這裏不詳細些了 因爲本人的測試服務器連接不上了,注意,一定要用sys/system身份;
3、將表空間的數據文件傳輸到目標數據庫中,將導出的dmp文件也傳輸到目標文件中,使用imp把元數據導入到目標數據庫,成了,完成;
寫到最後細節不願意寫了,哪天在做的時候截圖出來,見諒!