【真实经验分享】Oracle EBS 磁盘空间上 *.tmp 文件占用过高
·
1 问题描述
某客户发现 Oracle EBS 系统某个目录下占用高达1.6T,查看发现该目录下都是 *.tmp 文件
2 问题分析
含有大量 .tmp 的目录为 /ebs/prod/tmp
查看 dba_directories 视图,发现该目录DIRECTORY_NAME为EBS_DB_DIR_UTIL
2.1 *.tmp 文件 的本质
-
在 Oracle E-Business Suite (EBS) 中,生成的 *.tmp 文件是 PL/SQL 临时输出文件,主要用于并发处理(Concurrent Processing)过程中的数据交换和缓冲。
-
*.tmp文件是 FND_FILE 包 在后台生成的临时文件,存储在由环境变量 $APPLPTMP (应用层环境变量,指定 PL/SQL 输出临时文件的目录)指定的目录中,该目录必须与数据库参数 UTL_FILE_DIR (数据库参数,指定 UTL_FILE 包可以访问的 OS 目录)的第一个值保持一致。
2.2 产生 *.tmp 文件的核心场景
| 场景 | 说明 |
|---|---|
| 并发请求输出 | 当并发程序使用 FND_FILE.PUT_LINE 写入日志或输出时,数据先写入 .tmp 临时文件,最终再转为 .req(日志)或 .out(输出)文件 |
| PL/SQL 程序缓冲 | 数据库端的 PL/SQL 过程通过 UTL_FILE包写入文件时,如果目标路径在 UTL_FILE_DIR 中,会生成临时文件 |
| 报表生成中间文件 | Oracle Reports 等工具在生成最终输出前,可能先写入临时文件 |
2.3 19c 中的核心变化
Oracle 19c 已废弃 UTL_FILE_DIR 初始化参数,EBS 改为使用 Database Directory 对象(即 dba_directories)管理 PL/SQL 文件 I/O 目录 。
为了兼容旧代码,EBS 在 APPS schema 中创建了两个虚拟视图:
apps.v$parameter、apps.v$parameter2
它们模拟了旧的 utl_file_dir 参数,但底层实际生效的是 dba_directories 中的 DIRECTORY 对象即 EBS_DB_DIR_UTIL
3 解决方案
3.1 查看是否有进程正在写入
lsof +D /ebs/prod/tmp
3.2 先移动3个月前的文件
mkdir -p /tmp/ebstmp_backup
find /ebs/prod/tmp -name "*.tmp" -mtime +90 -exec mv {} /tmp/ebstmp_backup/ \;
3.3 观察一段时间后再将 /tmp/ebstmp_backup 清空
更多推荐


所有评论(0)