一、背景简介
上午应用找来,给了俩错误,错误信息如下
ORA-06512: 在 "SYS.UTL_FILE", line 536
ORA-29283: 文件操作无效
以上报错简单来说,就是调用 sys.utl_file 输出文件,但是输出的目录不存在,进一步沟通发现,用户输出的目录是一个挂载的共享的 windows 文件夹,没错,是在 linux 上挂了一个 windows 的文件夹。
二、解决过程
首先尝试直接将 windows 上的文件夹挂载上去
mount -t cifs //目标机器/目标目录 /test -o username=xxxx
但是这样挂载存在一个问题,就是文件的权限为 755 ,而 mount 命令只有 root 才能执行,这意味着 oracle 对文件夹没有写的权限,oracle 输出文件至挂载的 windows 需要写的权限,换用以下挂载方式。
mount -t cifs //目标机器/目标目录 /test -o username=xxxx,dir_mode=0777,file_mode=0777
至此,文件夹正确挂载好。
注意,每个节点都需要挂载
三、补充知识
1. 关于 oracle 里的文件夹
oracle 数据库并不能直接输出文件到 os 上的文件夹,而是通过创建数据库内部和 os 上的实际文件夹之间的关联输出文件,如
create or replace directory test as '/test';
以上命令可在 oracle 数据库内部创建一个名叫 test 的目录,与其实际关联的 os 目录为 /test,要使目录正常可用,os 上必须实际存在这个目录且可用。
select * from dba_directories;
以上命令可以查询 oracle 数据库里所有的目录和与之对应的 os 目录。
2. 关于挂载
此次问题根本原因在于主机被重启了,而由于挂载需要输入口令,用户并没有将挂载命令写入 /etc/fstab 目录,导致主机重启后未能重新挂上。
remoteHost:/目录 /本地目录 nfs intr,hard,bg,vers=3 0 0
以上为 /etc/fstab 中一条。
umount /test
卸载的命令,/test 为待卸载的目录
mount
df -h
直接输 mount 命令 或者 df -h 可以查看挂载情况。