ORA-31640打不开转储文件导致报错,远程帮忙修复故障过程分享
- 问答
- 2025-12-31 03:11:41
- 2
(引用来源:根据一次真实的Oracle数据库运维支持经历整理)
那天下午,我正准备下班,突然接到一个紧急电话,是另一位同事打来的,说他正在远程支持一个客户,遇到了一个数据库导出问题,搞了一个多小时还没解决,客户有点着急,想请我一起连线看看,我赶紧打开电脑,加入了远程会话。
一进会话,就听到客户在那边说:“哎呀,这个数据泵导出就是报错,明明昨天还好好的,今天换个目录就不行了。”我让同事把错误信息完整地发给我看,屏幕上赫然显示着经典的ORA-31640错误,后面的提示大概意思是“无法打开转储文件 `/new_backup/expdp_full.dmp` 进行写入”。
客户解释说,他们之前一直用 /old_backup 这个目录做导出,因为磁盘空间快满了,所以新创建了一个更大的目录 /new_backup,打算以后都用这个新目录,结果今天第一次用就失败了。
我首先问了一个最基础的问题:“这个 /new_backup 目录,在服务器操作系统上确实存在吗?权限够吗?”客户很肯定地回答:“存在的,我用 mkdir 命令创建的,权限是755。”然后他还特意打开了另一个终端窗口,用 ls -ld /new_backup 命令给我看,目录确实存在,权限是 drwxr-xr-x。
看来不是目录不存在的问题,那下一步,很自然就想到Oracle数据库层面的目录对象,数据泵(expdp)工具不像传统的exp,它不能直接写操作系统的路径,必须通过一个Oracle数据库里创建的“目录对象”(DIRECTORY)来映射到操作系统的实际路径,我让客户用数据库连接工具登录到出问题的数据库实例,执行一个SQL查询:“SELECT * FROM DBA_DIRECTORIES WHERE DIRECTORY_NAME LIKE '%BACKUP%';”
查询结果出来了,果然,里面只有一个目录对象,名字叫 OLD_BACKUP_DIR,对应的路径正是 /old_backup,而那个新创建的 /new_backup 路径,在数据库里根本没有对应的目录对象。

问题原因一下子就清晰了!客户只是在操作系统层面创建了物理目录,却忘了在Oracle数据库内部创建指向这个新路径的目录对象,当数据泵作业运行时,它试图使用一个可能配置为指向 /new_backup 的目录对象(或者作业脚本里直接写了路径,这是错误用法),但实际上这个对象不存在或者指向错误,数据库引擎自然就没有权限去那个位置创建文件,从而报出ORA-31640。
我向客户解释了这个原理:“您看,数据库软件进程(比如数据泵的worker进程)是由Oracle用户和用户组运行的,您虽然在操作系统里用oracle用户能看见和进入 /new_backup,但数据库实例‘知道’的合法出入口(也就是目录对象)只有 OLD_BACKUP_DIR 这一个,它不认识 /new_backup,您得在数据库里给它‘开个门’,它才能过去写文件。”
客户恍然大悟:“哦!我明白了,我以为在系统里建好目录就行了,原来数据库里面还得配一下。”
接下来就是修复步骤了,非常简单:

第一步,以SYSDBA权限的用户登录数据库。 第二步,执行SQL命令创建新的目录对象: CREATE DIRECTORY NEW_BACKUP_DIR AS '/new_backup'; 第三步,同样重要的是,要把这个新目录的使用权限授予执行导出的数据库用户(比如SCOTT): GRANT READ, WRITE ON DIRECTORY NEW_BACKUP_DIR TO SCOTT;
创建和授权完成后,我让客户再次检查了一下操作系统层面,确认Oracle软件的用户(通常是oracle)对 /new_backup 目录确实有读、写、执行的权限(755权限是足够的)。
我让客户修改他的数据泵导出参数文件(parfile),或者命令行参数,将之前可能直接写的路径或者指向旧目录的对象名,统一改为使用这个新创建的 NEW_BACKUP_DIR,在参数文件里将 DUMPFILE=/new_backup/expdp_full.dmp 这种错误写法,改为正确的 DUMPFILE=NEW_BACKUP_DIR:expdp_full.dmp。
客户修改好后,重新提交了导出作业,我们几个人都在屏幕上盯着日志输出,只见作业顺利启动,开始计算对象数量,然后很快就看到了“正在写入导出文件”的提示,后面跟着的就是 NEW_BACKUP_DIR:expdp_full.dmp,成功了!ORA-31640错误没有再出现。
客户长舒一口气,连声道谢,他也总结说:“这次真是学到了,以后就知道了两步走:系统上建目录,数据库里也要建目录对象,缺一不可。”
这次远程支持虽然问题不大,解决起来也快,但很典型,它再次提醒我们,在使用Oracle数据泵这类高度集成于数据库内部的工具时,一定要清晰地区分操作系统资源和数据库内部逻辑对象,任何一个环节的疏忽,哪怕只是一个简单的“忘记创建”,都会导致作业失败,沟通时用“开个门”这样的比喻,也帮助非资深的用户快速理解了问题的核心所在。
本文由盘雅霜于2025-12-31发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:https://www.haoid.cn/wenda/71638.html
