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

所以,我需要检查 .dmp 文件并列出其中的所有模式,我该怎么做?


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

我当前使用的 impdp 命令是:

impdp user/password@database 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 the job
ORA-39154: Objects from foreign schemas have been removed from import

此错误消息通常是预期的。我需要的impdp命令是:

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

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

4

8 回答 8

92

impdpdmp如果使用SQLFILE参数,则将备份的 DDL 导出到文件。例如,把它放到一个文本文件中

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

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

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

SQL 并未实际执行,目标系统保持不变。

于 2011-07-15T14:31:05.423 回答
13

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

于 2008-09-19T06:25:02.473 回答
11

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

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

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

  • <OWNER_NAME>SOURCE_SCHEMA</OWNER_NAME> 这在每个表名/定义之前都可以看到。

  • SCHEMA_LIST 'SOURCE_SCHEMA' 这在 .dmp 结尾附近可见。

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

所以,问题解决了:)

于 2008-09-19T16:27:05.747 回答
6

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

于 2008-09-19T06:21:24.230 回答
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

于 2013-01-22T01:49:54.880 回答
4

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

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

这里的例子:

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

导入:发布 11.2.0.3.0 - 2013 年 4 月 26 日星期五 08:29:06 生产

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

用户名:/ as sysdba

处理对象类型 SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA 作业 "SYS"."SYS_SQL_FILE_FULL_01" 在 08:29:12 成功完成

$ grep "CREATE USER" tables.sql

创建由值标识的用户“USER1”'S:270D559F9B97C05EA50F78507CD6EAC6AD63969E5E;BBE7786A5F9103'

此处解释了许多数据泵选项http://www.acehints.com/p/site-map.html

于 2013-04-26T06:34:04.027 回答
3

您需要搜索 OWNER_NAME。

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

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

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

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

即使在大型转储文件上,这也很有效,并且可以调整以在脚本中使用。

于 2017-02-21T17:41:52.130 回答
2

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

strings dumpfile.dmp | grep SCHEMA_LIST
于 2013-04-24T13:10:01.510 回答