ITPub博客

首页 > 数据库 > Oracle > oracle system 表空间32G问题解决一例

oracle system 表空间32G问题解决一例

原创 Oracle 作者:315959312 时间:2014-03-10 14:59:54 0 删除 编辑
1.开发的过程中发现oracle数据文件占了很大空间,其中system01.dbf文件占了30G。
命令:
    cd $ORACLE_HOME/../../../实例/
    ls -lh
2.检查system表空间使用率,已经达到99.%,基本已经满了

SELECT UPPER(F.TABLESPACE_NAME) "表空间名",
  D.TOT_GROOTTE_MB "表空间大小(M)",
  D.TOT_GROOTTE_MB - F.TOTAL_BYTES "已使用空间(M)",
  TO_CHAR(ROUND((D.TOT_GROOTTE_MB - F.TOTAL_BYTES) / D.TOT_GROOTTE_MB * 100,2),'990.99') || '%' "使用比",
  F.TOTAL_BYTES "空闲空间(M)",
  F.MAX_BYTES "最大块(M)"
  FROM (SELECT TABLESPACE_NAME,
  ROUND(SUM(BYTES) / (1024 * 1024), 2) TOTAL_BYTES,
  ROUND(MAX(BYTES) / (1024 * 1024), 2) MAX_BYTES
  FROM SYS.DBA_FREE_SPACE
  GROUP BY TABLESPACE_NAME) F,
  (SELECT DD.TABLESPACE_NAME,
   ROUND(SUM(DD.BYTES) / (1024 * 1024), 2) TOT_GROOTTE_MB
  FROM SYS.DBA_DATA_FILES DD
  GROUP BY DD.TABLESPACE_NAME) D
  WHERE D.TABLESPACE_NAME = F.TABLESPACE_NAME
  ORDER BY 1;

3.检查system表空间最大的段,段为'sys.fga_log$'和'SYS_LOB0000000393C00013$$',空间基本都被这2个东西占满了,'SYS_LOB0000000393C00013$$'是表 sys.fga_log$的索引段。

SELECT *
FROM (SELECT BYTES, segment_name, segment_type, owner
FROM dba_segments
WHERE tablespace_name = 'SYSTEM'
ORDER BY BYTES DESC)
WHERE ROWNUM < 10

4.fga_log$表记录了 fga审计日志,检查oracle中已经没有fga审计策略了,猜测之前有人开启了fga审计,后只删除了审计策略,没有清除fga审计日志

5.select count(*) from fga_log$发现其中有 533万条记录,使用sys用户登录后,trancate table fga_log$, 删除后,问题解决,空间释放了

也可以使用delete,不过由于数据量较大,且都是无用记录,所以使用trancate截断。如果使用其他用户登录,则用户必须有 delete any table 权限。
使用system用户登录后 通过 grant delete any table to user1(用户名)命令来授权

注:1.关于fga审计,可以自己百度
      2.使用以后system01.dbf文件还是之前那么大,在此我只是降低了system表空间的使用率


查询lob段所属的表的名字
select a.owner,  
       a.table_name,  
       a.column_name,  
       b.segment_name,  
       ROUND(b.BYTES / 1024 / 1024)  
  from dba_lobs a, dba_segments b  
 where a.segment_name = b.segment_name  
   and a.owner = 'XXX'  
   and a.table_name = 'YYYY' 



查询临时表空间使用情况
select se.username,se.sid,su.extents,su.blocks*to_number(rtrim(p.value)) as Space,tablespace,segtype,sql_text from v$sort_usage su,v$parameter p,
v$session se,v$sql s 
where p.name='db_block_size' and su.session_addr=se.saddr and 
s.hash_value=su.sqlhash and s.address=su.sqladdr order by se.username,se.sid;

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/12478376/viewspace-1104605/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2014-02-20

  • 博文量
    10
  • 访问量
    104728