sysaux快满了

手工生成快照又报错:
SQL> exec DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT();sysaux
快满了(一共3G),其中AWR的信息占了1.5G左右

alert
中:
Wed Sep 08 09:00:47 2010
ORA-1688: unable to extend table SYS.WRH$_ACTIVE_SESSION_HISTORY partition WRH$_ACTIVE_1153364305_5522 by 4096 in                 tablespace SYSAUX
MMON Flush encountered SYSAUX out of space error(1688).
MMON (emergency) purge of WR snapshots (15357) and older
ORA-1688: unable to extend table SYS.WRH$_ACTIVE_SESSION_HISTORY partition WRH$_ACTIVE_1153364305_5522 by 4096 in                 tablespace SYSAUX
MMON Flush encountered SYSAUX out of space error(1688).
MMON (emergency) purge of WR snapshots (15358) and older
Wed Sep 08 09:01:05 2010
ORA-1688: unable to extend table SYS.WRH$_ACTIVE_SESSION_HISTORY partition WRH$_ACTIVE_1153364305_5522 by 4096 in                 tablespace SYSAUX
$

所以想删除一部快照
但奇怪的是
SQL> select count(*) from dba_hist_snapshot;
  COUNT(*)
----------
         0


BEGIN DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT(); END;

*
ERROR at line 1:
ORA-13509: error encountered during updates to a AWR table
ORA-01688: unable to extend table ORA-01688: unable to extend table
SYS.WRH$_ACTIVE_SESSION_HISTORY partition WRH$_ACTIVE_1153364305_5522 by 4096
in tablespace SYSAUX
. partition  by  in tablespace
ORA-06512: at "SYS.DBMS_WORKLOAD_REPOSITORY", line 14
ORA-06512: at "SYS.DBMS_WORKLOAD_REPOSITORY", line 37
ORA-06512: at line 1


我又想把保留时间减小点
SQL> select * from dba_hist_wr_control;
      DBID
----------
SNAP_INTERVAL
---------------------------------------------------------------------------
RETENTION
---------------------------------------------------------------------------
TOPNSQL
----------
1153364305
+00000 01:00:00.0
+00008 00:00:00.0
DEFAULT



SQL> exec dbms_workload_repository.modify_snapshot_settings(interval=>60,retention=>3*24*60);
BEGIN dbms_workload_repository.modify_snapshot_settings(interval=>60,retention=>3*24*60); END;

*
ERROR at line 1:
ORA-13541: system moving window baseline size (691200) greater than retention
(259200)
ORA-06512: at "SYS.DBMS_WORKLOAD_REPOSITORY", line 89
ORA-06512: at "SYS.DBMS_WORKLOAD_REPOSITORY", line 137
ORA-06512: at line 1

SQL>exec dbms_workload_repository.modify_snapshot_settings(interval=>60,retention=>3*24*60);
BEGIN dbms_workload_repository.modify_snapshot_settings(interval=>60,retention=>3*24*60); END;

*
ERROR at line 1:
ORA-13541: system moving window baseline size (691200) greater than retention
(259200)
ORA-06512: at "SYS.DBMS_WORKLOAD_REPOSITORY", line 89
ORA-06512: at "SYS.DBMS_WORKLOAD_REPOSITORY", line 137
ORA-06512: at line 1



在网上查了查,有篇文章说是跟baseline设置有关,可我这边还是没有记录
SQL> select count(*) from dba_hist_baseline;
  COUNT(*)
----------
         0

SQL>

 

 

 

查这个V$SYSAUX_OCCUPANTS半天没有返回值,一会我查下被谁给阻塞了
之前用dba_segments查的


OWNER                   SEGMENT_NAME                                 SEGMENT_TYPE                    BYTES/1024/1024

SYS                        WRH$_SYSMETRIC_HISTORY_INDEX     index                                 172

SYS                        WRH$_SYSMETRIC_HISTORY                TABLE                                 237

SYS                        WRH$_ACTIVE_SESSION_HISTORY      TABLE PARTITION               1030

 

 

 

 

我现在是把AWR自动收集给停了,ALERT里面不报那个1688错误了

但我开始怀疑AWR的数据到底存放在哪里
SQL> select count(*) from WRH$_ACTIVE_SESSION_HISTORY;

  COUNT(*)
----------
         0

SQL> select bytes/1024/1024 from dba_segments where segment_name='WRH$_ACTIVE_SESSION_HISTORY';

BYTES/1024/1024
---------------
           1030
           .125

SQL>

 

这难道不奇怪吗,还有v$sysaux_occupants这个视图一带上 SPACE_USAGE_KBYTES 列的SELECT就挂在那不动。


