前言
可行性方案
定期对数据库服务器的跟踪日志(Trace Log)进行日志轮转与清理。 定期清理归档日志。 定期监控表空间的使用率,重点关注比较大的表空间。
磁盘信息

实施步骤
1、查询FND_LOBS段大小
SQL> select t.segment_name,t.segment_type,ROUND(t.bytes/1024/1024/1024,2) AS SIZE_GB from dba_segments t where SEGMENT_NAME='SYS_LOB0000035869C00006$$' order by SIZE_GB desc; 2、查询附件过期时间
SQL> select * from fnd_lobs where upload_date <= to_date('2025-10-31','yyyy-mm-dd'); 3、更新过期时间
注意:筛选出所有是中文的和所有upload_date为空的行,更改其过期时间。同时将指定时间前的数据添加过期时间,因为EBS 标准程序只针对有过期时间的列才会执行删除。过期时间如超过SYSDATE时间则不会被删除-- 查询为中文的数据SQL> select count(*) from FND_LOBS WHERE FILE_NAME <> CONVERT(FILE_NAME, 'US7ASCII', 'UTF8') AND PROGRAM_NAME IS NULL AND upload_date <= to_date('2025-10-31','yyyy-mm-dd');
-- 查询upload_date为空的数据
SQL> select * from FND_LOBS WHERE PROGRAM_NAME IS NULL AND UPLOAD_DATE IS NULL
-- 中文数据更改过期时间
SQL> update fnd_lobs set expiration_date = to_date('2025-10-31','yyyy-mm-dd') where file_id in
(select file_id from FND_LOBS WHERE FILE_NAME <> CONVERT(FILE_NAME, 'US7ASCII', 'UTF8') AND PROGRAM_NAME IS NULL AND upload_date <= to_date('2025-10-31','yyyy-mm-dd'));
-- upload_date为空的数据更改过期时间
SQL> update fnd_lobs set expiration_date = to_date('2025-10-31','yyyy-mm-dd') where file_id in
(select file_id from FND_LOBS WHERE PROGRAM_NAME IS NULL AND UPLOAD_DATE IS NULL AND upload_date <= to_date('2025-10-31','yyyy-mm-dd') );
-- 更改指定数据的过期时间
SQL> UPDATE fnd_lobs
SET expiration_date = to_date('2025-10-31','yyyy-mm-dd')
WHERE upload_date <= to_date('2025-11-1','yyyy-mm-dd');
SQL> commit;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、查询数据
SQL> select count(*) from fnd_lobs where upload_date <= to_date('2025-11-1','yyyy-mm-dd');7、MOVE数据
注意:针对fnd_lobs中的lob字段执行原地MOVE时,会在当前表空间中重新分配数据块,所以当前表空间需要有足够的容量,同时服务器上也需要有足够的磁盘空间,大概会增加几百G。
SQL> alter table applsys.FND_LOBS move lob (FILE_DATA) store as SYS_LOB0000035869C00006$$;8、新建表空间
注意:此处新建表空间是为了释放原表空间中的碎片空间。同时新建的表空间容量必须足够存储FND_LOBS中的数据。根据APPS_TS_MEDIA总量计算平均每个数据文件的大小,并多出几十G作为备用即可。当前文档中的背景下新增了53个数据文件,每个数据文件15G,同时指定了五个数据文件做自增,以防止特殊情况出现。
# 查询业务表空间大小SQL> SELECT a.tablespace_name "表空间名",total "表空间大小",free "表空间剩余大小",(total - free) "表占用空间大小",ROUND((total - free) / total * 100, 2) || '%' "已使用空间百分比"FROM (SELECT tablespace_name, SUM(bytes) / 1024 / 1024 totalFROM dba_data_filesGROUP BY tablespace_name) a,(SELECT tablespace_name, SUM(bytes) / 1024 / 1024 freeFROM dba_free_spaceGROUP BY tablespace_name) bWHERE a.tablespace_name = b.tablespace_nameORDER BY (total - free) DESC;# 新建表空间及数据文件SQL> create tablespace TEMP_MEDIA datafile '/u01/db/oradata/cdb/orcl/temp_media01.dbf' size 15G;..............................SQL> alter tablespace TEMP_MEDIA add datafile '/u01/db/oradata/cdb/orcl/temp_media52.dbf' size 15G;SQL> alter tablespace TEMP_MEDIA add datafile '/u01/db/oradata/cdb/orcl/temp_media53.dbf' size 15G autoextend on next 2G,
9、移动数据对象
# 1、查看表上的约束SQL> SELECT * FROM dba_constraintsWHERE table_name = 'FND_LOBS'AND owner = 'APPLSYS'ORDER BY constraint_type, constraint_name;# 2、查询表上是否存在索引SQL> select * from dba_indexes where table_name='FND_LOBS';# 3、校验表上的logsegment和lob index是否存在SQL> select * from dba_lobs where segment_name in (select segment_name from dba_segments where tablespace_name ='APPS_TS_MEDIA' ) and table_name='FND_LOBS';# 4、移动表注意:此处需要将表对象移动到临时新建的表空间中SQL> alter table APPLSYS.FND_LOBS move tablespace TEMP_MEDIA;# 5、移动 logsegment注意:SQL中LOB字段对应的是第三步中查询出来的column_name,有些表会存在多个LOB字段,每个LOB字段都是一行,如果遇到column_name中存在“ "POI_POINT"."SDO_ORDINATES" ” 这种结构的数据,则无需手动执行移动,在移动表后就会自动自动过去。其中LOB类型的索引也会自动以过去,无需手动执行SQL> ALTER TABLE APPLSYS.FND_LOBS MOVE TABLESPACE TEMP_MEDIA LOB (FILE_DATA) store as (tablespace TEMP_MEDIA );# 6、重建索引注意:有些表中存在常规索引,这部分需要在移动完表数据后手动在新的表空间中重建SQL> alter index APPLSYS.FND_RE_LOBS_UK1 rebuild tablespace TEMP_TS_MEDIA;# 7、验证是否移动完成注意:只要对应的对象存在临时表空间中且原表空间中不存在即可SQL> select * from dba_tables where tablespace_name='TEMP_MEDIA'; -- 目标表空间查询SQL> select * from dba_tables where tablespace_name='APPS_TS_MEDIA'; -- 原表空间中查询# 8、移动fnd_lobs表 先移动表到新的表空间SQL> alter table APPLSYS.FND_LOBS move tablespace TEMP_MEDIA; 再移动表数据SQL> ALTER TABLE APPLSYS.FND_LOBS MOVE TABLESPACE TEMP_MEDIA LOB (FILE_DATA) store as (tablespace TEMP_MEDIA ); 重建索引SQL> alter index APPLSYS.FND_REPOSITORY_LOBS_UK1 rebuild tablespace TEMP_MEDIA;
10、重置数据文件大小
SQL> select 'alter database datafile'||' '|| file_name||' '||'resize 4144MB' from dba_data_files where tablespace_name='APPS_TS_MEDIA';11、再移回数据即可
12、删除临时表空间
删除表空间的数据文件SQL> select 'alter tablespace TEMP_TS_MEDIA drop datafile ' ||' '|| file_id ||';' from dba_data_files where tablespace_name='TEMP_MEDIA'; 删除表空间SQL> drop tablespace TEMP_MEDIA including contents and datafiles;
13、验证即可
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




