Oracle用户数据库导出命令的范围(用户/架构级别)?

时间:2019-06-26 05:59:55

标签: oracle oracle11g

就Oracle DB知识而言,我完全是新手。试图了解IMPDB命令及其范围。

问题:假设一个特定的数据库中有500个表,当我们将数据导入到一个新的Oracle数据库(从一个数据库中获取数据)时,其中许多表(60%-70%或更多)以零记录的形式出现具有数据库的供应商)。令人怀疑的是,大多数表如何成为数据库中的零记录(为什么首先创建它们?)。此外,我们假设供应商在生成.DMP文件时正在使用特定用户,而该文件无法访问这些表,因此无法访问0。当我们问供应商时,他们说不是Oracle的工作方式,他们提供了用户导出转储,并说:“ Schema是特定用户拥有的数据库对象的集合。这些对象包括表,索引,视图,函数,存储过程等。

当被问到零记录问题时,他们说他们正在正确地提取数据,并且不了解为什么这么多表为零。 SO社区在Oracle DB中拥有出色的专家,任何人都可以对以下方面有所了解:

  1. 可能是什么问题?

  2. 我们的假设是否正确(即用户无权访问那些记录为零的表)?

  3. 前进的正确方向是什么?

4)您要添加的其他内容。

1 个答案:

答案 0 :(得分:1)

供应商是正确的-用于生成导出的实用程序EXPDP(对IMPDP的补充)可以创建特定用户的所有数据库对象的完整转储。但是,用于生成导出的参数可能相差很大,并且导出绝对可能不包含表数据 IF ,用于创建导出的EXPDP命令/参数在那样。例如,假设某人想要使用以下命令导出特定的架构:

expdp [USER]@[DATABASE] schemas=test directory=DATA_PUMP_DIR dumpfile=test.dmp logfile=test.log query=TEST.TABLE:'"WHERE row_date>sysdate"'

在生成导出的同时,将基于where条件评估该特定表中的所有行。除非行的日期是将来的日期,否则不会导出日期早于sysdate的行。如果将类似where的条件应用于整个导出,则转储文件中的表将具有0行。

这只是一个例子-表实际上有0行也可能是这种情况。出于多种原因,这是可能的-也许这是一个较旧的架构,其中的表先前已被截断。也许不经常使用该特定数据库,并且架构中的表为空,因为从未将行添加到表中。也许开发人员或其他DBA创建了一堆不必要的表,而这些表从未被删除。模式具有空表可能有很多潜在原因/问题,但这并不意味着数据库或正在生成的导出文件有问题。应用程序及其技术要求一直在变化,并且当不再需要这些表时,很可能根本没有更新架构。

我建议的第一件事是:

  1. 请供应商从其末端开始提供该模式中每个表的记录计数,以进行验证。这将告诉您数据库中的表是否为空。如果它们在数据库中为空,则它们在导出中将为空。这非常简单,只要使用select owner, table_name, num_rows, sample_size, last_analyzed from all_tables where owner=[SCHEMA];之类的查询,只要它们的表统计信息是最新的即可。

如果这是您最关心的问题,则可以始终使用以下命令要求他们在导出中排除这些表:

expdp [USER]@[DATABASE] schemas=test exclude=TABLE:"IN ('Table1', 'Table2')" directory=DATA_PUMP_DIR dumpfile=test.dmp logfile=test.log

或者在导入过程中使用以下命令简单地排除它们:

impdp [USER]@[DATABASE] schemas=test exclude=TABLE:"IN ('Table1', 'Table2')" directory=DATA_PUMP_DIR dumpfile=test.dmp logfile=test.log

这两种方法都应该起作用,但是要小心,并确保从约束/子记录的角度来看不会有任何问题。您还可以排除约束。有很多解决方法。

如果计数和导入的行之间不兼容,我建议向供应商询问用于生成导出的特定EXPDP命令或参数文件。这将让您知道空行是否是由export命令中的子句引起的。

  1. 在不了解有关导出源的数据库或查看用于生成导出的命令的更多信息的情况下,不可能知道您的假设是否正确。我会要求供应商在确认这是权限问题之前验证记录数。空表一直创建。