oracle下跨平臺跨版本的數據遷移linux
環境:linux平臺下oracle10g 32位數據庫 windows 平臺下的oracle11g 64位數據庫數據庫
需求:將oracle 10g 下的data、indx表空間及數據遷移到oracle 11g下windows
使用方案:傳輸表空間(transport tablespace)oracle
導出工具:expdpide
導入工具:impdp工具
爲了實驗可以更真實一點,首先須要在oracle 10g下作一些操做spa
create user u01 identified by u01;orm
create user u02 identified by u02;對象
grant dba to u01,u02;blog
create tablespace data datafile'/oracle/oradata/prod/data01.dbf' size 20m,'/oracle/oradata/prod/data02.dbf' size 20m,'/oracle/oradata/prod/data03.dbf' size 20m;
create tablespace indx datafile'/oracle/oradata/prod/indx01.dbf' size 20m,'/oracle/oradata/prod/indx02.dbf' size 20m,'/oracle/oradata/prod/indx03.dbf' size 20m;
create table u01.tab1 tablespace data as select * from dba_users;
create table u01.tab2 tablespace indx as select * from dba_objects;
create table u02.tab1 tablespace data as select * from dba_users;
create table u02.tab2 tablespace indx as select * from dba_objects;
create table u01.tab3(c1 int,c2 int,constraint tab3_pk primary key(c1)) tablespace data;
create table u01.tab4(c1 int,c2 int,constraint tab3_fk foreign key(c1) references u01.tab3(c1)) tablespace indx;
ok,模擬的差很少了,開始導出前的操做
一、查看要導出的表空間上有哪些表(防止遺漏select segment_name,tablespace_name from dba_segments where tablespace_name in ('DATA','INDX');
二、查看哪些用戶在要導出的表空間上建立了對象(在目標數據上要建立對應用戶)
select distinct(owner) from dba_segments where tablespace_name in ('DATA','INDX');
三、查看該平臺上的數據存儲格式是否與目標數據庫的平臺上的數據存儲格式一致(若是不一致,須要轉換,才能用)
select * from v$transportable_platform order by platform_name;
四、建立導出的目錄(注意此目錄oracle用戶必須有讀寫的權限)
create directory dir as '/oracle';
五、檢查要導出表空間的自包含性(若是未選定行,說明表空間是自包含的,不然,不能傳輸)
exec dbms_tts.transport_set_check('DATA',TRUE);
select * from transport_set_violations;
exec dbms_tts.transport_set_check('INDX',TRUE);
select * from transport_set_violations;
壞事了,indx表空間居然不能傳輸,由於u01.tab4和u01.tab3存在引用關係
exec dbms_tts.transport_set_check('INDX,DATA',TRUE)
select * from transport_set_violations;
兩個表空間一塊兒檢查,就能夠了,即導出的時候也必須兩個表空間一塊兒導出
五、將要導出的表空間設置爲read only,避免數據不一致
alter tablespace data read only;
alter tablespace indx read only;
準備就緒,開始導出表空間的元數據(metadata),只包含結構,不包含數據
expdp system/oracle dumpfile=data_indx_tts.dmp directory=dir1 transport_tablespaces=data,indx
元數據導出完成
將元數據文件和data、indx表空間包含的全部數據文件傳到目標機器上
在oracle 11g 上進行如下操做
一、建立用戶(以前在源數據庫上查詢的哪些用戶在data、indx建立了對象)
create user u01 identified by u01;
create user u02 identified by u02;
create directory dir1 as 'e:\oradata';
利用impdp將元數據文件和數據文件導入到oracle 11g 中
impdp system/oracle dumpfile=data_indx_tts.dmp directory=dir1 transport_datafiles=e:\oradata\data01.dbf,e:\oradata\data02.dbf,e:\oradata\data03.dbf,e:\oradata\indx01.dbf,e:\oradata\indx02.dbf,e:\oradata\indx03.dbf
導入完成,開始驗證:
表空間
表結構:
表中的數據:
引用關係:
ok,數據遷移成功!!!!