oracle系统表空间过大问题处理

SYSTEM表空间过大

检查表空间时发现system表空间即将占满

清除aud$表空间

  1. 查看数据库审计功能是否开启

show parameter audit查看数据库审计功能是否打开;

audit_trail值为DB,说明数据库审计功能打开,审计策略也是打开;
audit_sys_operations为FALSE说明可以审计非sys/system用户的所有操作,想要审计sys/system的操作,需要手动打开audit_sys_operations参数,即alter system set audit_sys_operations=TRUE scope=spfile;然后再重启数据库。

--查看审计日志是否开启
select name,type,value from v$parameter where name like '%aud%';

2. 进行相关查看检查操作

--查看表空间大小

SELECT a.tablespace_name "tablespace",total / (1024 * 1024 * 1024) "total(G)",
free / (1024 * 1024 * 1024) "shengyu (G)",
(total - free) / (1024 * 1024 * 1024) "used (G)",
round((total - free) / total, 4) * 100 "rote %"
FROM (SELECT tablespace_name, SUM(bytes) free
FROM dba_free_space
GROUP BY tablespace_name) a,
(SELECT tablespace_name, SUM(bytes) total
FROM dba_data_files
GROUP BY tablespace_name) b
WHERE a.tablespace_name = b.tablespace_name;


--查看aud$表大小SQL
select bytes/1024/1024 MB,owner,segment_name,tablespace_name
from dba_segments
where segment_type='TABLE' and segment_name = 'AUD$';

--sys用户查看aud$表,如果sys用户登录提示权限不足可以查看v$pwfile_users或者更改密码(谨慎)
select count(*) from aud$;

截断表

 需要注意的是,如果AUD$表过大,那么直接TRUNCATE AUD$表,系统要立即释放大量的EXTENTS,会严重影响系统性能。可以通过如下2个步骤逐步释放EXTENTS:

1. 清空数据并保留原来的extents
TRUNCATE TABLE SYS.AUD$ REUSE STORAGE;
在这里,REUSE STORAGE是TRUNCATE的一个参数,表示保持原来的存储不变。一般情况下,SQL命令“TRUNCATE TABLE TABLE_NAME;”其实就是“TRUNCATE TABLE TABLE_NAME DROP STORAGE;”。DROP STORAGE是TRUNCATE TABLE的默认参数。

2. 逐步回缩extents(执行的时候根据实际情况调整每次回缩空间大小)
ALTER TABLE SYS.AUD$ DEALLOCATE UNUSED KEEP 5000M;
2ALTER TABLE SYS.AUD$ DEALLOCATE UNUSED KEEP 2000M;
....
ALTER TABLE SYS.AUD$ DEALLOCATE UNUSED KEEP 10M;

到此为清理aud$表空间完成

分析审计项所占空间

查看那种审计占的最多

select action_name,count(*) from dba_audit_trail group by action_name;

一般是LOGON和LOGOFF类型的审计最多。看要求取消此类审计:

取消审计内容

noaudit session whenever successful;一般来说,如果空间不是占的特别多,此类审计还是保留为好。可以:


取消对一些登录特别频繁的用户的审计,比如DBSNMP用户
noaudit session by dbsnmp;

SYSAUX表空间使用率过高问题处理

SYSAUX表空间做为SYSTEM表空间的辅助表空间,主要存放EM相关的内容以及表统计信息,AWR快照,审计信息等,而假设SYSAUX表空间在默认条件下你假设不做不论什么配置,随着时间的推移。会膨胀的越来越大。

1. 查看表空间使用

SELECT a.tablespace_name "tablespace",total / (1024 * 1024 * 1024) "total(G)",

