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

来源:这里教程网 时间:2026-03-03 18:58:31 作者:

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);

相关推荐