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

前言

当前数据库存储资源紧张,希望在现有硬件基础上,寻求最大化节省磁盘空间的方案。当前文章主要针对FND_LOBS进行清理,释放的磁盘空间340G。

可行性方案

  1. 定期对数据库服务器的跟踪日志(Trace Log)进行日志轮转与清理。
  2. 定期清理归档日志。
  3. 定期监控表空间的使用率,重点关注比较大的表空间。

磁盘信息

实施步骤

1、查询FND_LOBS段大小

bash 复制代码
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、查询附件过期时间

注意:此处查询哪些文件存在过期时间,同时需要确认删除多少年前的数据,以上传日期作为条件。如果这些数据没有过期时间,那么统一指定过期时间。然后执行官方程序删除FND_LOBS中的数据信息

bash 复制代码
SQL> select * from fnd_lobs where upload_date <= to_date('2025-10-31','yyyy-mm-dd'); 

3、更新过期时间

注意:筛选出所有是中文的和所有upload_date为空的行,更改其过期时间。同时将指定时间前的数据添加过期时间,因为EBS 标准程序只针对有过期时间的列才会执行删除。过期时间如超过SYSDATE时间则不会被删除

bash 复制代码
-- 查询为中文的数据
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、查询数据

注意:此处查询FND_LOBS被指定过期时间的数据是否删除。

bash 复制代码
SQL> select count(*) from fnd_lobs where  upload_date <= to_date('2025-11-1','yyyy-mm-dd');

7、MOVE数据

注意:针对fnd_lobs中的lob字段执行原地MOVE时,会在当前表空间中重新分配数据块,所以当前表空间需要有足够的容量,同时服务器上也需要有足够的磁盘空间,大概会增加几百G。

bash 复制代码
SQL> alter table applsys.FND_LOBS move lob (FILE_DATA) store as SYS_LOB0000035869C00006$$;

8、新建表空间

注意:此处新建表空间是为了释放原表空间中的碎片空间。同时新建的表空间容量必须足够存储FND_LOBS中的数据。根据APPS_TS_MEDIA总量计算平均每个数据文件的大小,并多出几十G作为备用即可。当前文档中的背景下新增了53个数据文件,每个数据文件15G,同时指定了五个数据文件做自增,以防止特殊情况出现。

bash 复制代码
# 查询业务表空间大小
SQL> SELECT a.tablespace_name "表空间名",
       total "表空间大小",
       free "表空间剩余大小",
       (total - free) "表占用空间大小",
       ROUND((total - free) / total * 100, 2) || '%' "已使用空间百分比"
  FROM (SELECT tablespace_name, SUM(bytes) / 1024 / 1024 total
          FROM dba_data_files
         GROUP BY tablespace_name) a,
       (SELECT tablespace_name, SUM(bytes) / 1024 / 1024 free
          FROM dba_free_space
         GROUP BY tablespace_name) b
 WHERE a.tablespace_name = b.tablespace_name
 ORDER 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、移动数据对象

注意:此处需要移动"APPS_TS_MEDIA"表空间中的所有对象到新建的临时表空间中"TEMP_MEDIA"。"APPS_TS_MEDIA"表空间中的所有对象都按照该方式进行移动。按照该方式移动完之后,原业务表空间的碎片即释放。

bash 复制代码
# 1、查看表上的约束
SQL> SELECT * FROM dba_constraints
WHERE 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、重置数据文件大小

注意:此处重置的是业务表空间中的大小

bash 复制代码
SQL> select 'alter database datafile'||' '|| file_name||' '||'resize 4144MB' from dba_data_files where tablespace_name='APPS_TS_MEDIA';

11、再移回数据即可

注意:此处同样按照第九步方式执行
12、删除临时表空间

bash 复制代码
	删除表空间的数据文件
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、验证即可

相关推荐
MySQL实战12 小时前
Redis 7.0 新特性之maxmemory-clients:限制客户端内存总使用量
数据库·redis
VX:Fegn089512 小时前
计算机毕业设计|基于springboot + vue校园社团管理系统(源码+数据库+文档)
前端·数据库·vue.js·spring boot·后端·课程设计
北亚数据恢复13 小时前
虚拟机数据恢复—ESXi虚拟机下SqlServer数据库数据恢复案例
数据库
susu108301891113 小时前
使用navicat创建事件event报错You have an error in your SQL syntax
数据库·sql
水力魔方13 小时前
武理排水管网模拟分析系统应用专题5:模型克隆与并行计算
数据库·c++·算法·swmm
cike_y13 小时前
Spring-Bean的作用域&Bean的自动装配
java·开发语言·数据库·spring
stella·14 小时前
mysql的时区问题
数据库·mysql·timezone·时区
+VX:Fegn089515 小时前
计算机毕业设计|基于springboot + vueOA工程项目管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端·课程设计
wang60212521815 小时前
阿里云存储的下载验证
数据库·阿里云·fastapi
独自破碎E15 小时前
Spring Boot工程启动以后,怎么将数据库中已有的固定内容打入到Redis缓存中?
数据库·spring boot·缓存