使用AWS re:Post即您表示您同意 AWS re:Post 使用条款

在我的 Amazon RDS for Oracle 数据库实例中使用 DMBS DATA PUMP API 时,为什么会出现错误?

4 分钟阅读
0

当我尝试在 Amazon Relational Database Service (Amazon RDS) for Oracle 数据库实例中使用 DBMS_DATAPUMP 时收到错误。

简短描述

DMBS_DATAPUMP 会由于以下原因而失败:

  • 缺少用户权限或角色
  • 缺少 Oracle Data Pump Directory 的读写权限
  • 文件权限问题
  • 源版本和目标版本不兼容,或时区文件版本不匹配
  • DMBS_DATAPUMP PL/SQL 块中存在轻微语法错误

以下是使用 DMBS_DATAPUMP 时会遇到的常见错误:

  • ORA-39001:invalid argument value
  • ORA-31626:job does not exist
  • ORA-39002:invalid operation
  • ORA-39070: Unable to open the log file

解决方法

使用以下方法之一执行 RDS for Oracle 数据库实例的导入或导出:

如果在执行导入或导出时收到 DBMS_DATAPUMP API 错误消息,请完成以下故障排除步骤。

查看 Data Pump 导入日志文件内容中是否存在错误

运行以下 SQL 命令,查看导入日志文件和数据库提醒通知中是否存在任何错误消息。将 DATA_PUMP_DIR<import log filename> 替换为您的值:

-- View Import logs from DATA_PUMP_DIR directory.  
SELECT text FROM table(rdsadmin.rds_file_util.read_text_file('DATA_PUMP_DIR','<import log filename>'));

您也可以使用以下 SQL 语句访问 DB 警报日志:

SELECT message_text FROM alertlog;

检查您的用户权限

在开始导出或导入任务之前,请确保您的数据库用户具有足够的权限。有关更多信息,请参阅 Oracle 网站上的 Oracle Data Pump 导出和导入操作所需的角色

以下是运行导出或导入操作的最低要求:

  • CREATE SESSION
  • CREATE TABLE
  • 有效目录对象的对象 READ 和 WRITE 权限
  • 用户的默认表空间上有充足的表空间配额
  • DATAPUMP_EXP_FULL_DATABASE 数据库角色用于运行完整数据库 Data Pump 导出作业
  • DATAPUMP_IMP_FULL_DATABASE 数据库角色用于运行完整数据库 Data Pump 导入作业

**注意:**这些要求适用于运行 Data Pump 导出或导入任务时连接到数据库的用户,不适用于导出或导入完成之后的用户。

要检查授予的角色和默认角色,请运行以下 SQL。将 <USERNAME> 替换为运行 Data Pump 任务时连接到数据库的用户名:

SELECT grantee, granted_role, default_role    FROM dba_role_privs   WHERE grantee IN ('<USERNAME>', 'PUBLIC') ORDER BY 1,2;

要检查授予的系统权限,请运行以下命令。将 <USERNAME> 替换为运行 Data Pump 任务时连接到数据库的用户名:

SELECT grantee, privilege    
  FROM dba_sys_privs    
 WHERE (grantee IN ('<USERNAME>', 'PUBLIC')    
  &einbsp;     OR grantee IN (SELECT granted_role FROM dba_role_privs    
                       WHERE grantee IN ('<USERNAME>', 'PUBLIC'))) order by 1;

授予目录的读写权限

要确认您授予了该目录的读写权限,请运行以下命令。将 <USERNAME> 替换为运行 Data Pump 任务时连接到数据库的用户名:

select PRIVILEGE,TYPE from DBA_TAB_PRIVS where TABLE_NAME='DATA_PUMP_DIR' and GRANTEE='<USERNAME>';

检查用于存储转储文件和日志文件的数据库目录

检查用于存储转储文件和日志文件的数据库目录是否存在。如果您使用 DATA_PUMP_DIR 目录,则运行与以下示例类似的命令:

select PRIVILEGE,TYPE from DBA_TAB_PRIVS where TABLE_NAME='DATA_PUMP_DIR' and GRANTEE='<USERNAME>';

检查 Data Pump 导出转储文件

要检查 Data Pump 导出转储文件是否存在,请运行与以下示例类似的命令:

SQL> select * from table(RDSADMIN.RDS_FILE_UTIL.LISTDIR('DATA_PUMP_DIR')) where FILENAME='dumpname.dmp';

查看兼容性矩阵

在 Oracle 网站上查看不同 Oracle 版本之间 Data Pump 的兼容性。只能将转储文件导入到具有相同或更高兼容性级别的数据库。您可能需要将转储文件导入到较低版本的目标数据库。在这种情况下,使用导出 Data Pump VERSION 参数来匹配目标数据库的兼容性级别。有关更多信息,请参阅 Oracle 网站上的 VERSION

此示例命令使用 VERSION 参数来匹配目标数据库的兼容性:

DECLARE  
hdnl NUMBER;  
BEGIN  
hdnl := DBMS_DATAPUMP.OPEN( operation => 'EXPORT', job_mode => 'SCHEMA', job_name=>null,version => '19.0.0.0');  
DBMS_DATAPUMP.ADD_FILE( handle => hdnl, filename => 'test_src6.dmp', directory => 'DATA_PUMP_DIR', filetype => dbms_datapump.ku$_file_type_dump_file);  
DBMS_DATAPUMP.ADD_FILE( handle => hdnl, filename => 'test_src6.log', directory => 'DATA_PUMP_DIR', filetype => dbms_datapump.ku$_file_type_log_file);  
DBMS_DATAPUMP.METADATA_FILTER(hdnl,'SCHEMA_EXPR','IN (''USER1'',''USER2'')');  
DBMS_DATAPUMP.START_JOB(hdnl);  
END;  
/