我在自己的本上建了一个新库,倒是可以查了,找到 SM/AWR 对应的大小,一开始是16M,我手工建快照,这个值慢慢增加到20M,这时已经建了37snapshot
但这个时候查 wrh$_active_session_history,大小一直没变,是64K。我测试环境是 vm   redhat   10.2.0.1,  真是弄不懂。

 

 

 

WRH$_ACTIVE_SESSION_HISTORY有个日期字段,根据retention看下是不是有超出retention范围的数据没有purge
要是没purge掉可能就是bug了,或者purge的时候没有成功,或者报错

 

 

空间满了看上去就会不正常
今天上午把一些WRH$的表truncate了(没有新加文件)
空间释放了,问题就基本解决了
可以生成新的快照了
我就手工生成了两个快照
SQL> exec DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT();

PL/SQL procedure successfully completed.

SQL> select count(*) from sys.wrh$_active_session_history;

  COUNT(*)
----------
     18504

SQL> select count(*) from dba_hist_snapshot;

  COUNT(*)
----------
         2

问了个朋友,他是经常清理WRH$这些表的,看来要保持SYSAUX一定的free空间。
现在还有个遗留问题,v$sysaux_occupants视图,一SELECT  space那列就被挂在那,先放放了,还有别的报告要写...

<think>我们正在解决Oracle数据库SYSAUX表空间已满的问题。根据引用[2][3][4],SYSAUX表空间过满通常是由于AWR(自动工作负载存储库)信息、统计信息或其他管理对象积累过多导致的。我们需要识别占用空间最多的对象,并采取相应清理措施。步骤1:识别SYSAUX表空间中占用空间最大的对象运行SQL查询:```sqlSELECToccupant_name,space_usage_kbytesFROMv$sysaux_occupantsORDERBYspace_usage_kbytesDESC;```或者更详细的查询(如引用[3]):```sqlSELECTowner,segment_name,segment_type,ROUND(bytes/1024/1024/1024,2)SIZE_GBFROMdba_segmentsWHEREtablespace_name='SYSAUX'ORDERBYbytesDESC;```步骤2:根据占用空间大的对象采取清理措施常见情况:1.AWR信息(Occupant为SM/AWR):需要调整AWR保留策略,清理历史快照。2.优化器统计信息(Occupant为SM/OPTSTAT):清理过时的统计信息历史记录。3.自动任务历史记录(Occupant为SM/AUTOTASK):清理自动任务运行的历史记录。情况1:AWR信息占用过大(引用[2][3])-检查当前AWR保留策略:```sqlSELECTretentionFROMdba_hist_wr_control;```默认保留8天(20160分钟)。如果保留时间过长,可调整为合适值(如7天)。-清理历史快照:```sqlEXECdbms_workload_repository.modify_snapshot_settings(retention=>10080);--改为7天(7*24*60=10080分钟)```然后手动清理超过保留时间的快照:```sqlEXECdbms_workload_repository.drop_snapshot_range(low_snap_id=>(SELECTmin(snap_id)FROMdba_hist_snapshotWHEREend_interval_time<SYSDATE-7),high_snap_id=>(SELECTmax(snap_id)FROMdba_hist_snapshotWHEREend_interval_time<SYSDATE-7));```或者使用Oracle提供的脚本:`$ORACLE_HOME/rdbms/admin/awrinfo.sql`查看并清理。情况2:优化器统计信息历史记录(引用[3])-清理超过保留期的统计信息历史(默认保留31天):```sqlEXECdbms_stats.purge_stats(sysdate-30);--保留最近30天```情况3:自动任务历史记录-清理自动任务历史记录:```sqlEXECdbms_auto_task_admin.purge_auto_task_history(sysdate-30);--保留最近30天```步骤3:其他可能情况如果占用空间的是其他组件(如AUD$审计表、ASH等),需要针对性处理。步骤4:收缩空间清理后,可能需要对表空间进行收缩(注意:SYSAUX表空间不能直接DROP,但可以移动或重建大对象,或者使用shrink命令):-对于表:`ALTERTABLE...MOVE`(然后重建索引)-对于索引:重建索引`ALTERINDEX...REBUILD`-或者使用段收缩(如果支持):```sqlALTERTABLE...ENABLEROWMOVEMENT;ALTERTABLE...SHRINKSPACE;```步骤5:增加数据文件(临时措施)如果清理后空间仍不足,可以考虑增加数据文件(但Oracle不推荐SYSAUX表空间过大):```sqlALTERTABLESPACESYSAUXADDDATAFILE'/path/to/new_datafile.dbf'SIZE2GAUTOEXTENDONNEXT100MMAXSIZEUNLIMITED;```注意事项:-操作前备份数据库。-清理操作应在业务低峰期进行。-定期监控SYSAUX表空间使用情况。根据引用[3]中的示例,发现`WRI$_ADV_OBJECTS`表占用了大量空间(20.9GB),该表与AWR的顾问建议相关。可以清理该表:```sql--清理顾问建议(Advisor)相关的数据EXECprvt_advisor.delete_tasks;```或者使用:```sql--清理所有自动优化顾问任务EXECDBMS_AUTO_TASK_ADMIN.DISABLE(client_name=>'ADVISOR',operation=>NULL,window_name=>NULL);--然后手动清理(注意:禁用自动任务后,需要根据情况重新启用)```如果上述方法无法释放空间,可能需要进一步检查是否有大对象可以迁移或删除(如日志、审计记录等)。§§相关问题§§1.如何监控Oracle表空间使用情况?2.AWR报告如何生成和分析?3.Oracle自动任务有哪些?如何管理?4.除了SYSAUX表空间,还有哪些系统表空间需要定期维护?</think>### Oracle SYSAUX表空间已满的处理方法 SYSAUX表空间是Oracle的系统辅助表空间,存储AWR报告、优化器统计信息、审计数据等管理对象[^2]。当空间占用过高时,需按以下步骤处理: #### 一、诊断空间占用源 ```sql -- 1. 查看表空间使用率 SELECT tablespace_name, ROUND(used_space/1024/1024, 2) "已用空间(GB)", ROUND(tablespace_size/1024/1024, 2) "总空间(GB)", ROUND(used_percent, 2) "使用率%" FROM dba_tablespace_usage_metrics WHERE tablespace_name = 'SYSAUX'; -- 2. 定位占用空间对象(引用[3]) SELECT owner, segment_name, segment_type, ROUND(bytes/1024/1024/1024, 2) SIZE_GB FROM dba_segments WHERE tablespace_name = 'SYSAUX' ORDER BY bytes DESC; ``` #### 二、针对性清理方案 根据诊断结果选择处理方法: 1. **AWR报告占用过大(常见)** - 检查保留策略: ```sql SELECT retention FROM dba_hist_wr_control; -- 默认保留8天 ``` - 调整保留期并清理: ```sql EXEC dbms_workload_repository.modify_snapshot_settings(retention => 10080); -- 改为7天 EXEC dbms_workload_repository.drop_snapshot_range( low_snap_id => (SELECT min(snap_id) FROM dba_hist_snapshot), high_snap_id => (SELECT max(snap_id) FROM dba_hist_snapshot WHERE end_interval_time < SYSDATE-7) ); ``` 2. **优化器统计信息历史(SM/OPTSTAT)** ```sql -- 清理30天前历史 EXEC dbms_stats.purge_stats(sysdate - 30); ``` 3. **顾问框架数据(WRI$_ADV_*表)** ```sql -- 清理顾问任务(引用[3]) EXEC prvt_advisor.delete_tasks; ``` 4. **审计数据(AUD$表)** ```sql -- 迁移审计表到其他表空间 ALTER TABLE AUD$ MOVE TABLESPACE USERS; ``` #### 三、空间回收操作 ```sql -- 1. 收缩可回收对象 ALTER TABLE WRI$_ADV_OBJECTS ENABLE ROW MOVEMENT; ALTER TABLE WRI$_ADV_OBJECTS SHRINK SPACE CASCADE; -- 2. 重建索引 ALTER INDEX WRI$_ADV_OBJECTS_PK REBUILD ONLINE; ``` #### 四、预防措施 1. **定期监控** 创建定时任务检查SYSAUX使用率: ```sql BEGIN DBMS_SCHEDULER.CREATE_JOB( job_name => 'CHECK_SYSAUX', job_type => 'PLSQL_BLOCK', job_action => 'BEGIN check_sysaux_space; END;', repeat_interval => 'FREQ=DAILY' ); END; ``` 2. **调整自动任务** ```sql -- 减少AWR采集频率 EXEC dbms_workload_repository.modify_snapshot_settings(interval => 60); -- 改为60分钟 ``` > **重要提示** > - 操作前必须备份数据库(RMAN或expdp) > - 生产环境建议在维护窗口操作 > - 避免直接删除数据文件[^4] #### 五、验证结果 ```sql -- 清理后检查 SELECT tablespace_name, ROUND(used_percent) "使用率%" FROM dba_tablespace_usage_metrics WHERE tablespace_name = 'SYSAUX'; ``` 通过上述步骤,可有效释放SYSAUX表空间并预防再次爆满[^1][^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值