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

相關文章
相關標籤/搜索