我是Oracle新手,我的目的是将所有数据和元数据从一个模式转移到Oracle数据库中的另一个模式。我打算使用datapump的expdpimpdp命令。我对此有疑问:


我可以在没有用户的情况下创建目标架构,还是应该先创建用户(它也会创建架构)?
我可以使用SYS(作为sysdba)帐户执行expdpimpdp命令吗?这是首选方法吗?

该语句是否从架构中获取所有对象(数据和元数据)并将它们移动到其他架构中?

expdp \"/ as sysdba\" schemas=<schemaname> directory=dumpdir dumpfile=<schemaname>.dmp logfile=expdp_<schemaname>.log  


那么,目标模式是否是impdp命令后的源模式的精确副本?



#1 楼

impdp将创建一个尚不存在的用户,因此除非您不想要它,否则您不必担心。

不要将impdbexpdp作为sysdba运行,仅当Oracle支持人员在特定情况下要求提供此服务。为此请使用普通用户-例如,已被授予dba角色的普通用户。 (有专门针对此类事物的[IMPORT|EXPORT]_FULL_DATABASE特权,您还需要授予对Oracle目录对象的访问权限。)

确实可以进行完整的模式导出(元数据和内容)看起来像:

expdp user/pass schemas=<schemaname> directory=dumpdir \
      dumpfile=<schemaname>.dmp \
      logfile=expdp_<schemaname>.log


如果要导入到其他用户/架构(目标数据库可以与源数据库相同),则可以使用:

impdp user/pass schemas=schema1 directory=dumpdir \
      remap_schema=schema1:schema2 \
      dumpfile=schema1.dmp \
      logfile=impdp_schema2.log


如果您不想完全导入,则可以对数据和元数据设置一些过滤器。请参阅导入操作期间的筛选。

《实用程序指南》包含所有详细信息,我强烈建议至少阅读概述部分。

#2 楼

对于导入截断的表,即,您只希望将数据导入回到表中:

impdp user/pass TABLES=dept DIRECTORY=TEST_dir dumpfile=TEST.dmp logfile=expdpTEST.log TABLE_EXISTS_ACTION=REPLACE


我的表上方是要导入的dept。我已将其截断了。从转储文件TEST.dmplogfileexpdpTEST.log我只希望导入数据(表结构是相同的,因此我们使用参数TABLE_EXISTS_ACTION)。

如果您截断了2个表,例如empdept以及emp表具有dept_id作为外键,那么您需要先导入dept表,然后再导入emp表,以避免在导入期间出错。 /satya-dba.blogspot.in/2009/05/datapump.html