一、背景簡介
上午應(yīng)用找來,給了倆錯誤,錯誤信息如下
ORA-06512: 在 "SYS.UTL_FILE", line 536
ORA-29283: 文件操作無效
以上報錯簡單來說,就是調(diào)用 sys.utl_file 輸出文件,但是輸出的目錄不存在,進(jìn)一步溝通發(fā)現(xiàn),用戶輸出的目錄是一個掛載的共享的 windows 文件夾,沒錯,是在 linux 上掛了一個 windows 的文件夾。
二、解決過程
首先嘗試直接將 windows 上的文件夾掛載上去
mount -t cifs //目標(biāo)機(jī)器/目標(biāo)目錄 /test -o username=xxxx
但是這樣掛載存在一個問題,就是文件的權(quán)限為 755 ,而 mount 命令只有 root 才能執(zhí)行,這意味著 oracle 對文件夾沒有寫的權(quán)限,oracle 輸出文件至掛載的 windows 需要寫的權(quán)限,換用以下掛載方式。
mount -t cifs //目標(biāo)機(jī)器/目標(biāo)目錄 /test -o username=xxxx,dir_mode=0777,file_mode=0777
至此,文件夾正確掛載好。
注意,每個節(jié)點都需要掛載
三、補(bǔ)充知識
1. 關(guān)于 oracle 里的文件夾
oracle 數(shù)據(jù)庫并不能直接輸出文件到 os 上的文件夾,而是通過創(chuàng)建數(shù)據(jù)庫內(nèi)部和 os 上的實際文件夾之間的關(guān)聯(lián)輸出文件,如
create or replace directory test as '/test';
以上命令可在 oracle 數(shù)據(jù)庫內(nèi)部創(chuàng)建一個名叫 test 的目錄,與其實際關(guān)聯(lián)的 os 目錄為 /test,要使目錄正常可用,os 上必須實際存在這個目錄且可用。
select * from dba_directories;
以上命令可以查詢 oracle 數(shù)據(jù)庫里所有的目錄和與之對應(yīng)的 os 目錄。
2. 關(guān)于掛載
此次問題根本原因在于主機(jī)被重啟了,而由于掛載需要輸入口令,用戶并沒有將掛載命令寫入 /etc/fstab 目錄,導(dǎo)致主機(jī)重啟后未能重新掛上。
remoteHost:/目錄 /本地目錄 nfs intr,hard,bg,vers=3 0 0
以上為 /etc/fstab 中一條。
umount /test
卸載的命令,/test 為待卸載的目錄
mount
df -h
直接輸 mount 命令 或者 df -h 可以查看掛載情況。