在我的 Amazon RDS for Oracle 数据库实例中使用 DMBS DATA PUMP API 时,为什么会出现错误?
当我尝试在 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 数据库实例的导入或导出:
- Oracle Instant Client (expdp/impdp): 在您的计算机上或 Amazon Elastic Compute Cloud (Amazon EC2) 实例上安装该客户端。Oracle impdp 和 expdp 实用程序允许您使用远程主机从命令行执行导出和导入操作。有关更多信息,请参阅如何使用 Oracle Instant Client 为 Amazon RDS for Oracle 数据库实例运行 Data Pump 导入或导出?
- Data Pump API (DBMS_DATAPUMP): DBMS_DATAPUMP 软件包提供了 PL/SQL API,允许您以编程方式执行导出和导入。在启动 Data Pump 任务之前,请查看最佳实践。
如果在执行导入或导出时收到 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_JOBS 和 V$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 网站上的 DBMS_DATAPUMP
Oracle 网站上的使用 Data Pump API 的基本步骤是什么?
相关内容
- AWS 官方已更新 9 个月前
- AWS 官方已更新 9 个月前
- AWS 官方已更新 2 个月前