就Oracle DB知识而言,我完全是新手。试图了解IMPDB命令及其范围。
问题:假设一个特定的数据库中有500个表,当我们将数据导入到一个新的Oracle数据库(从一个数据库中获取数据)时,其中许多表(60%-70%或更多)以零记录的形式出现具有数据库的供应商)。令人怀疑的是,大多数表如何成为数据库中的零记录(为什么首先创建它们?)。此外,我们假设供应商在生成.DMP文件时正在使用特定用户,而该文件无法访问这些表,因此无法访问0。当我们问供应商时,他们说不是Oracle的工作方式,他们提供了用户导出转储,并说:“ Schema是特定用户拥有的数据库对象的集合。这些对象包括表,索引,视图,函数,存储过程等。
当被问到零记录问题时,他们说他们正在正确地提取数据,并且不了解为什么这么多表为零。 SO社区在Oracle DB中拥有出色的专家,任何人都可以对以下方面有所了解:
可能是什么问题?
我们的假设是否正确(即用户无权访问那些记录为零的表)?
前进的正确方向是什么?
4)您要添加的其他内容。
答案 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创建了一堆不必要的表,而这些表从未被删除。模式具有空表可能有很多潜在原因/问题,但这并不意味着数据库或正在生成的导出文件有问题。应用程序及其技术要求一直在变化,并且当不再需要这些表时,很可能根本没有更新架构。
我建议的第一件事是:
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命令中的子句引起的。