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数据库SYSTEM表空间已满导致Web服务无法启动的问题。SYSTEM表空间是Oracle数据库的核心,存储数据字典、系统过程、触发器等关键对象。当它满了之后,数据库操作会受阻,进而影响依赖它的Web服务。 根据引用[1]的提示,我们知道表空间有自动扩展功能,但没有自动缩减能力。但SYSTEM表空间与临时表空间不同,临时表空间的内容可以回收,而SYSTEM表空间的数据是持久性的,所以不能像临时表空间那样自动回收。 解决思路: 1. 确认SYSTEM表空间使用情况 2. 清理SYSTEM表空间(主要清理可以移动的非核心对象) 3. 扩展SYSTEM表空间(增加数据文件或扩展现有文件) 步骤: 步骤1:确认SYSTEM表空间使用情况 我们可以运行以下SQL查询表空间使用情况: ```sql SELECT a.tablespace_name, a.bytes_alloc / (1024*1024) "Allocated(MB)", (a.bytes_alloc - b.bytes_free) / (1024*1024) "Used(MB)", b.bytes_free / (1024*1024) "Free(MB)", round(((a.bytes_alloc - b.bytes_free) / a.bytes_alloc)*100,2) "% Used" FROM (SELECT tablespace_name, SUM(bytes) bytes_alloc FROM dba_data_files GROUP BY tablespace_name) a, (SELECT tablespace_name, SUM(bytes) bytes_free FROM dba_free_space GROUP BY tablespace_name) b WHERE a.tablespace_name = b.tablespace_name AND a.tablespace_name = 'SYSTEM'; ``` 步骤2:检查SYSTEM表空间中占用空间较多的对象 ```sql SELECT owner, segment_name, segment_type, bytes/(1024*1024) AS "Size(MB)" FROM dba_segments WHERE tablespace_name = 'SYSTEM' ORDER BY bytes DESC; ``` 步骤3:清理非系统用户对象 注意:SYSTEM表空间通常只应包含SYS用户的对象。如果发现其他用户的对象(如应用用户),应将这些对象迁移到其他表空间。 常见的可清理项: 1. 如果存在大表或索引在SYSTEM表空间,将其移动到其他表空间。 - 移动表:`ALTER TABLE <table_name> MOVE TABLESPACE <target_tablespace>;` - 重建索引:`ALTER INDEX <index_name> REBUILD TABLESPACE <target_tablespace>;` 2. 清理回收站:`PURGE RECYCLEBIN;` (注意:需要以SYSDBA执行) 3. 如果存在大型AUD$审计表(如果启用了审计),可以考虑清理或迁移审计表(需要谨慎操作)。 步骤4:扩展SYSTEM表空间 如果清理后空间仍然不足,可以考虑扩展表空间。 方法1:扩展现有数据文件 ```sql ALTER DATABASE DATAFILE '<full_path_to_system01.dbf>' RESIZE <new_size>M; ``` 方法2:添加新的数据文件(注意:SYSTEM表空间通常只有一个数据文件,但可以添加多个) ```sql ALTER TABLESPACE SYSTEM ADD DATAFILE '<path_to_new_datafile>' SIZE 1G AUTOEXTEND ON NEXT 100M MAXSIZE UNLIMITED; ``` 步骤5:重启数据库(如果必要) 在清理和扩展之后,如果数据库出现异常(如因为空间不足导致某些操作失败),可能需要重启数据库。 注意事项: - 操作前备份数据库(非常重要) - 以SYSDBA身份执行这些操作 - 在操作期间,数据库可能暂时不可用 示例:清理并扩展SYSTEM表空间 假设我们发现有一个应用用户的大表存储在SYSTEM表空间,我们可以将其移动到用户表空间: ```sql -- 移动表 ALTER TABLE app_user.big_table MOVE TABLESPACE users; -- 重建索引(如果有索引) ALTER INDEX app_user.big_table_pk REBUILD TABLESPACE users; ``` 然后,我们扩展SYSTEM表空间: ```sql ALTER DATABASE DATAFILE '/u01/app/oracle/oradata/ORCL/system01.dbf' RESIZE 2048M; ``` 最后,重启Web服务。 引用[1]中提到,临时表空间的内容可以回收,但SYSTEM表空间不行。因此,我们必须主动清理和扩展。 相关问题: 1. 如何预防SYSTEM表空间再次被填满? 2. 如何找出哪些对象在SYSTEM表空间中并且可以迁移? 3. 如何监控Oracle表空间使用情况? 4. 如何安全地清理Oracle审计表(AUD$)?</think>### Oracle SYSTEM表空间已满导致Web服务无法启动的解决方法 SYSTEM表空间存储Oracle核心数据字典、系统对象和元数据,当它被填满时会导致数据库操作失败,进而使Web服务崩溃。以下是完整的解决流程: #### 🔍 步骤1:确认空间使用情况(诊断问题) ```sql -- 以SYSDBA身份登录 SELECT tablespace_name, ROUND(used_space/1024/1024, 2) AS "已用(MB)", ROUND(tablespace_size/1024/1024, 2) AS "总大小(MB)", ROUND(used_percent, 2) AS "使用率(%)" FROM dba_tablespace_usage_metrics WHERE tablespace_name = 'SYSTEM'; ``` 输出示例: ``` TABLESPACE_NAME 已用(MB) 总大小(MB) 使用率(%) SYSTEM 985 1024 96.19 ``` > 当使用率 > 95% 时需立即处理[^1] #### 🧹 步骤2:清理可回收空间(优先尝试) ```sql -- 清理回收站(所有用户) PURGE DBA_RECYCLEBIN; -- 清理过期的审计记录(如果启用审计) TRUNCATE TABLE SYS.AUD$; -- 重建索引释放碎片空间 ALTER INDEX SYS.I_OBJ1 REBUILD ONLINE; ``` #### 📈 步骤3:扩展表空间(核心解决方案) ```sql -- 检查现有数据文件路径 SELECT file_name, bytes/1024/1024 AS "当前大小(MB)" FROM dba_data_files WHERE tablespace_name = 'SYSTEM'; -- 方法1:扩展现有文件(推荐) ALTER DATABASE DATAFILE '/u01/app/oracle/oradata/ORCL/system01.dbf' RESIZE 2048M; -- 扩容到2048MB -- 方法2:添加新数据文件(当磁盘空间不足时) ALTER TABLESPACE SYSTEM ADD DATAFILE '/u01/app/oracle/oradata/ORCL/system02.dbf' SIZE 1024M AUTOEXTEND ON NEXT 100M MAXSIZE 10G; ``` #### 🔧 步骤4:检查并迁移异常对象 ```sql -- 查找非SYS/SYSTEM用户的对象 SELECT owner, segment_name, segment_type, bytes/1024/1024 AS "大小(MB)" FROM dba_segments WHERE tablespace_name = 'SYSTEM' AND owner NOT IN ('SYS','SYSTEM'); -- 迁移用户对象(示例:迁移APP_USER的表) ALTER TABLE app_user.large_table MOVE TABLESPACE users; ``` #### ⚙️ 步骤5:重启服务与验证 1. 重启数据库: ```bash sqlplus / as sysdba > SHUTDOWN IMMEDIATE; > STARTUP; ``` 2. 启动Web服务: ```bash systemctl restart apache2 # 根据实际服务名调整 ``` 3. 验证状态: ```sql SELECT status FROM v$instance; -- 应返回'OPEN' ``` #### 🛡️ 预防措施(避免再次发生) ```sql -- 创建监控脚本(保存为monitor_ts.sql) SELECT tablespace_name, used_percent FROM dba_tablespace_usage_metrics WHERE used_percent > 80; ``` 设置定时任务: ```bash crontab -e # 每30分钟检查一次 */30 * * * * sqlplus -s / as sysdba @/scripts/monitor_ts.sql ``` #### ⚠️ 关键注意事项 1. **操作前必须备份**: ```bash rman target / > BACKUP DATABASE PLUS ARCHIVELOG; ``` 2. 扩展空间时需确保磁盘有足够空间(`df -h`命令检查) 3. 避免在SYSTEM表空间存储用户对象(设计规范) 4. 对于11g版本,注意`AUD$`表可能快速膨胀,建议定期清理或启用审计归档 > 临时表空间的内容可以回收,而SYSTEM表空间的数据是持久性的,需要主动管理空间使用[^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值