零. 注意問題

    在導入導出過程中, ORACLE的表名, 列名, 用戶名, 密碼等要統統大寫, 否則出錯.
   
    在用DTS時, 依次優先選用Microsoft ODBC for Oracle  /  Oracle Provider for OLE DB  /  Microsoft OLE DB Provider for Oracle 類型的DSN


一.真實環境

源操作系統:linux, IP: 10.*.*.101, sql server 2k ,簡稱R機

目的操作系統:linux, IP: 10.*.*.202, oracle 10g,簡稱D機


二.模擬環境

在本地機10.*.*.244 簡稱L機, 安裝sql server 2k 和 oracle 10g.

三.備份,  把R機SQL SERVER導入L機SQL SERVER

在L機安裝sql server2k 之后, 打開企業管理器,在SQL SERVER組新建一個SQL SERVER注冊, 輸入R機IP地址/登錄帳號/密碼進行注冊, 當注冊完后登錄到R機, 找到要移植的數據表.

右鍵-->所有任務-->導出數據-->下一步-->選擇數據源(用于SQL SERVER的Microsoft OLE DB提供程序)/服務器(默認遠程R機)/登錄帳號/密碼/源數據庫

                             下一步-->選擇目的(用于SQL SERVER的Microsoft OLE DB提供程序)/服務器local(L機)/使用window身份驗證/目的數據庫用戶帳號/目的
         
                                      數據庫用戶密碼/數據庫

                             下一步-->選擇用一條指定要傳輸的數據(只傳數據,不傳視圖)
                             
                             下一步-->輸入SELECT * FROM DEPT_TEST;

                             下一步-->勾選"源", 將目的修改成大寫的相應表名. 點擊"轉換"進行細節處理.
                            
                             下一步-->下一步>...完成.
備份完畢.

同時用數據泵expdp把遠程D機的oracle導出到L機. 以防不測.

四. 把R機SQL SERVER導入本地L機ORACLE

登錄到R機, 找到要移植的數據表.

右鍵-->所有任務-->導出數據-->下一步-->選擇數據源(用于SQL SERVER的Microsoft OLE DB提供程序)/服務器(默認遠程R機)/登錄帳號/密碼/目的數據庫

                            
                             下一步-->選擇目的(Oracle in OraDb10g_home1)/DNS(無則創建Oracle in OraDb10g_home1, 有則選擇)/目的數據庫用戶帳號/目的

                                      數據庫用戶密碼

                             下一步-->選擇用一條指定要傳輸的數據(只傳數據,不傳視圖)

                             下一步-->輸入SELECT * FROM DEPT_TEST;

                             下一步-->勾選"源", 將目的修改成大寫的相應表名. 點擊"轉換"進行細節處理.
                            
                             下一步-->  編輯 SQL(S), 修改表結構, 即把相應字段修改為ORACLE的正確字段類型, 如碰sqlserver的大字段, 默認轉為ORACLE的LONG類型, 但實際上要修改成CLOB.

                             下一步>...完成.
                             
結果大失所望, 由于遇到ORACLE的clob類型字段. 因些導入數據失敗, 慶幸的是表已創建了.

五. 尋找另外的方法--Excel, Access
   
    有上述同樣的方法從R機導入L機, 以Excel, Access方式保存.

    用PL/SQL Develper的ODBC Importer / Toad的Import table data導入, 結果顯示導完10W條記錄之后, 再查DEPT_TEST數目, 竟然是0.
 
    我快暈了. 好在Toad還比較有良心, 在導到8W條時, 提示出錯. 回頭查下L機ORACLE的相應表空間, 原來1G空間還不夠用呢. 把表空間改為3G. 再導, 一切正常了.


六. 抽取數據
   
    由于D機上已有數據, 并且源數據表與目的數據表為異構表, 因此必須從源數據表抽取數據追加到目的數據表中.

    1)由于之前目的表的表結構已經導入L機Oracle, 這里就不用再定義表了.
    
    2)創建序列, 原因是數據追加.

     --如果原表已經有數據, 則用max(**id)取得最大id值, 并以該值+1作為基值: start with max(**id+1)

     create sequence dept_seq minvalue 1 maxvalue 1000 start with 1 increment by 1 nocache; 

    3)創建觸發器
      create or replace trigger dept_trig

      before insert on dept_test for each row

      begin

       select dept_seq.nextval into :new.deptno from dual;

      end;

    4)抽取并插入數據

    insert into dept_test(title) select dname from scott.dept; --這時, 每插入一條數據id都會自動補上.

終于模擬成功.

七.  在本地用數據泵expdp導出數據

    1). 創建邏輯目錄, 該命令不會在操作系統創建真正的目錄, 需另外手工創建.

    create directory dpdata1 as 'd:\test\dump';

    2). 查看管理理員目錄(同時查看操作系統是否存在, 因為Oracle并不關心該目錄是否存在, 如果不存在, 則出錯.)

    select * from dba_directories;

    3). 給scott用戶賦予在指定目錄的操作權限

    grant read, write on directory dpdata1 to scott;

    4)按表名導出數據

    host expdp scott/tiger@orcl TABLES=dept_test dumpfile=expdp.dmp DIRECTORY=dpdata1;


八. copy L機的empdp.dmp到遠程D機oracle上,用數據泵impdp導入數據, 導入方式為追加模式.

    1). 創建邏輯目錄, 該命令不會在操作系統創建真正的目錄,  需另外手工創建.

    create directory dpdata2 as 'home\dirc\dump';

    2). 查看管理理員目錄(同時查看操作系統是否存在, 因為Oracle并不關心該目錄是否存在, 如果不存在, 則出錯.)

    select * from dba_directories;

    3). 給scott用戶賦予在指定目錄的操作權限

    grant read, write on directory dpdata2 to scott;

    4)追加數據

    host impdp system/manager DIRECTORY=dpdata2 DUMPFILE=expdp.dmp SCHEMAS=system TABLE_EXISTS_ACTION=append;