oracle下跨平臺跨版本的數據遷移

oracle下跨平臺跨版本的數據遷移

環境:linux平臺下oracle10g 32位數據庫   windows 平臺下的oracle11g 64位數據庫

需求:將oracle 10g 下的data、indx表空間及數據遷移到oracle 11g下

使用方案:傳輸表空間(transport tablespace)

導出工具:expdp

導入工具:impdp

爲了實驗能夠更真實一點,首先需要在oracle 10g下做一些操作

create  user u01 identified by u01;

create user u02 identified by u02;

grant dba to u01,u02;

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,模擬的差不多了,開始導出前的操作

      1、查看要導出的表空間上有哪些表(防止遺漏select segment_name,tablespace_name from dba_segments where tablespace_name in ('DATA','INDX');

    2、查看哪些用戶在要導出的表空間上創建了對象(在目標數據上要創建對應用戶)

        select distinct(owner) from dba_segments where tablespace_name in ('DATA','INDX');

        
    3、查看該平臺上的數據存儲格式是否與目標數據庫的平臺上的數據存儲格式一致(如果不一致,需要轉換,才能用)

    select * from v$transportable_platform order by platform_name;

    

    4、創建導出的目錄(注意此目錄oracle用戶必須有讀寫的權限)

        create directory dir as '/oracle';

        

    5、檢查要導出表空間的自包含性(如果未選定行,說明表空間是自包含的,否則,不能傳輸)

    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;

    

        兩個表空間一起檢查,就可以了,即導出的時候也必須兩個表空間一起導出

    5、將要導出的表空間設置爲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 上進行以下操作

    1、創建用戶(之前在源數據庫上查詢的哪些用戶在data、indx創建了對象)

            create  user  u01 identified by u01;

            create  user u02  identified by u02;

        

    2、創建目錄

        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,數據遷移成功!!!!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章