• 数据库表空间一夜之间爆满 查看最大的表却才几百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;

  • 相关阅读:
    array与xml转换实现(转)
    设计模式之: 策略模式
    设计模式之: 代理模式
    设计模式之: 状态模式
    dedecms分页
    dedecms导出csv文件
    假如项目中使用到了多 表查询,怎么办?
    git忽略某个文件夹
    git忽略某个文件
    无极限分类
  • 原文地址:https://www.cnblogs.com/atwo/p/14023490.html
Copyright © 2020-2023  润新知