Oracle中清理LOBSEGMENT对象

得意时要看淡,失意时要看开。不论得意失意,切莫大意;不论成功失败,切莫止步。志得意满时,需要的是淡然,给自己留一条退路;失意落魄时,需要的是泰然,给自己觅一条出路Oracle中清理LOBSEGMENT对象,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

问题描述

开发环境中做测试时,发现某个tablespace空间不足,再根据下面的sql定位到是其中一个LOBSEGMENT数据库对象占很大的空间(在我们系统中对应的字段类型是BLOB),故要做清理操作,以减少空间占有。
注意,下面sql中的表空间名字,用ZZZ代替,需根据实际情况替换。

SELECT OWNER, TABLESPACE_NAME, SEGMENT_NAME, SEGMENT_TYPE, PARTITION_NAME, ROUND(BYTES/(1024*1024),2) SIZE_MB
FROM DBA_SEGMENTS
WHERE SEGMENT_TYPE IN ('TABLE', 'TABLE PARTITION', 'TABLE SUBPARTITION',
                       'INDEX', 'INDEX PARTITION', 'INDEX SUBPARTITION', 'TEMPORARY', 'LOBINDEX', 'LOBSEGMENT', 'LOB PARTITION')
AND TABLESPACE_NAME = 'ZZZ'
ORDER BY BYTES DESC;

注意,SEGMENT_NAME, SEGMENT_TYPE这两个字段。
SEGMENT_TYPE = LOBSEGMENT
LOBSEGMENT的系统命名规则是
SYS_LOB(10 digit object_id)C(5 digit col#)$$

解决步骤

利用下面的2条sql查出该对象的相关信息:
注意下面值的不同;

select object_name,status from dba_objects where object_id='xxxxxxxxxx';
## object_id 这里写LOBSEGMENT名字里SYS_LOB后的10位数字。

SELECT owner, table_name, column_name
FROM dba_lobs
WHERE segment_name = 'SYS_LOB<<identifier>>$$';

确定好该LOBSEGMENT对象来自于哪个table的哪个字段,然后做一个清理操作。

  1. 将该表导出
  2. 删除表,删除表要使用truncate,truncate table xxxxx;
  3. 再导入,没有释放空间,则需要情况一下回收站,执行 purge table xxxx;
    或者清空一下回收站
    purge recyclebin;

相关知识

LOB类型

oracle中内置的LOB数据类型包括BLOB、CLOB、NCLOB、BFILE(外部存储)的大型化和非结构化数据,如文本、图像、视屏、空间数据存储。

CLOB 数据类型

它存储单字节和多字节字符数据。支持固定宽度和可变宽度的字符集。CLOB对象可以存储最多 (4 gigabytes-1) * (database block size) 大小的字符

NCLOB 数据类型

它存储UNICODE类型的数据,支持固定宽度和可变宽度的字符集,NCLOB对象可以存储最多(4 gigabytes-1) * (database block size)大小的文本数据。

BLOB 数据类型

它存储非结构化的二进制数据大对象,它可以被认为是没有字符集语义的比特流,一般是图像、声音、视频等文件。BLOB对象最多存储(4 gigabytes-1) * (database block size)的二进制数据。

BFILE 数据类型

二进制文件,存储在数据库外的系统文件,只读的,数据库会将该文件当二进制文件处理。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/155772.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!