如何才能最好地重新创建Oracle数据库?

时间:2014-10-10 15:33:56

标签: sql oracle sqlplus ddl

Oracle 11gR2(x86 Windows):

我有一个带有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. 运行脚本以添加所有约束。

  9. 编辑:我已连接到远程桌面,该桌面链接到Windows Server 2008上的源数据库。远程只安装了Oracle客户端。出于安全原因,我不允许直接从我的本地计算机链接到Win Server,所以我可以将整个源数据库转储到远程数据库然后将其压缩到我的本地目标计算机吗?我正在尝试在我的计算机上复制整个数据库。

3 个答案:

答案 0 :(得分:6)

从Oracle 10g开始,您可以使用Data Pump command-line clients expdbimpdb将数据和/或架构从一个数据库导出/导入到另一个数据库。事实上,这两个命令行实用程序只是“使用在DBMS_DATAPUMP PL / SQL包中提供的过程来执行导出和导入命令的包装器,使用在命令行输入的参数。” (引自Oracle的文档)

根据您的需求,您必须创建一个目录,然后使用expdb生成数据库的完整转储:

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

由于转储是使用某种二进制格式编写的,因此您必须使用相应的导入实用程序来(重新)导入数据库。基本上在上面的命令中用expdb替换impdb

sh$ impdp system@db10g full=Y directory=DUMP_DIR dumpfile=db.dmp logfile=db.log

对于简单的表转储,请改用该版本:

sh$ expdp sylvain@db10g tables=DEPT,EMP directory=DUMP_DIR dumpfile=db.dmp logfile=db.log

正如您所注意到的,只要您可以访问给定目录(GRANT READ, WRITE ON DIRECTORY dump_dir TO sylvain;),就可以将其与标准用户帐户一起使用。

<小时/> 有关详细用法说明,请参阅

答案 1 :(得分: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电话。

答案 2 :(得分:-2)

SQL Developer可以通过使用formatted query result创建INSERT语句来帮助#1:

Select /*insert*/ * 
from My_Table;