free / (1024 * 1024 * 1024) "shengyu (G)",
(total - free) / (1024 * 1024 * 1024) "used (G)",
round((total - free) / total, 4) * 100 "rote %"
FROM (SELECT tablespace_name, SUM(bytes) free
FROM dba_free_space
GROUP BY tablespace_name) a,
(SELECT tablespace_name, SUM(bytes) total
FROM dba_data_files
GROUP BY tablespace_name) b
WHERE a.tablespace_name = b.tablespace_name;

2. 查看SYSAUX表空间占比

查看SYSAUX表空间内各个分类项目占存储空间的比重,大头在AWR报告,不过默认为8天,

SQL> col Item For a30

SQL> col "Space Used(GB)" For a10
SQL> col Schema For a20
SQL> col "MoveProcedure" For a200
SQL> SELECT occupant_name"Item",
          round(space_usage_kbytes/1024/1024,3)"Space Used (GB)",
          schema_name "Schema",
          move_procedure "MoveProcedure"
     FROM v$sysaux_occupants
   ORDER BY 2 Desc;
   

3. 修改统计信息的保持时间

默认31天,这里改为15天。过期统计信息会自动删除

SQL> select dbms_stats.get_stats_history_retention from dual;

31
--修改统计信息保持时间
SQL> exec dbms_stats.alter_stats_history_retention(15);
SQL> select dbms_stats.get_stats_history_retention from dual;
15

4. 修改AWR快照的保存时间

改动AWR快照的保存时间为7天(7 24 60),每小时收集一次,也能够通过EM界面查看和改动

--检查当前系统的保留时间为8天,1小时採样一次

SQL> select * from dba_hist_wr_control;
DBID SNAP_INTERVAL                           RETENTION                               TOPNSQL
------------------------------------------------- -------------------------------------------------
1494575446 +0000001:00:00.0                       +0000800:00:00.0                       DEFAULT

--修改awr快照保存时长
SQL> begin
        dbms_workload_repository.modify_snapshot_settings(
           interval => 60,
           retention => 10080,--分钟
           topnsql => 100
         );
end;
ORA-13541: 系统移动窗体基线大小 (691200) 大于保留时间 (604800)
ORA-06512: 在"SYS.DBMS_WORKLOAD_REPOSITORY", line 174
ORA-06512: 在"SYS.DBMS_WORKLOAD_REPOSITORY", line 222
ORA-06512: 在 line 2

这里 691200(8246060)。604800(7246060)都是以秒为单位的。 发现运行报错,由于当前系统移动窗体大于如今所设的时间窗体。

--查看系统的当前的MOVING_WINDOW_SIZE。

SQL> select dbid,baseline_name,baseline_type,moving_window_size from dba_hist_baseline;
DBID BASELINE_NAME                   BASELINE_TYPEMOVING_WINDOW_SIZE
--------------------------------------------------- ------------- ------------------
1494575446SYSTEM_MOVING_WINDOW        MOVING_WINDOW                  8

--改动系统移动窗体其大小为7,即7天。
SQL> exec dbms_workload_repository.modify_baseline_window_size(7);

--再次运行改动AWR快照的保存时间
SQL> exec DBMS_WORKLOAD_REPOSITORY.MODIFY_SNAPSHOT_SETTINGS(interval=>60,retention=> 7*24*60 );

5. 删除AWR快照

删除AWR快照,再次查看SYSAUX表空间使用率

--查询最最小和最大快照ID

SQL> select min(snap_id),max(snap_id) from dba_hist_snapshot;
 MIN(SNAP_ID) MAX(SNAP_ID)
 ------------ ------------
       26705         27066

--注意,该方法有很大的坑,包底层是通过delete删除的会产生大量的redo,undo以及归档日志,会把空间撑满,可以使用其他手动删除方法
--删除最早的24个AWR快照,也就是最早的24小时的快照。(因为从八天变为7天减少24小时,所以手动删除第八天的awr快照,应该也可以等到时)
SQL> exec dbms_workload_repository.drop_snapshot_range(low_snap_id =>26705,high_snap_id => 26705+24);



请使用浏览器的分享功能分享到微信等