1. 程式人生 > 實用技巧 >資料庫表空間一夜之間爆滿 檢視最大的表卻才幾百M 原來是大欄位物件CLOB造成的

資料庫表空間一夜之間爆滿 檢視最大的表卻才幾百M 原來是大欄位物件CLOB造成的

遇到一個怪事 資料庫表空間一夜之間爆滿。
沒有多想 想將資料庫表空間擴容了一下 恢復正常業務。
ALTER TABLESPACE xxx ADD DATAFILE '/data/oracle/oradata/xxx.dbf' size 4096MB autoextend on MAXSIZE UNLIMITED;

恢復正常業務之後 就想找到是什麼表造成了資料庫表空間爆滿。
應用反饋了由於其他應用之間的介面有問題 造成了一個表新增了幾十萬條資料。table info.
查看了info這個表的大小 發現才200多M。
select round(BYTES/1024/1024,2)||'M' from user_segments where segment_name='info';


又確認了下這個表空間下 最大的表是什麼?發現的確是info表。就在想 資料庫空間都被用到哪裡了?
最後發現是Info表中 有一個欄位是CLOB型別,SQL CLOB為內建型別,它將大欄位物件(Character Large Object)儲存為資料庫表某一行中的一個列值。

獲取容量大的CLOB的SEGMENT_NAME
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;

查詢是哪個表將資料寫到了這個CLOB
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;