文章結構以下: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