2008-09-18 142 views
33
  • 我有一个使用expdp创建的Oracle数据库备份文件(.dmp)。
  • .dmp文件是整个数据库的导出。
  • 我需要从此转储文件中还原1个模式。
  • 我不知道这个转储文件中的模式的名称。
  • 要使用impdp导入数据,我需要要加载的模式的名称。

因此,我需要检查.dmp文件并列出其中的所有模式,我该怎么做?如何确定Oracle数据泵内部的模式导出文件


更新(2008-09-18 13:02) - 更详细的信息:

的IMPDP命令我使用的电流为:

impdp user/[email protected] directory=DPUMP_DIR 
     dumpfile=EXPORT.DMP logfile=IMPORT.LOG 

而且DPUMP_DIR是正确配置。

SQL> SELECT directory_path 
2 FROM dba_directories 
3 WHERE directory_name = 'DPUMP_DIR'; 

DIRECTORY_PATH 
------------------------- 
D:\directory_path\dpump_dir\ 

是的,EXPORT.DMP文件在该文件夹中实际上是事实。

错误消息当我运行IMPDP命令是我得到:

Connected to: Oracle Database 10g Enterprise Edition ... 
ORA-31655: no data or metadata objects selected for job 
ORA-39154: Objects from foreign schemas have been removed from import 

大多预计此错误消息。我需要的IMPDP命令是:

impdp user/[email protected] directory=DPUMP_DIR dumpfile=EXPORT.DMP 
     SCHEMAS=SOURCE_SCHEMA REMAP_SCHEMA=SOURCE_SCHEMA:MY_SCHEMA 

但要做到这一点,我需要源模式。

回答

11

如果使用可以处理大文件的编辑器打开DMP文件,则可能可以找到提及架构名称的区域。只要确保不要改变任何东西。如果您打开原始转储的副本,会更好。

+0

为我工作100% – theo231022 2016-07-11 13:55:42

5

假设您没有首先生成该文件的expdp作业的日志文件,最简单的选择可能是使用SQLFILE parameter让impdp生成一个DDL文件(基于完全导入)。然后您可以从该文件中获取模式名称。当然,这并不理想,因为impdp必须读取整个转储文件以提取DDL,然后再次转到您感兴趣的模式,并且必须为各种CREATE USER语句搜索一些文本文件,但它应该是可行的。

+0

我曾试图使用SQLFILE参数,但它在.sql输出文件中的一行失败:“ - CONNECT MYSCHEMA”。我认为通过多一点努力来实现它,这可能会产生解决方案。 – KyleLanser 2008-09-19 16:25:52

9

更新(2008-09-19 10:05) - 解决方案:

我的解决方案:社会工程,我挖的实际努力和发现有人谁知道架构名称。
技术解决方案:搜索.dmp文件确实产生模式名称。
一旦我知道模式名称,我搜索了转储文件,并了解到哪里可以找到它。

在Schema的名字被看到的地方,在。dmp文件:

  • <OWNER_NAME>SOURCE_SCHEMA</OWNER_NAME> 这是每个表的名称/定义过的。

  • SCHEMA_LIST 'SOURCE_SCHEMA' 这被看作接近的.dmp结束。

有趣的是,周围的SCHEMA_LIST 'SOURCE_SCHEMA'部分,它也有用来创建转储在命令行中,使用的目录,使用标准杆文件,Windows版本,它是运行,并出口会话设置(语言,日期格式)。

所以,问题就解决了:)

68

impdp出口一个dmp备份的DDL的文件,如果使用的SQLFILE parameter。例如,要把它放到一个文本文件

impdp '/ as sysdba' dumpfile=<your .dmp file> logfile=import_log.txt sqlfile=ddl_dump.txt 

然后检查ddl_dump.txt的表空间,用户和备份模式。

根据文档,这实际上并没有修改数据库:

的SQL并没有真正执行,和目标系统保持不变。

+10

好奇为什么downvote,我几次使用这种方法自己在几次确定模式,这是一个比“社会工程”或“挖掘dmp “ – 2012-01-18 14:38:03

4

的运行IMPDP命令产生SQLFILE,你将需要运行它作为具有DATAPUMP_IMP_FULL_DATABASE角色的用户。

或者...运行它作为一个低权限的用户,并使用MASTER_ONLY = YES选项,然后检查主表。例如

select value_t 
from SYS_IMPORT_TABLE_01 
where name = 'CLIENT_COMMAND' 
and process_order = -59; 

col object_name for a30 
col processing_status head STATUS for a6 
col processing_state head STATE for a5 
select distinct 
    object_schema, 
    object_name, 
    object_type, 
    object_tablespace, 
    process_order, 
    duplicate, 
    processing_status, 
    processing_state 
from sys_import_table_01 
where process_order > 0 
and object_name is not null 
order by object_schema, object_name 
/

http://download.oracle.com/otndocs/products/database/enterprise_edition/utilities/pdf/oow2011_dp_mastering.pdf

2

我的解决方案(类似于KyleLanser的答案)(在Unix):

strings dumpfile.dmp | grep SCHEMA_LIST 
3

第1步:下面是一个简单的例子。您必须使用SQLFILE选项从转储文件创建SQL文件。

步骤2:grep的用于在生成的SQL文件CREATE USER(这里tables.sql)

实施例这里:

$ impdp directory=exp_dir dumpfile=exp_user1_all_tab.dmp logfile=imp_exp_user1_tab sqlfile=tables.sql 

导入:释放11.2.0.3.0 - 上周五4月生产26 8时29分06秒2013

版权所有(C)1982年,2011年,Oracle和/或其附属公司。版权所有。

用户名:/作为SYSDBA

处理对象类型SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA作业 “SYS”。“SYS_SQL_FILE_FULL_01” 成功地完成了在8点29分12秒

$ grep "CREATE USER" tables.sql 

CREATE USER “USER1” 标识BY值 'S:270D559F9B97C05EA50F78507CD6EAC6AD63969E5E; BBE7786A5F9103'

地块的数据泵选择这里解释http://www.acehints.com/p/site-map.html

0

您需要搜索OWNER_NAME。

cat -v dumpfile.dmp | grep -o '<OWNER_NAME>.*</OWNER_NAME>' | uniq -u 

cat -v将dumpfile转换为可见文本。

的grep -o只显示了比赛,所以我们没有看到很长的线

所以你看,产出少的uniq -u去除重复行。

即使在大型转储文件中,此方法也可以很好地工作,并且可以针对脚本中的使用进行调整。