关于导入:如何确定Oracle Data Pump导出文件中的模式

关于导入:如何确定Oracle Data Pump导出文件中的模式

How to determine the Schemas inside an Oracle Data Pump Export file

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

因此,我需要检查.dmp文件并列出其中的所有架构,我该怎么做?

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

我当前使用的impdp命令是:

1
2
impdp user/password@database directory=DPUMP_DIR
      dumpfile=EXPORT.DMP logfile=IMPORT.LOG

并且DPUMP_DIR已正确配置。

1
2
3
4
5
6
7
SQL> SELECT directory_path
2  FROM dba_directories
3  WHERE directory_name = 'DPUMP_DIR';

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

是的,该文件夹中的EXPORT.DMP文件是正确的。

运行impdp命令时收到的错误消息是:

1
2
3
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命令是:

1
2
impdp user/password@database directory=DPUMP_DIR dumpfile=EXPORT.DMP
      SCHEMAS=SOURCE_SCHEMA REMAP_SCHEMA=SOURCE_SCHEMA:MY_SCHEMA

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


如果使用SQLFILE参数,则impdp会将dmp备份的DDL导出到文件中。例如,将其放入文本文件

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

然后,在ddl_dump.txt中检查备份中的表空间,用户和架构。

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

The SQL is not actually executed, and the target system remains unchanged.


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


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

我的解决方案:社会工程,我非常努力地挖掘,找到了一个知道架构名称的人。
技术解决方案:搜索.dmp文件确实产生了架构名称。
知道架构名称后,我便搜索了转储文件并了解了在何处找到它。

在.dmp文件中看到架构名称的位置:

  • SOURCE_SCHEMA
    在每个表的名称/定义之前都可以看到它。

  • SCHEMA_LIST 'SOURCE_SCHEMA'
    可以在.dmp的末尾看到它。

有趣的是,它在SCHEMA_LIST 'SOURCE_SCHEMA'部分附近还具有用于创建转储的命令行,使用的目录,使用的par文件,运行Windows的版本以及导出会话设置(语言,日期格式)。

所以,问题解决了:)


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


步骤1:这是一个简单的示例。您必须使用SQLFILE选项从转储文件中创建一个SQL文件。

步骤2:生成的SQL文件(此处为tables.sql)中的CREATE USER的Grep

这里的例子:

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

Import: Release 11.2.0.3.0 - Production on Fri Apr 26 08:29:06 2013

Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.

Username: / as sysdba

Processing object type SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA Job"SYS"."SYS_SQL_FILE_FULL_01" successfully completed at 08:29:12

1
$ grep"CREATE USER" tables.sql

CREATE USER"USER1" IDENTIFIED BY VALUES 'S:270D559F9B97C05EA50F78507CD6EAC6AD63969E5E;BBE7786A5F9103'

http://www.acehints.com/p/site-map.html上介绍了许多数据泵选项


运行impdp命令以生成一个sqlfile,您将需要以具有DATAPUMP_IMP_FULL_DATABASE角色的用户身份运行它。

或者...以低特权用户身份运行它,并使用MASTER_ONLY = YES选项,然后检查主表。例如

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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


您需要搜索OWNER_NAME。

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

cat -v将转储文件转换为可见的文本。

grep -o仅显示匹配项,因此我们看不到很长的行

uniq -u删除重复的行,因此您看到的输出更少。

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


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

1
strings dumpfile.dmp | grep SCHEMA_LIST

推荐阅读