Oracle迁移Exadata后调度任务执行报ORA-29913错误故障排查
故障根因分析
该错误ORA-29913为Oracle外部表执行调用失败的典型报错,结合错误栈指向存储过程第34行(访问外部表EXT_TAB_AL_IMPORTLOG_FILE_LIST的游标查询逻辑),以及迁移到Exadata的背景,根因大概率属于以下几类:
1. 目录权限配置缺失
迁移后三类目录的权限未正确配置:
- 数据库层面:ABC用户需要被授予
READ ON DIRECTORY COLEIN_AUDITLOG、EXECUTE ON DIRECTORY COLEIN_PROCESS、WRITE ON DIRECTORY ABC_AL_IMPORTLOG三类目录权限,迁移过程中权限容易丢失。 - 操作系统层面:Oracle运行用户(通常为oracle)需要对三个目录对应的Exadata操作系统路径,分别拥有读、执行、写权限,同时对应路径必须真实存在。
2. 预处理器脚本异常
外部表依赖的预处理器脚本AL_ImportLog_list_files.sh存在适配问题:
- 脚本未同步迁移到Exadata节点的
COLEIN_PROCESS目录下,或未给Oracle用户授予执行权限。 - 原环境与Exadata操作系统存在差异(比如原环境为AIX、Exadata为Linux),脚本内的命令(如ls参数)不兼容新系统。
- Exadata为RAC架构时,脚本及日志目录未部署在共享存储上,调度任务调度到无脚本的节点时直接报错。
3. Exadata特殊安全限制
Exadata默认带有更严格的安全规则:
- 系统参数
preprocessor_executable_allowed未配置允许该预处理器脚本执行,直接拦截了外部表对OS脚本的调用。 - 部署了Database Vault等安全策略,限制了ABC用户调用外部表、UTL_FILE等组件的权限。
验证方法
- 先用ABC用户手动执行
SELECT * FROM EXT_TAB_AL_IMPORTLOG_FILE_LIST;,如果直接报错即可确认是外部表配置问题,和存储过程逻辑无关。 - 手动查询外部表正常的话,再手动执行
EXEC ABC.PR_DELETE_AL_IMPORTLOG;,如果不报错则是调度任务的执行权限配置问题。 - 检查RAC所有节点的对应目录下的文件、权限是否完全一致,确认目录是否属于集群共享存储。
内容的提问来源于stack exchange,提问作者Syed Iftekharuddin
相关产品推荐
相关产品推荐

