仅使用SQL shell创建Oracle数据库副本的最佳方法

仅使用SQL shell创建Oracle数据库副本的最佳方法,sql,oracle,Sql,Oracle,我需要在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}

我需要在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 DB是否有任何等价物

作为参考,我使用JBDC以完全权限连接到数据库

MSS使用“数据库”来指代Oracle中的几个不同概念。我想您的意思可能是要导出一个模式,然后用不同的模式名称将其重新导入到同一个Oracle数据库中。我通常使用命令行中的数据泵(expdp/impdp)。但是,您可以使用它从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\u PUMP\u DIR)、DBMS\u DATAPUMP的执行权限等。

我想这正是我想要的。我要试试。对于第一个add_文件行,我被告知我给出了一个无效的参数值。这就是我正在做的:DBMS_DATAPUMP.ADD_文件(l_dp_句柄,{dbBackup.ToLower()}.dmp',{DbDumpDir}');其中dbBackup是备份的名称,DbDumpDir是数据库转储的路径。知道我犯了什么错误吗?@Damien-你必须传递Oracle目录对象的名称,而不是OS目录路径。查看
所有目录
,查看您是否有权访问任何目录。您可能需要额外的权限(为此,以及创建新用户)。谢谢,我会尝试一下。我的公司认为我所做的工作很荒谬,我现在已经转移到一个新项目。不管怎样,我相信这会起作用,所以我把它标记为正确的。