Oracle的LOB(CLOB)大字段以及(SYS_LOB***$$)清理

文章结构以下: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

相关文章
相关标签/搜索