2017-08-11 100 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'来查看你是否有权访问任何。您可能需要额外的权限(为此,并创建新用户)。 –

相关问题