2014-10-10 43 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呼叫。