文章结构以下:html
1.背景:
生产上查询那些大表而后进行清理,然而发现有SYS_LOB0000093441C00002$$这中表段占用30G(只保留一个月,若是保留更久会更大)。sql
2.LOB介绍
Oracle 数据库中varchar2只能值为4000,PL/SQL中 VARCHAR2 变量类型,字节长度为32767,针对 VARCHAR2 知足不了咱们的须要时,Oracle就提出了大数据类型LOB( Large Object,大对象)。数据库
Oarcle中的LOB类型:服务器
在Oracle中,LOB(Large Object,大型对象)类型的字段如今用得愈来愈多了。由于这种类型的字段,容量大(最多能容纳4GB的数据),且一个表中能够有多个这种类型的字段,很灵活,适用于数据量很是大的业务领域(如图象、档案等)。oracle
LOB类型分为BLOB和CLOB两种:BLOB即二进制大型对象(Binary Large Object),适用于存贮非文本的字节流数据(如程序、图象、影音等)。性能
而CLOB,即字符型大型对象(Character Large Object),则与字符集相关,适于存贮文本型的数据(如历史档案、大部头著做等)。大数据
3.LOB大字段的清理(或者处理办法)
SELECT SEGMENT_NAME, ROUND(SUM(BYTES / 1024 / 1024 / 1024), 2) Gspa
FROM DBA_SEGMENTS设计
WHERE SEGMENT_NAME INhtm
(SELECT TABLE_NAME FROM USER_TAB_COLUMNS WHERE DATA_TYPE = 'CLOB')
GROUP BY SEGMENT_NAME
ORDER BY 2 DESC;
SELECT SEGMENT_NAME, ROUND(SUM(BYTES / 1024 / 1024 / 1024), 2) G
FROM DBA_SEGMENTS
--WHERE SEGMENT_NAME IN
-- (SELECT TABLE_NAME FROM USER_TAB_COLUMNS WHERE DATA_TYPE = 'CLOB')
GROUP BY SEGMENT_NAME
ORDER BY 2 DESC;
SELECT B.TABLE_NAME,
B.COLUMN_NAME,
A.SEGMENT_NAME,
a.SEGMENT_TYPE,
ROUND(SUM(A.BYTES / 1024 / 1024 / 1024), 2) G
FROM DBA_SEGMENTS A
LEFT JOIN DBA_LOBS B
ON A.OWNER = B.OWNER
AND A.SEGMENT_NAME = B.SEGMENT_NAME
--WHERE B.SEGMENT_NAME = 'SYS_LOB0000026212C00002$$'
HAVING ROUND(SUM(A.BYTES / 1024 / 1024 / 1024), 2) >1
GROUP BY B.TABLE_NAME, B.COLUMN_NAME, A.SEGMENT_NAME,a.SEGMENT_TYPE;
经查看,PAY_LOG_DETAILS表这一列CONTENT建的clob,其中大对象单独存放在SYS_LOB0000093441C00002$$ 这个段中,LOBSEGMENT保存了lob列的真正数据,会很是大30G,而且独立于原始表存在。
1) 清理建的lob列的表
若是须要清理,能够truncate 该PAY_LOG_DETAILS表,或者drop不须要的分区(若是是分区表)
2) shrink的lob列的表
好比说在你大量的删除PAY_LOG_DETAILS后(高水位没有降低),须要执行收缩,收缩的时候建议在不要再业务高峰期(不然可能引发很大的性能问题)
Shrink对应的表语句以下:
注意:因为在线上,不能进行有表锁的操做,因此我并无采用这种办法
alter table TABLE_NAME enable ROW MOVEMENT;--启动行移动功能
alter table TABLE_NAME shrink space compact; --只整理碎片 不回收空间
-- 重置高水位,此时不能有DML操做
alter table TABLE_NAME shrink space; --整理碎片并回收空间,并调整水位线。业务少时执行
alter table TABLE_NAME disable ROW MOVEMENT;--关闭行移动
3) ASK tom 大佬提到db_securefile,外部表
我本身也只是扫了一眼该回复,通过查看11g容许建立SecureFiles(默认值)PERMITTED模式,他的思想是迁移到SecureFiles文件或者是咱们熟知的外部表那种(直接存在外部表里管理更简单)
提供网页以下:
https://asktom.oracle.com/pls/apex/asktom.search?tag=reclaimreuse-lob-space
4. LOB建议
可能对通常的oracle dba或者其它人员,来讲,并非全部东西都要存入数据库,再设计表结构的时候(叫所谓的建模吧!),就应该考虑是否应该存在大字段,须要知足什么功能,好很差管理,对数据集的性能影响有多大?
我的不太建议在数据库中使用大对象,可使用外部表(管理方便,更加的简单粗暴),大对象所对应的表进行DML语句是,须要更大的开销,影响性能;好比,能够考虑作一个文件服务器,把须要的大对象按照必定的格式(如时间格式)存成文件,数据库中存放指定的地址就行,这样能够大大提升性能。
5.能够提供的资料
https://asktom.oracle.com/pls/apex/asktom.search?tag=reclaimreuse-lob-space
https://connor-mcdonald.com/2015/07/03/continuous-delivery-moving-to-securefile/
http://www.oracle.com/technetwork/articles/sql/11g-securefiles-084075.html
原文出处:https://www.cnblogs.com/hmwh/p/12380211.html