AWS Oracle RDS运行S3下载校验脚本报29283错误如何解决?
问题原因
- 问题的核心是RDS S3下载任务提交后,对应的任务日志文件不会即时生成。原脚本提交完下载任务后立刻进入循环查询日志,此时RDS后台还未创建对应的dbtask-*.log文件,首次调用日志读取接口时就会触发文件不存在的29283错误,直接中断PL/SQL执行。
- 单独执行输出的V_CMD语句时,距离任务提交已经间隔了一段时间,日志文件已经生成完成,因此可以正常执行返回结果。
解决方案
修改思路为两点:一是在轮询之间增加等待时长,给日志生成预留缓冲时间;二是捕获文件不存在的29283异常,遇到该错误时不中断执行,继续等待重试。
修改后的脚本如下:
DECLARE V_TASKID VARCHAR2(100); V_CTR integer := 0; V_CMD VARCHAR2(4000) := NULL; -- 捕获文件不存在的指定错误码 e_file_not_exists EXCEPTION; PRAGMA EXCEPTION_INIT(e_file_not_exists, 29283); BEGIN SELECT rdsadmin.rdsadmin_s3_tasks.download_from_s3(p_bucket_name => 'humm-cards-dev', p_directory_name => 'DATA_PUMP_DIR') INTO V_TASKID FROM DUAL; dbms_output.put_line('下载任务ID:'||V_TASKID) ; WHILE V_CTR = 0 LOOP BEGIN V_CMD := 'SELECT count(*) FROM table(rdsadmin.rds_file_util.read_text_file(''BDUMP'', ''dbtask-' || V_TASKID || '.log'')) WHERE text LIKE ''%finished successfully%'''; execute immediate V_CMD INTO V_CTR; IF V_CTR > 0 THEN dbms_output.put_line('下载任务执行成功'); EXIT; END IF; -- 每次查询后等待3秒,可根据实际文件大小调整 DBMS_SESSION.SLEEP(3); EXCEPTION WHEN e_file_not_exists THEN -- 日志未生成,继续等待 DBMS_SESSION.SLEEP(3); WHEN OTHERS THEN -- 其他异常正常抛出 RAISE; END; END LOOP; END; /
注意事项
- 如果当前用户没有
DBMS_SESSION.SLEEP的执行权限,可以替换为DBMS_LOCK.SLEEP,使用前需要给当前用户授予EXECUTE ON DBMS_LOCK权限。 - 可以根据下载文件的大小调整等待时长,文件越大等待时长可适当调大,减少无效轮询次数。
内容的提问来源于stack exchange,提问作者Hammad Mansoor
相关产品推荐
相关产品推荐

