Oracle EBS R12.2.14 清理FND_LOBS并释放磁盘空间

📅 2026/7/10 19:58:39
Oracle EBS R12.2.14 清理FND_LOBS并释放磁盘空间
前言当前数据库存储资源紧张希望在现有硬件基础上寻求最大化节省磁盘空间的方案。当前文章主要针对FND_LOBS进行清理释放的磁盘空间340G。可行性方案定期对数据库服务器的跟踪日志Trace Log进行日志轮转与清理。定期清理归档日志。定期监控表空间的使用率重点关注比较大的表空间。磁盘信息实施步骤1、查询FND_LOBS段大小SQLselectt.segment_name,t.segment_type,ROUND(t.bytes/1024/1024/1024,2)AS SIZE_GB from dba_segments t whereSEGMENT_NAMESYS_LOB0000035869C00006$$order by SIZE_GB desc;2、查询附件过期时间注意此处查询哪些文件存在过期时间同时需要确认删除多少年前的数据以上传日期作为条件。如果这些数据没有过期时间那么统一指定过期时间。然后执行官方程序删除FND_LOBS中的数据信息SQLselect* from fnd_lobs where upload_dateto_date(2025-10-31,yyyy-mm-dd);3、更新过期时间注意筛选出所有是中文的和所有upload_date为空的行更改其过期时间。同时将指定时间前的数据添加过期时间因为EBS 标准程序只针对有过期时间的列才会执行删除。过期时间如超过SYSDATE时间则不会被删除-- 查询为中文的数据 SQLselectcount(*)from FND_LOBS WHERE FILE_NAMECONVERT(FILE_NAME,US7ASCII,UTF8)AND PROGRAM_NAME IS NULL AND upload_dateto_date(2025-10-31,yyyy-mm-dd);-- 查询upload_date为空的数据 SQLselect* from FND_LOBS WHERE PROGRAM_NAME IS NULL AND UPLOAD_DATE IS NULL -- 中文数据更改过期时间 SQLupdate fnd_lobssetexpiration_dateto_date(2025-10-31,yyyy-mm-dd)where file_idin(select file_id from FND_LOBS WHERE FILE_NAMECONVERT(FILE_NAME,US7ASCII,UTF8)AND PROGRAM_NAME IS NULL AND upload_dateto_date(2025-10-31,yyyy-mm-dd));-- upload_date为空的数据更改过期时间 SQLupdate fnd_lobssetexpiration_dateto_date(2025-10-31,yyyy-mm-dd)where file_idin(select file_id from FND_LOBS WHERE PROGRAM_NAME IS NULL AND UPLOAD_DATE IS NULL AND upload_dateto_date(2025-10-31,yyyy-mm-dd));-- 更改指定数据的过期时间 SQLUPDATE fnd_lobs SET expiration_dateto_date(2025-10-31,yyyy-mm-dd)WHERE upload_dateto_date(2025-11-1,yyyy-mm-dd);SQLcommit;4、搜索标准程序注意此处搜索程序是为了确认“Purge Obsolete Generic File Manager Data”程序在“System Administrator Reports”请求集中。因为该请求属于系统标准请求需要使用sysadmin用户提交路径SYSADMIN用户登录 -- System Administrater -- Security --Responsibility -- Request -- 搜索并添加Purge Obsolete Generic File Manager Data 标准程序5、运行程序注意该程序仅针对FND_LOBS中指定了过期时间的数据进行删除其它数据则不删除。提交参数时仅将“Expired”指定为YES即可其余默认。在12.2之后的版本中会多出一个参数“Purge Orphaned Attachements”默认为NO即可6、查询数据注意此处查询FND_LOBS被指定过期时间的数据是否删除。SQLselectcount(*)from fnd_lobs where upload_dateto_date(2025-11-1,yyyy-mm-dd);7、MOVE数据注意针对fnd_lobs中的lob字段执行原地MOVE时会在当前表空间中重新分配数据块所以当前表空间需要有足够的容量同时服务器上也需要有足够的磁盘空间大概会增加几百G。SQLalter table applsys.FND_LOBS move lob(FILE_DATA)store as SYS_LOB0000035869C00006$$;8、新建表空间注意此处新建表空间是为了释放原表空间中的碎片空间。同时新建的表空间容量必须足够存储FND_LOBS中的数据。根据APPS_TS_MEDIA总量计算平均每个数据文件的大小并多出几十G作为备用即可。当前文档中的背景下新增了53个数据文件每个数据文件15G同时指定了五个数据文件做自增以防止特殊情况出现。# 查询业务表空间大小SQLSELECT a.tablespace_name表空间名, total表空间大小,free表空间剩余大小,(total -free)表占用空间大小, ROUND((total -free)/ total *100,2)||%已使用空间百分比FROM(SELECT tablespace_name, SUM(bytes)/1024/1024total FROM dba_data_files GROUP BY tablespace_name)a,(SELECT tablespace_name, SUM(bytes)/1024/1024freeFROM dba_free_space GROUP BY tablespace_name)b WHERE a.tablespace_nameb.tablespace_name ORDER BY(total -free)DESC;# 新建表空间及数据文件SQLcreate tablespace TEMP_MEDIA datafile/u01/db/oradata/cdb/orcl/temp_media01.dbfsize 15G;..............................SQLalter tablespace TEMP_MEDIAadddatafile/u01/db/oradata/cdb/orcl/temp_media52.dbfsize 15G;SQLalter tablespace TEMP_MEDIAadddatafile/u01/db/oradata/cdb/orcl/temp_media53.dbfsize 15G autoextend on next 2G,9、移动数据对象注意此处需要移动“APPS_TS_MEDIA”表空间中的所有对象到新建的临时表空间中“TEMP_MEDIA”。“APPS_TS_MEDIA”表空间中的所有对象都按照该方式进行移动。按照该方式移动完之后原业务表空间的碎片即释放。# 1、查看表上的约束SQLSELECT * FROM dba_constraints WHERE table_nameFND_LOBSAND ownerAPPLSYSORDER BY constraint_type, constraint_name;# 2、查询表上是否存在索引SQLselect* from dba_indexes wheretable_nameFND_LOBS;# 3、校验表上的logsegment和lob index是否存在SQLselect* from dba_lobs where segment_namein(select segment_name from dba_segments where tablespace_nameAPPS_TS_MEDIA)andtable_nameFND_LOBS;# 4、移动表注意此处需要将表对象移动到临时新建的表空间中 SQLalter table APPLSYS.FND_LOBS move tablespace TEMP_MEDIA;# 5、移动 logsegment注意SQL中LOB字段对应的是第三步中查询出来的column_name有些表会存在多个LOB字段每个LOB字段都是一行如果遇到column_name中存在“POI_POINT.SDO_ORDINATES” 这种结构的数据 则无需手动执行移动在移动表后就会自动自动过去。其中LOB类型的索引也会自动以过去无需手动执行 SQLALTER TABLE APPLSYS.FND_LOBS MOVE TABLESPACE TEMP_MEDIA LOB(FILE_DATA)store as(tablespace TEMP_MEDIA);# 6、重建索引注意有些表中存在常规索引这部分需要在移动完表数据后手动在新的表空间中重建 SQLalter index APPLSYS.FND_RE_LOBS_UK1 rebuild tablespace TEMP_TS_MEDIA;# 7、验证是否移动完成注意只要对应的对象存在临时表空间中且原表空间中不存在即可 SQLselect* from dba_tables wheretablespace_nameTEMP_MEDIA;-- 目标表空间查询 SQLselect* from dba_tables wheretablespace_nameAPPS_TS_MEDIA;-- 原表空间中查询# 8、移动fnd_lobs表 先移动表到新的表空间 SQLalter table APPLSYS.FND_LOBS move tablespace TEMP_MEDIA; 再移动表数据 SQLALTER TABLE APPLSYS.FND_LOBS MOVE TABLESPACE TEMP_MEDIA LOB(FILE_DATA)store as(tablespace TEMP_MEDIA); 重建索引 SQLalter index APPLSYS.FND_REPOSITORY_LOBS_UK1 rebuild tablespace TEMP_MEDIA;10、重置数据文件大小注意此处重置的是业务表空间中的大小SQLselectalter database datafile|| ||file_name|| ||resize 4144MBfrom dba_data_files wheretablespace_nameAPPS_TS_MEDIA;11、再移回数据即可注意此处同样按照第九步方式执行12、删除临时表空间 删除表空间的数据文件 SQLselectalter tablespace TEMP_TS_MEDIA drop datafile || ||file_id||;from dba_data_files wheretablespace_nameTEMP_MEDIA; 删除表空间 SQLdrop tablespace TEMP_MEDIA including contents and datafiles;13、验证即可