2014-10-10 39 views
3

Oracle 11gR2(x86 Windows):如何最好地重新創建Oracle數據庫?

我有一個帶有索引和約束條件的250個表。我需要在新的數據庫中重新創建這些表,索引和約束並加載數據。我需要知道如何在SQL Plus和/或SQL Developer中執行以下操作,除非有一個可以自動執行所有操作的神奇工具。提前致謝!

  1. 卸載(導出)250個表中的所有數據。

  2. 爲250個表創建一個包含CREATE TABLE語句的sql腳本文件。

  3. 創建一個包含250個表的CREATE INDEX語句的sql腳本文件。

  4. 創建一個包含250個表的ALTER TABLE ADD CONSTRAINT語句的sql腳本文件。

  5. 運行腳本以在新數據庫中創建表。

  6. 將導出的數據加載到新數據庫的表中。

  7. 運行該腳本以創建所有索引。

  8. 運行該腳本以添加所有約束。

編輯:我連接到其鏈接到源dB的Windows Server 2008的遠程只安裝了一個Oracle客戶端上的遠程桌面。出於安全原因,我不允許直接從本地計算機鏈接到Win Server,那麼我可以將整個源數據庫轉儲到遠程,然後將其壓縮到本地目標計算機上?我試圖複製我的電腦上的整個數據庫。

回答

6

從Oracle 10g開始,您可以使用Data Pump command-line clientsexpdbimpdb將數據和/或模式從一個數據庫導出/導入到另一個數據庫。事實上,這兩個命令行工具只是「使用DBMS_DATAPUMP PL/SQL包中提供的過程來執行導出和導入命令的包裝器,使用在命令行輸入的參數」。(Oracle的文檔的引用)

鑑於你的需求,你必須創建一個目錄,然後使用expdb生成數據庫的完全轉儲:

SQL> CREATE OR REPLACE DIRECTORY dump_dir AS '/path/to/dump/folder/'; 
sh$ expdp [email protected] full=Y directory=DUMP_DIR dumpfile=db.dmp logfile=db.log 

由於轉儲是使用某種二進制格式編寫的,您將不得不使用相應的導入實用程序來(重新)導入您的數據庫。基本上由impdb在上面的命令替換expdb

sh$ impdp [email protected] full=Y directory=DUMP_DIR dumpfile=db.dmp logfile=db.log 

對於簡單的錶轉儲,使用該版本來代替:

sh$ expdp [email protected] tables=DEPT,EMP directory=DUMP_DIR dumpfile=db.dmp logfile=db.log 

當你發現,你可以用你的標準用戶帳戶使用,前提是您可以訪問給定的目錄(GRANT READ, WRITE ON DIRECTORY dump_dir TO sylvain;)。


有關詳細使用說明,請參見

+0

還有一個因素:源數據庫在遠程系統上,我需要在本地機器上重新創建該數據庫。我可以將整個\ oradata文件夾保存在收存箱中,並將其替換爲我的\ oradata嗎? – 2014-10-10 15:53:06

+2

@Frank只需移動'/ oradata'文件夾?我不能說,我從來沒有這樣做過。但是,如果您有權訪問該文件夾,則仍然可以使用'expdb'將數據庫轉儲到那裏,然後僅將轉儲文件複製到系統中,以便使用'impdb'重新導入。 _感覺對我比較安全。 – 2014-10-10 16:09:04

+0

我剛剛使用Oracle Data Modeler的「生成DDL」選項來創建單獨的SQL腳本文件,以創建表,索引和PK/FK約束。唯一的問題是它爲每個表創建單獨的腳本文件,而不是所有創建表的一個腳本文件,創建所有索引的一個腳本文件,以及所有約束條件的一個scipt文件:(我正在使用Winx64,所以假設我可以連接文件到一個 – 2014-10-10 18:07:00

-2

SQL開發人員可以通過一個formatted query result創建INSERT語句用#1幫助:

Select /*insert*/ * 
from My_Table; 
+2

我不知道這是什麼數據庫,但它肯定不是Oracle。 – Allan 2014-10-10 16:30:12

+0

@Allan這是SQL Developer特有的功能,是問題中提到的工具之一。這是一個很好的功能,儘管我懷疑它和數據泵一樣好用,它只解決了其中一個問題。 – 2014-10-12 05:00:16

+0

感謝喬恩,同意 – Steve 2014-10-13 12:38:40

2

如果你可以創建本地數據庫到當前包含數據的一個數據庫鏈接,你可以使用DBMS_DATAPUMP包來複制整個模式。這是Datapump的接口(如@Sylvain Leroux提到的),可以從數據庫中調用。

DECLARE 
    dph NUMBER; 
    source_schema VARCHAR2 (30) := 'SCHEMA_TO_EXPORT'; 
    target_schema VARCHAR2 (30) := 'SCHEMA_TO_IMPORT'; 
    job_name VARCHAR2 (30) := UPPER ('IMPORT_' || target_schema); 
    p_parallel NUMBER := 3; 
    v_start TIMESTAMP := SYSTIMESTAMP; 
    v_state VARCHAR2 (30); 
BEGIN 
    dph := 
     DBMS_DATAPUMP.open ('IMPORT', 
          'SCHEMA', 
          'DB_LINK_NAME', 
          job_name); 
    DBMS_OUTPUT.put_line ('dph = ' || dph); 
    DBMS_DATAPUMP.metadata_filter (dph, 
            'SCHEMA_LIST', 
            '''' || source_schema || ''''); 
    DBMS_DATAPUMP.metadata_remap (dph, 
           'REMAP_SCHEMA', 
           source_schema, 
           target_schema); 
    DBMS_DATAPUMP.set_parameter (dph, 'TABLE_EXISTS_ACTION', 'REPLACE'); 
    DBMS_DATAPUMP.set_parallel (dph, p_parallel); 
    DBMS_DATAPUMP.start_job (dph); 
    DBMS_DATAPUMP.wait_for_job (dph, v_state); 
    DBMS_OUTPUT.put_line ('Export/Import time: ' || (SYSTIMESTAMP - v_start)); 
    DBMS_OUTPUT.put_line ('Final state: ' || v_state); 
END; 

上面的腳本實際上是複製和重命名模式。如果您想保留相同的模式名稱,我相信您只需刪除metadata_remap呼叫。

相關問題