sql - 使用 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 本身的问题,但必须有一个解决方案。
有任何想法吗?
解决方案
从文档中:
注意:从 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_database
orimp_full_database
角色,因为无论如何您只在单个模式上操作。如果您撤销这些角色,警告应该会消失。
推荐阅读
- botframework - 如何在节点机器人 v4 中实现确认提示默认语言环境
- json - 为什么我无法检索我的数据?(Flutter-Rest API)
- unity3d - 将 Unity RenderTexture 流式传输到 Gstreamer
- php - 如何使用 laravel Facade 模拟传递引用参数?
- spring-boot - Springboot Application 启动失败,OutOfMemoryError: Java heap space (Unable to create entityManagerFactory Bean)
- google-cloud-platform - 如何防止 Google Cloud Function 实例宕机
- flutter - 嵌套行/列中的颤振扩展图表
- visual-studio - MDX openingperiod, closingperiod 和 sum(measure) 返回相同的值
- c - C预处理器:从给定的枚举值声明结构数据
- php - 填写一个字段后如何自动填写其他表单字段?