让我先总结一下这个问题,我会在总结之后给出我用来获得我所在位置的 SQL 的详细信息。
我正在从生产 AWS RDS Oracle 实例中导出架构,使用数据库链接将文件下载到我的本地开发数据库,然后在 Docker 容器中新安装的 Oracle 的空数据库上本地运行导入。导出和导入使用 Datapump。我收到一条非常模棱两可的错误消息“无效操作”,其中包含同样模棱两可的细节,建议我调用“DBMS_DATAPUMP.GET_STATUS”来“进一步描述错误”。当我这样做时,我得到完全相同的模棱两可的“无效操作”,并建议调用“GET_STATUS”来进一步描述错误。
我什至不知道从哪里开始诊断和解决这个问题。
这是我采取的详细步骤。我已将我们的模式名称替换为“MY_SCHEMA”以保护我们客户的身份......如果该文本中有任何不匹配,我向您保证它在我的控制台中是正确的,并且只是替换这个问题的错误。我使用 SQLDeveloper 来运行这些命令。
- 在运行 19g 的 AWS RDS Oracle 实例上
DECLARE
hdnl NUMBER;
BEGIN
hdnl := DBMS_DATAPUMP.OPEN( operation => 'EXPORT', job_mode => 'SCHEMA', job_name=>null, version=> '18.4.0.0.0');
DBMS_DATAPUMP.ADD_FILE( handle => hdnl, filename => 'my_schema.dmp', directory => 'DATA_PUMP_DIR', filetype => dbms_datapump.ku$_file_type_dump_file);
DBMS_DATAPUMP.ADD_FILE( handle => hdnl, filename => 'my_schema.log', directory => 'DATA_PUMP_DIR', filetype => dbms_datapump.ku$_file_type_log_file);
DBMS_DATAPUMP.METADATA_FILTER(hdnl,'SCHEMA_EXPR','IN (''MY_SCHEMA'')');
DBMS_DATAPUMP.START_JOB(hdnl);
END;
/
- 从我的本地开发数据库 (18g) 连接到 AWS RDS 实例并下载 dmp 文件。是的,我在这里连接为架构所有者,而不是“主人”。这似乎可以下载文件并以“master”的身份连接,但在第一步中作为模式所有者转储不起作用;除非你能指导我如何做到这一点,如果这能解决我的问题。
create database link to_rds connect to my_schema identified by password using '(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=my_schema.aljfjske.us-west-1.rds.amazonaws.com)(PORT=1521))(CONNECT_DATA=(SID=ORCL)))';
BEGIN
DBMS_FILE_TRANSFER.GET_FILE(
source_directory_object => 'DATA_PUMP_DIR',
source_file_name => 'my_schema.dmp',
source_database => 'to_rds',
destination_directory_object => 'DATA_PUMP_DIR',
destination_file_name => 'my_schema.dmp'
);
END;
/
- 在我的本地数据库(连接到名为“my_schema”的可插入数据库)上以“sys”身份登录时开始导入,角色为“sysdba”。
DECLARE
hdnl NUMBER;
BEGIN
hdnl := DBMS_DATAPUMP.OPEN( operation => 'IMPORT', job_mode => 'SCHEMA', job_name=>null);
DBMS_DATAPUMP.ADD_FILE( handle => hdnl, filename => 'my_schema.dmp', directory => 'DATA_PUMP_DIR');
DBMS_DATAPUMP.METADATA_FILTER(hdnl,'SCHEMA_EXPR','IN (''MY_SCHEMA'')');
DBMS_DATAPUMP.START_JOB(hdnl);
end;
/
我收到以下错误:
DECLARE
hdnl NUMBER;
BEGIN
hdnl := DBMS_DATAPUMP.OPEN( operation => 'IMPORT', job_mode => 'SCHEMA', job_name=>null);
DBMS_DATAPUMP.ADD_FILE( handle => hdnl, filename => 'my_schema.dmp', directory => 'DATA_PUMP_DIR');
DBMS_DATAPUMP.METADATA_FILTER(hdnl,'SCHEMA_EXPR','IN (''MY_SCHEMA'')');
DBMS_DATAPUMP.START_JOB(hdnl);
end;
Error report -
ORA-39002: invalid operation
ORA-06512: at "SYS.DBMS_DATAPUMP", line 7297
ORA-06512: at "SYS.DBMS_SYS_ERROR", line 79
ORA-06512: at "SYS.DBMS_DATAPUMP", line 4932
ORA-06512: at "SYS.DBMS_DATAPUMP", line 7291
ORA-06512: at line 7
39002. 00000 - "invalid operation"
*Cause: The current API cannot be executed because of inconsistencies
between the API and the current definition of the job.
Subsequent messages supplied by DBMS_DATAPUMP.GET_STATUS
will further describe the error.
*Action: Modify the API call to be consistent with the current job or
redefine the job in a manner that will support the specified API.
我已经花了 6 个小时以上的时间来阅读 Oracle 文档、指南、尝试东西、将更多信息打印到控制台,但什么也没有。我得到完全相同的错误消息,没有更多信息。转储文件在系统上,我很确定它被正确读取,因为我可以调用utl_file.fgetattr
得到它的大小。我也尝试过使用不同的用户进行导出和导入。没有什么。我在这里完全处于黑暗之中。甚至有关尝试诊断此问题的建议也将不胜感激。这是 Oracle Database 18g Express Edition 的全新安装,使用 Oracle 的 Docker 容器文件在他们的 GitHub 帐户上(这很漂亮,顺便说一句)。RDS 上的生产系统已经运行了好几年,这些年来我已经导出了数十次 Datapump,并成功地将其导入到我在 Fedora Linux 上的本地 11g Express Edition 安装中。(自从生产数据库最近从 12g 升级到 19g 后,这不再有效。这让我开始了这条完整的道路。)
公开资料:
https://mikedietrichde.com/2019/05/14/data-pump-the-time-zone-pitfalls/
https://oracle-base.com/blog/2020/02/19/data-pump-between-database-versions-its-not-just-about-the-version-parameter/
有关 Oracle 支持站点的更多信息:
Impdp 因 ORA-39002 失败:操作无效(文档 ID 2482971.1)
更新了 Oracle RDBMS 和 OJVM 时区文件补丁中的 DST 转换和新时区(文档 ID 412160.1)
默认情况下,Oracle 19c 使用时区版本 32,但亚马逊可能会进一步修补它(目前最高可用版本是 35)。
Oracle 18c 使用时区版本 31。补丁可供下载。
老实说,我从未使用过 XE,也不记得曾经尝试在它的任何版本上应用任何补丁。我不会打扰。是你本地的个人开发数据库,下载使用19c即可。