如果源数据库中的时区文件版本高于目标数据库中的版本,则在执行导入时可能会看到以下错误消息:

  • ORA-39002:invalid operation
  • Ora-3905: Oracle Data Pump does not support importing from a source database with XTSTZ version XX into a target database with TSTZ version XXX

要解决此问题,必须使用源数据库时区文件版本来修补或更新目标数据库。

要查找 Oracle 时区版本,请运行以下查询:

Select name,value$ from sys.props$ where name='DST_PRIMARY_TT_VERSION';

检查下载任务日志文件

如果您使用 Amazon Simple Storage Service (Amazon S3) 集成来下载转储文件,请检查下载任务日志文件。确保复制的转储文件不存在错误。运行以下命令来检查下载任务日志文件。将 task-id 替换为上传或下载过程返回的任务 ID:

SQL> SELECT * FROM TABLE(rdsadmin.rds_file_util.listdir(p_directory => 'BDUMP')) where FILENAME like 'dbtask%' order by MTIME;  
SQL> SELECT text FROM table(rdsadmin.rds_file_util.read_text_file('BDUMP','dbtask-"task-id".log'));  
SQL> SELECT text FROM table(rdsadmin.rds_file_util.read_text_file('BDUMP','dbtask-1611697375220-44.log'));

解决语法错误

通常,轻微的语法错误会导致 Data Pump API 失败。请参阅以下由数据库中的语法问题导致的错误示例:

DECLARE  
hdnl NUMBER;  
BEGIN  
hdnl := DBMS_DATAPUMP.OPEN( operation => 'EXPORT', job_mode => 'SCHEMA', job_name=>null);  
DBMS_DATAPUMP.ADD_FILE( handle => hdnl, filename => 'TestDumpfile.dmp', directory => 'DATA_PUMP_DIR', filetype => dbms_datapump.ku$_file_type_dump_file);  
DBMS_DATAPUMP.ADD_FILE( handle => hdnl, filename => 'test_logfile.log', directory => 'DATA_PUMP_DIR', filetype => dbms_datapump.ku$_file_type_log_file);  
DBMS_DATAPUMP.METADATA_FILTER(hdnl,'SCHEMA_EXPR','IN (''user1'',''user2'')');  
DBMS_DATAPUMP.START_JOB(hdnl);  
END;  
/  
Error report -  
ORA-39001: invalid argument value  
ORA-06512: at "SYS.DBMS_SYS_ERROR", line 79  
ORA-06512: at "SYS.DBMS_DATAPUMP", line 4929  
ORA-06512: at "SYS.DBMS_DATAPUMP", line 6378  
ORA-06512: at line 7  
39001. 00000 -  "invalid argument value"  
*Cause:    The user specified API parameters were of the wrong type or  
           value range.  Subsequent messages supplied by  
           DBMS_DATAPUMP.GET_STATUS will further describe the error.

要解决这些错误,请采取以下操作:

  • 确认在命令中指定的用户、表和对象存在于数据库中。
  • 检查现有转储文件的名称是否与您在命令中指定的名称相同。
  • 在调用 DBMS_DATAPUMP.ADD_FILE 之前,请确保目标位置不存在转储文件。如果转储文件存在,则移除该文件。或者,为每次调用设置唯一的文件名。
  • 确保用户名或架构名称为大写。
  • 如果 API 在命令中使用 dblink,请确保您可以访问所引用的数据库链接。此外,在 DBMS_DATAPUMP API 调用中使用 dblink 命令之前,请确保您可以通过该命令运行查询。

使用异常处理来捕获详细的错误消息

在某些情况下,DBMS_DATAPUMP 会给出一个没有提供太多详细信息的一般性错误消息。使用异常处理程序段来获取有关错误的更多信息。有关异常处理程序段的示例,请参阅 Oracle 网站上的使用 Data Pump API 的示例

根据详细错误消息中的信息,您可以解决问题。例如,如果 DATA_PUMP_DIR 中已经存在转储文件名,则异常处理程序段会产生与以下示例类似的错误消息:

“Exception in Data Pump job
ORA-39001:invalid argument value
ORA-39000:bad dump file specification
ORA-31641:unable to create dump file /rdsdbdata/datapump/example3.dmp
ORA-27038:created file already exists
Additional infomation: 1”

如果您将架构指定为 user1,则异常处理程序段会产生与以下示例类似的错误消息:

“Exception in Data Pump job
ORA-39001:invalid argument value
ORA-39170: Schema expression IN ('user1') does not correspond to any schemas。”

监控 Data Pump 作业的进度

DBA_DATAPUMP_JOBS 视图显示 Data Pump 导出或导入作业是处于活动状态还是已终止。这用成功或失败的状态来表示。要获取有关 Data Pump 导入或导出的详细信息,请查询 V$SESSION_LONGOPS 数据字典。有关更多信息,请参阅 Oracle 网站上的 DBA_DATAPUMP_JOBSV$SESSION_LONGOPS

例如,您可以运行以下命令来检查 Data Pump 任务的当前状态以及已完成的进度百分比:

SELECT sl.sid, sl.serial#, sl.sofar, sl.totalwork, dp.owner_name, dp.state, dp.job_mode  
FROM v$session_longops sl, v$datapump_job dp  
WHERE sl.opname = dp.job_name  
AND sl.sofar != sl.totalwork;

相关信息

使用 Oracle Data Pump 进行导入

Oracle 网站上的 DBMS_DATAPUMP

Oracle 网站上的使用 Data Pump API 的基本步骤是什么?

AWS 官方
AWS 官方已更新 1 年前