【问题标题】:How to analyze oracle dump file如何分析oracle转储文件
【发布时间】:2020-11-25 14:59:42
【问题描述】:

我需要分析一个大型 Oracle DMP 文件。到目前为止,我还没有使用 Oracle 的经验。

我知道数据库包含有关某些人的信息,例如姓名为 Smith 的人。 我不知道数据库的结构(哪个表包含哪些信息,是否有触发器,...)。

只要我不知道我必须搜索哪些表,我发现使用数据库文件的最佳方法是使用 grep。 这样,我至少可以验证数据库确实包含名称“Smith”。 最终,我想要一个可以在文本编辑器中查看、过滤和理解的 SQL 转储。

DMP 文件是用

创建的
expdp system / [PW] directory = [expdp_dir] dumpfile = [dumpfile.dmp] full = yes logfile = [logfile.log] reuse_dumpfiles = y

我知道 Smith 这个名字经常出现在数据库中。运行 grep -ai smith dumpfile.dmp 会返回很多命中。

为了进一步分析数据库,我安装了 oracle-database 和 sqldeveloper-20.2.0.175.1842-x64。我用

导入了DMP文件
impdp USERID = system / [PW] FULL = y FILE = [dumpfile.dmp]

文件夹C:\app\[user]\oradata\orcl 现在包含文件SYSAUX01.DBFSYSTEM01.DBF 等。 我怀疑这些是数据库文件。

命令grep -ai smith * .DBF 确实返回任何命中。 文件 SYSAUX01.DBFSYSTEM01.DBF 不是数据库,或者导入时出现问题。

使用 SQL 开发人员,我使用以下数据登录:

用户:系统 密码:[PW](=来自expdp 命令的密码) SDI:orcl

在 SQL 开发人员中,我没有找到 Smith。 SQL 开发人员显示了许多表,其中大部分看起来 是空的,我不明白。我怀疑这些表不是我要找的表。也许我需要以不同的方式登录(不同的用户,不同的 SDI?)。

我尝试将数据库导出到 SQL 转储文件,尝试 SQL 开发人员提供的各种选项, 但结果不包含字符串“Smith”。

有些不对劲:

  1. 导入错误
  2. 错误的 SDI
  3. 导出错误
  4. 其他任何东西

在此过程中可能出了什么问题?

【问题讨论】:

  • impdp 命令的输出是什么?您使用的是什么版本的 Oracle,以及生成转储文件的 Oracle 版本是什么?
  • 一路走来的问题是您对数据库如何工作的根本误解。是的,那些 .dbf 文件是数据库的一部分。但只是一部分。即使您确实通过 grepping 实际包含它的数据文件找到了“smith”,那又如何呢?您通过发出 sql 查询而不是通过 grepping 原始数据文件从数据库中获取数据。数据文件的关系和结构远比这复杂。
  • 您认为smith 到底是什么?模式、模式对象(表、包、过程)还是带有表的数据?如果架构或架构对象尝试使用SQLFILE= 选项来获取impdp 来写出DDL 命令。如果是数据,则有CONTENT=,但您必须准确研究它的作用。如果失败,请尝试通过 bash strings 命令运行 dmp 文件,然后通过 grep 输出。
  • 除了其他 cmets 之外,尝试读取 .DBF 文件的另一个问题是,最近版本的 Oracle 允许各种压缩算法,因此无法获得任何匹配。此外,如果启用了加密选项,则文件中的数据将...加密。

标签: oracle impdp


【解决方案1】:

你的问题有很多误解。

  • Oracle Datapump 是为导出和导入而设计的数据库实用程序。但是内容,无论是 DDL 命令(如 create table、create index )还是来自表的数据,都以二进制形式存储,因此您无法检查这些文件的内容。有一些选项可以从转储文件中提取 DDL 命令并将其放入脚本中。
  • 您提到的数据文件是数据库本身的一部分,它们与数据泵无关。 请勿触摸这些文件
  • 我不知道您所说的 "Smith" 是什么意思,如果您指的是架构,则在导入后对 dba_users 进行选择以查找字段 username = 'SMITH'
  • 如果您的意思是在这些表中查找“Smith”,则必须查看数据库的任何单个表(属于 Oracle 的模式除外)以及每个字符串字段
  • SDI 没有任何意义。我猜你的意思是 SID 或 Oracle 系统 ID,用于在特定环境中识别数据库的唯一标识符

没有错。我认为问题在于您并不完全知道自己在寻找什么。

检查一下

一个名为 SMITH 的用户/模式

SQL> SELECT USERNAME FROM DBA_USERS WHERE USERNAME = 'SMITH' ;

名称中包含单词 SMITH(不太可能)的表

SQL> SELECT TABLE_NAME FROM DBA_TABLES WHERE TABLE_NAME LIKE '%SMITH%' ;    

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-01
  • 1970-01-01
相关资源
最近更新 更多