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、验证即可

相关推荐
L.EscaRC2 小时前
图数据库Neo4j原理与运用
数据库·oracle·neo4j
知己80802 小时前
docker搭建图数据库neo4j
数据库·docker·neo4j
TDengine (老段)2 小时前
什么是 TDengine IDMP?
大数据·数据库·物联网·时序数据库·tdengine·涛思数据
谅望者2 小时前
数据分析笔记08:Python编程基础-数据类型与变量
数据库·笔记·python·数据分析·概率论
Boilermaker19922 小时前
【MySQL】备份与恢复
数据库·mysql
q***7483 小时前
数据库高安全—openGauss安全整体架构&安全认证
数据库·安全·架构
l***37093 小时前
redis info 详解
数据库·redis·缓存
小蜗牛爱远行3 小时前
mysql导入中文乱码问题
数据库·mysql
TangDuoduo00053 小时前
【SQLite3 C语言接口】
数据库·sqlite