我正在尝试使用数据泵进行导入,但我正在努力提出正确的选择。导出被视为模式导出。我试图只导入表,没有其他数据库对象。
我目前正在使用
INCLUDE=TABLE
TABLE_EXISTS_ACTION=REPLACE
REMAP_SCHEMA=
REMAP_TABLESPACE=
这是正确导入表,但我有点惊讶地看到导入也在表上创建约束和触发器,或者至少尝试这样做。触发器失败,因为它们包含数据库中不存在的模式名称。
我认为INCLUDE=TABLE
只使用表格会被包括在内。显然情况并非如此。我无法使用EXCLUDE=CONSTRAINT
,或者EXCLUDE=TRIGGER
因为我已经在使用 INCLUDE 将导入限制为表。
关于如何将导入构建为仅导入表的任何想法?
你说得对,我认为
INCLUDE=TABLE
只使用表格会被包括在内,但它也包括所有相关对象。INCLUDE=TABLE
这意味着当您在导入时使用时,将为您创建约束和触发器。可能的解决方案
如果您有可能使用该命令重新创建转储,
expdp
那么您可能只想导出所需模式的表并使用该INCLUDE
参数。exp_include.par
这基本上就是 expdp 参数文件。
这将创建所需架构的转储,并且仅包含表和依赖对象。
生成所需文件后,使用选项
*.dmp
导入。EXCLUDE=...
imp_exclude.par
这是 impdp 的参数文件。
这应该会导致正确导入表。
参考资料
不能在同一个导入作业中指定参数 EXCLUDE 和 INCLUDE。您可以使用以下方法之一来实现表和索引,但不会导入触发器、约束或引用约束。如果您也不需要索引,则可以以类似的方式将它们从导入中排除。
方法 1:您在导入中包含表,并使用进一步的 INCLUDE 指令从导入中排除触发器、约束和引用约束。一个指定以下内容:
没有满足给定子句的触发器,这意味着触发器名称是一个空字符串。这同样适用于约束和参照约束
方法2:您不使用 INCLUDE 指令来指定只应导入表,而是使用不同的方法。比您可以使用 EXCLUDE 来避免触发器、约束和引用约束的导入。
您可以在表导入中指定要导入的表列表
如果表的列表比这个方法大,这个方法不是很有用。
仅指定表的另一种方法是使用表空间导入。转储文件中的表使用的表空间数通常远小于表数
例子
对于这些示例,我使用 Oracle 数据库 11.2.0.4 企业版。
我创建了一个带有一些表、触发器、过程、约束和引用约束的模式 SCOTT。然后我使用以下参数进行了模式导出
以下是此导出日志文件的相关部分
所以user、grants、procedures、constaints、reference constraint、trigger和DEPT、EMP、SALGRADE这五个表;导出用户 SCOTT 的 BONUS、JOB_HISTORY。
现在我不会在数据库中导入这个转储,但我只会创建一个 SQL 文件,其中包含将由导入执行的语句。这可以通过导入参数文件中的参数 SQLFILE 来实现。
首先,我完全导入转储文件。这将从转储文件中导入所有内容
这导致以下结果
如果一个人使用模式输出
创建一个类似的日志文件。
现在我们只包括表格
这会产生以下日志文件:
表和从属对象被创建。现在我们使用更多的 INCLUDE 指令来避免导入不需要的对象:
这正是我们想要的结果:
如果我们使用表导入并指定这 5 个表并排除不需要的对象,我们会得到一个类似的日志文件
如果我们使用表空间导入,我们也会得到这样的日志文件。用户 SCOTT 的所有对象都在表空间 USERS 中。