2017-08-11 99 views
0

我需要使用略有不同的名稱在Oracle數據庫中創建模式副本。僅使用SQL shell創建Oracle數據庫副本的最佳方法

我可以與MSS喜歡的東西做到這一點很容易地:

BACKUP DATABASE {DATABASE_NAME} TO DISK='{DIRECTORY}\{BACKUP_NAME}' 
RESTORE FILELISTONLY FROM DISK = '{DIRECTORY}\{BACKUP_NAME}' 
RESTORE DATABASE {NEW_DATABASE} FROM DISK = '{DIRECTORY}\{BACKUP_NAME}' WITH MOVE '{mdf}' TO '{DIRECTORY}\{mdf}.mdf', MOVE '{ldf}' TO '{DIRECTORY}\{ldf}.ldf' 

是否有任何等效Oracle數據庫?

作爲參考,我使用JBDC以完整權限連接到數據庫。

回答

1

MSS使用「數據庫」來引用Oracle中的幾個不同概念。我想也許你的意思是你想要導出一個模式並將其重新導入到具有不同模式名稱的同一個Oracle數據庫中。我通常使用datapump從這個命令行(expdp/impdp)。但是,您可以使用there is a datapump API從SQL shell執行此操作。

-- export 
declare 
    l_dp_handle  NUMBER; 
BEGIN 
    l_dp_handle := DBMS_DATAPUMP.open('EXPORT','SCHEMA',null,'MY_EXPORT','LATEST'); 
    DBMS_DATAPUMP.add_file(l_dp_handle,'my_export.dmp','DATA_PUMP_DIR'); 
    DBMS_DATAPUMP.add_file(l_dp_handle,'my_export.log','DATA_PUMP_DIR',null,DBMS_DATAPUMP.KU$_FILE_TYPE_LOG_FILE); 
    DBMS_DATAPUMP.metadata_filter(l_dp_handle,'SCHEMA_EXPR','= ''OLD_SCHEMA_NAME'''); 
    DBMS_DATAPUMP.start_job(l_dp_handle); 
    DBMS_DATAPUMP.detach(l_dp_handle); 
END; 
/

-- check status with: 
select * from dba_datapump_jobs; 

-- import 
declare 
    l_dp_handle  NUMBER; 
BEGIN 
    l_dp_handle := DBMS_DATAPUMP.open('IMPORT','SCHEMA',null,'MY_IMPORT','LATEST'); 
    DBMS_DATAPUMP.add_file(l_dp_handle,'my_export.dmp','DATA_PUMP_DIR'); 
    DBMS_DATAPUMP.add_file(l_dp_handle,'my_export.imp.log','DATA_PUMP_DIR',null,DBMS_DATAPUMP.KU$_FILE_TYPE_LOG_FILE); 
    DBMS_DATAPUMP.metadata_filter(l_dp_handle,'SCHEMA_EXPR','= ''OLD_SCHEMA_NAME'''); 
    DBMS_DATAPUMP.metadata_remap(l_dp_handle,'REMAP_SCHEMA','OLD_SCHEMA_NAME','NEW_SCHEMA_NAME'); 
    DBMS_DATAPUMP.start_job(l_dp_handle); 
    DBMS_DATAPUMP.detach(l_dp_handle); 
END; 
/

請注意,如果要導入到您自己以外的模式中,您將需要DBA權限。您的Oracle用戶還需要在目錄(本例中爲DATA_PUMP_DIR)上的讀/寫權限,對DBMS_DATAPUMP執行權限等。

+0

我*想*這正是我想要的。我要去嘗試一下。 – Darrien

+0

對於第一個add_file行,我被告知我給了一個無效的參數值。這就是我在做的事情:DBMS_DATAPUMP.ADD_FILE(l_dp_handle,'{dbBackup.ToLower()}。dmp','{DbDumpDir}');其中dbBackup是備份的名稱,DbDumpDir是數據庫轉儲的路徑。任何想法我正在犯什麼錯誤? – Darrien

+0

@Damien - 您必須傳遞Oracle目錄對象的名稱,而不是OS目錄路徑。查看'all_directories'來查看你是否有權訪問任何。您可能需要額外的權限(爲此,並創建新用戶)。 –

相關問題