遇到一个怪事 数据库表空间一夜之间爆满。
没有多想 想将数据库表空间扩容了一下 恢复正常业务。
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;