Oracle的LOB(CLOB)大字段以及(SYS_LOB***$$)清理
文章结构如下:

1.背景:
生产上查询那些大表然后进行清理,然而发现有SYS_LOB0000093441C00002$$这中表段占用30G(只保留一个月,如果保留更久会更大)。
2.LOB介绍
Oracle 数据库中varchar2只能值为4000,PL/SQL中 VARCHAR2 变量类型,字节长度为32767,针对 VARCHAR2 满足不了我们的需要时,Oracle就提出了大数据类型LOB( Large Object,大对象)。
Oarcle中的LOB类型:
在Oracle中,LOB(Large Object,大型对象)类型的字段现在用得越来越多了。因为这种类型的字段,容量大(最多能容纳4GB的数据),且一个表中可以有多个这种类型的字段,很灵活,适用于数据量非常大的业务领域(如图象、档案等)。
LOB类型分为BLOB和CLOB两种:BLOB即二进制大型对象(Binary Large Object),适用于存贮非文本的字节流数据(如程序、图象、影音等)。
而CLOB,即字符型大型对象(Character Large Object),则与字符集相关,适于存贮文本型的数据(如历史档案、大部头著作等)。
3.LOB大字段的清理(或者处理办法)
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 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
随机推荐
- 【学习笔记】 2-SAT问题
Algorithm Description \(2-SAT\)问题就是给定一串布尔变量,每个变量只能为真或假. 要求对这些变量进行赋值,满足布尔方程. 会有一些形如 \(x_1||x_2\) 或者 \ ...
- [ZJOI2019]开关(生成函数+背包DP)
注:以下p[i]均表示概率 设F(x)为按i次开关后到达终止状态方案数的EGF,显然F(x)=π(ep[i]x/p+(-1)s[i]e-p[i]x/p)/2,然而方案包含一些多次到达合法方案的状态,需 ...
- Linux基础篇七:Linux的命令执行
首选区分内置命令和外置命令: 内置命令:shell程序自带的命令,系统内核一启动就可以使用的命令 外置命令:在系统PATH变量路径下的命令 如何查看一个命令是内置命令还是外置命令: type -a c ...
- 29)PHP,自动加载类
(1)作用: 类的自动加载是指,在外面的页面中,并不需要去“引入”(包含)类文件,但是程序会在需要一个类的时候就自动去“动态加载”该类. (2)什么叫做“需要一个类”?通常是这样的情况: 1,创建一个 ...
- VS各种错误集成总结,持续更新
1.error C4996: 'GetVersionExW': 被声明为已否决 解决办法:工程 -- 配置属性 --C/ C++ -- 常规 -- SDL check 关掉 2.fatal error ...
- Kafka(五) —— Kafka源码本地调试
搭建环境 安装scala 安装gradle 在kafka源码的根目录执行命令 gradle wrapper gradle idea 打开IDEA,File -> Open -> kafka ...
- ioctl函数的使用之查看终端屏幕大小
要想查看一个终端屏幕的大小,可以使用ioctl()函数,步骤如下. 1.首先找到对应终端的文件号,一般在 /dev/pts/....(0,1,2..).具体几号需要自己验证.如在pts目录下使用命 ...
- numpy模块介绍
import numpy as np np.array([1,2,3]) array([1, 2, 3]) np.array([[1,2,3],[4,5,6]]) array([[1, 2, 3], ...
- numpy矩阵运算--矩阵乘法
1)元素对应相乘,使用 multiply 函数或 * 运算符来实现 a = np.array([2,2,2])b = np.array([3,3,3]) c1 = a*a c1 array([4, 4 ...
- 吴裕雄--天生自然python学习笔记:pandas模块导入数据
有时候,手工生成 Pandas 的 DataFrame 数据是件非常麻烦的事情,所以我们通 常会先把数据保存在 Excel 或数据库中,然后再把数据导入 Pandas . 另 一种情况是抓 取网页中成 ...