程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle數據庫基礎 >> Oracle幾種表遷移方法的介紹

Oracle幾種表遷移方法的介紹

編輯:Oracle數據庫基礎
 

在實際的生產環境中,一般是一個用戶(schema)對應一個表空間,該用戶相應的表都建議在這個默認的表空間裡面。但個別情況下,例如初期規劃的調整等,需要將用戶的表遷移到另一個用戶下,這時就有有多種可行的實施方法,本文介紹幾種比較高見的做法。
 
【正文】

一     用戶表遷移的目的

數據庫運維過程中,可能會遇到應用系統調整或進行數據庫的總體整合,一般的目的有以下幾個:用戶將幾個小的實例整合到成一個;沒有指定默認表空間,初期人為誤操作將用戶表建到其它表空間裡;應用系統或業務需求的架構調整。這裡主要分兩種情況:
  相同schema下遷移表到其它表空間。
  不同schema下的表遷移。
 

二      常見的表遷移方法

2.1   導入導出法

場景:主要適用於不同schema下的表遷移。
示例:將跨用戶的表遷移。將scott用戶的表遷移到orcl用戶下,可以通過exp/imp工具進行導出導入,也可以通過expdp/impdp工具來完成。
通過exp/imp工具,(導入時使用fromuser… touser…命令來實現用戶轉換):
導出:exp scott/password@orcl file=/home/oracle/emp.dump log=emp.log tables=emp
導入:imp orcl/password@orcl fromuser=scott touser=orcl file=/home/oracle/emp.dump log=emp.log tables=emp;
通過expdp/impdp工具,(導入時使用remap_schema命令來實現)
導出:expdp system/password@orcl directory=dir_dp dumpfile=emp.dmp log=emp.log tables=scott.emp
導入:impdp system/password@orcl directory=dir_dp dumpfile=emp.dmp log=emp.log tables=scott.emp remap_schema=scott:orcl
       此時如果原schema下的表已不再使用,可直接用drop table命令刪除。
通過上述導入導出方式來遷移表的方法需要注意的地方是,表的約束條件會伴隨著dump文件一起走,如果與導入的表有約束相關的其它表不存在,則會報錯如下:
IMP-00017: following statement failed with ORACLE error 942:
 "ALTER TABLE "EMP" ADD CONSTRAINT "FK_DEPTNO" FOREIGN KEY ("DEPTNO") REFEREN" "CES "DEPT" ("DEPTNO") ENABLE NOVALIDATE"
或者
ORA-00942: table or view does not exist
Failing sql is:
ALTER TABLE "ORCL"."EMP" ADD CONSTRAINT "FK_DEPTNO" FOREIGN KEY ("DEPTNO") REFERENCES "ORCL"."DEPT" ("DEPTNO") ENABLE
 

2.2   移動法

另外一種遷移表的方法是使用alter table table_name move tablespace tablespace_name命令將表移動到另一個表空間(用戶也轉變),主要適用於相同schema下將表遷移到其它表空間,示例:將emp表從users表空間轉移到orcl表空間:
SQL> alter table emp move tablespace orcl;
 
此時只是表的位置轉移了,用戶不變:
SQL> select owner,table_name,tablespace_name from dba_tables where table_name='EMP';
OWNER     TABLE_NAME    TABLESPACE
----------               ----------                      ----------
SCOTT      EMP             ORCL
 
注意:此時表的相關索引仍在users表空間,只是已經變為無效狀態:
SQL> select INDEX_NAME,TABLE_NAME,STATUS from user_indexes where table_name='EMP';
INDEX_NAME    TABLE_NAME   STATUS
-------------------    ----------------            --------
PK_EMP         EMP             UNUSABLE
      
需要重建索引到orcl表空間:
       SQL> alter index PK_EMP rebuild online tablespace orcl;
 

2.3  重建法

該方法比較簡單,即選取所要表重建到其它地方,適用於不同schema之間的表遷移,面對普通表、小表一般都可以使用這種方法,需要注意的地方是權限問題,即示例:
首先使用sysdba賬戶賦予orcl用戶對表scott.emp的讀取權限:
SQL> grant select on scott.emp to orcl;
       切換到orcl用戶下:
SQL> conn orcl/password
SQL> create table emp as select * from scott.emp;
 
注意:1、使用該方法只是創建表的結構,而不會將原表的默認值一起創建。
          2、只會復制表數據和表結構,不會有任何約束。
          3、當後面 where 條件不成立時,只復制表結構,沒有任務數據。
 

2.4  復制法

如果表裡包含了long字段,使用移動法或重建法則會報錯“ORA-00997: 非法使用 LONG 數據類型”,原因是long字段不能使用move命令或create命令,需要使用copy命令來進行表遷移:
SQL> copy from  scott/password@orcl to orcl/password@orcl replace emp using select * from emp;
 
Array fetch/bind size is 15. (arraysize is 15)
Will commit when done. (copycommit is 0)
Maximum long size is 80. (long is 80)
Table EMP created.
 
     14 rows selected from scott@orcl.
     14 rows inserted into EMP.
     14 rows committed into EMP at orcl@orcl.
 
FROM或TO指向當前數據庫時,可以忽略,但不能同時忽略FROM和TO。
       與move命令不同,copy命令是以復制的方式,上述操作最後的效果是scott用戶和orcl用戶下都有一個名為emp的表,可見copy方式與導入導出相似,適用於不同用戶下表schema的遷移,如果想達成直接移動法的效果,在不改變schema的情況下僅僅實現表空間的轉移,則可以考慮下述方法:
       先修改scott用戶的默認表空間為orcl:
       SQL> alter user scott default tablespace orcl;
       然後重建emp表到相同的schema下:
SQL> copy from  scott/password@orcl to scott/password@orcl replace emp using select * from emp;
       新建的表就會生成在默認的表空間下,而replace命令則會刪除原users表空間下的emp表。最後再將默認表空間修改回來即可,實際生產環境中除非需要修改默認表空間,否則不推薦該做法。
使用復制法有一個缺點,那就是針對表的復制並不包括其約束條件,需要在復制完成後手動重建創建約束。

三    操作總結

1、表數據遷移的方法有很多,需要結合具體的實際情況來選擇最佳方法。
2、移動法適用於相同schema下表空間之間的數據遷移,如果需要變更schema的話,建議使用另外三種方法。
3、在表移動期間,該表無法訪問,需要相關業務即應用暫停直至遷移完成。
4、任何數據遷移操作前都需要做好完善的備份和測試工作。
5、遷移完成後及時檢查相關約束情況,確保遷移前及遷移後數據的完整性和一致性。  
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved