问题描述:由于ORA-20100:为FND_FILE创建文件o0003167.tmp失败。
出问题的原因总结:
1.查看$APPLPTMP系统环境变量的值,一般是/usr/tmp,需要保证该文件夹是存在的。
2.查看utl_file_dir数据库参数,其第一个值也应该为/usr/tmp;
SELECT * FROM V$PARAMETER V WHERE v.NAME='utl_file_dir';
SQL> SHOW PARAMETER UTL_FILE
3.查看该文件夹的权限,该文件夹必须为应用用户和数据库用户都具有读写权限。
4.通过exec FND_FILE.PUT_LINE(FND_FILE.LOG, 'THIS IS A TEST');进行测试,查看是否能输入文件。
5.若以上四个步骤正常,一台服务器上运行了多套环境时,没有修改$APPLPTMP的值,导致两个环境都往/usr/tmp写东西,在第一个环境的序列比较超前时,它已经在该目录里面创建了o0003167.tmp,第二个环境发起请求的时候,它再创建o0003167.tmp的时候就 会创建失败。
当一台服务器上运行了多套环境时,不能使用/usr/tmp作为$APPLPTMP,须定义成各自的目录。且该目录须在数据库参数utl_file_dir中。
解决办法:
1.$APPLPTMP系统环境变量若不正确,或路径不存在:
去建立相应的目录,或者修改$APPLPTMP;
因为 $APPLPTMP 变量是存在于环境变量文件 .bash_profile中,其中指向 .env 文件,而 .env 文件是由 $CONTEXT_FILE 而来, 为避免adautocfg.sh 之后被还原, 我们修改 $CONTEXT_FILE 中的 s_applptmp 变量的值为某个目录,并确保目录是存在的且有权限的。
2.utl_file_dir参数值不正确,或路径不存在:
去建立相应的目录,或者修改utl_file_dir参数;
数据库的 utl_file_dir 第一个值也需要修改为与$APPLPTMP系统环境变量一样的目录,并确保在数据库服务器中存在且有权限读写。
utl_file_dir参数一般会有好几个值,需要对每个值都做检查(是否有读写权限,目录是否有效)。
若数据库使用spfile,则用以下步骤修改utl_file_dir:
① 以管理员用户(sys/password@sid as sysdba)登录数据库服务器
② SQL> alter system set utl_file_dir='…', '…' scope=spfile;
System altered.
SQL> shutdown immediate;
SQL> startup;
SQL> show parameter utl_file
(笔者原创文章,转载请注明出处:https://blog.csdn.net/LFCuiYs)谢谢!