首页 > 解决方案 > 使用 IMP (12.2.0.1.0) 时收到 IMP-00403 警告,但生成的失败的 import_sys.sql 为空

问题描述

我在Windows 2019 (64bit)上有一个Oracle Database 12c Enterprise Edition Release 12.2.0.1.0

简而言之,在导入转储文件时,我得到以下信息:

IMP-00403: 警告:此导入生成了一个单独的 SQL 文件“import_sys”,其中包含由于权限问题而失败的 DDL。

场景的完整细节:

第 1 步:作为 sysdba 的 sqlplus:

CREATE TABLESPACE TEST_1 datafile 'D:/DB_DATA/orcl/TEST_1.DBF' SIZE 1G AUTOEXTEND ON MAXSIZE 31G;
CREATE USER TEST_1 IDENTIFIED BY pwd DEFAULT TABLESPACE TEST_1 QUOTA UNLIMITED ON TEST_1;
GRANT CONNECT TO TEST_1;
GRANT RESOURCE TO TEST_1;
GRANT EXP_FULL_DATABASE TO TEST_1;
GRANT IMP_FULL_DATABASE TO TEST_1;

第 2 步:sqlplus 作为 TEST_1:

CREATE TABLE TEST_1.test_table (field_1 VARCHAR2(10) NOT NULL, field_2 VARCHAR2(10) NOT NULL);
CREATE UNIQUE INDEX TEST_1.i_test_table ON TEST_1.test_table (field_1);
INSERT INTO TEST_1.test_table (field_1,field_2) VALUES ('A','B');
COMMIT;

第3步:从cmd:

exp TEST_1/pwd@orcl TABLES=(TEST_1.test_table) DIRECT=Y FILE=c:\test_table.dmp

第 4 步:作为 TEST_1 的 sqlplus:

DROP TABLE TEST_1.test_table PURGE;

第5步:从cmd:

imp TEST_1/pwd@orcl TABLES=(test_table) FROMUSER=TEST_1 TOUSER=TEST_1 FILE=c:\test_table.dmp

该表实际上是进口的,但我得到了提到的警告。每个论坛都说这是权限问题,应该检查 sql 文件,但生成的文件是空的。我还尝试将 SYS 和 SYSDBA 授予用户,并尝试使用 SYSDBA 帐户本身进行导入 - 总是得到相同的结果。我安装了另一个数据库,但是 12.2 我安装了 12.1 并执行完全相同的步骤,但在 12.1 中没有收到警告。

请不要建议我使用 impdp 而不是 imp 或忽略警告等。这是确切的问题,这就是我需要解决的问题 - 不升级,不降级。

我已经将日志和转储文件与 12.1 生成的文件(有效)进行了比较——我完全看不出有什么区别。我怀疑这是 IMP 本身的问题,但必须有一个解决方案。

有任何想法吗?

标签: sqloracleimport

解决方案


从文档中

注意:从 Oracle Database 12c 第 2 版 (12.2) 开始,出于安全原因,导入实用程序 (imp) 将不再以 SYS 用户身份导入对象。如果转储文件包含需要以用户 SYS 身份重新创建的对象,则 imp 实用程序会尝试以用户 SYSTEM 身份重新创建它们。如果 SYSTEM 用户无法重新创建对象,则必须在导入完成后自己手动重新创建对象。

如果导入作业由具有 DBA 角色的用户运行,并且并非所有对象都可以由用户 SYSTEM 重新创建,则将以下警告消息写入日志文件:

IMP-00403:
Warning: This import generated a separate SQL file "logfilename_sys" which contains DDL that failed due to a privilege issue.

生成的 SQL 文件包含用户 SYSTEM 无法重新创建的对象的失败 DDL。要重新创建这些对象,您必须在导入完成后手动执行失败的 DDL。

即使实际上没有任何事情要做,也会生成警告,您可以从空文件中看到。

我的 Oracle Support Doc ID 2298963.1提到了这个并说:

如果文件为空,则无需手动重新创建对象。

当您检查了文件并且它是空的,并且没有其他警告或错误时,您可以忽略此(虚假)警告。当没有使用上述定义的相关对象时,它会在不需要时报告警告,这似乎是一个小错误——如果令人讨厌的话。

为避免这种情况,请以没有DBA 角色的用户身份运行导入。至少,这就是文档所说的......但你的用户无论如何都没有那个角色。看来限制实际上与exp_full_database和/或imp_full_database角色有关,您的用户确实拥有这些角色,并且这些角色被授予 DBA(由catexp.sql)。考虑到这些角色的强大程度,这种做法是有道理的,但文档令人困惑是没有帮助的。(它在 19c 文档中也是这样说的;我已经给了 Oracle 反馈,参考了你的问题。)

在您的示例中,您不需要exp_full_databaseorimp_full_database角色,因为无论如何您只在单个模式上操作。如果您撤销这些角色,警告应该会消失。


推荐阅读