oracle sysaux表空间文件过大的处理方法
一般来讲除开业务数据存放的表空间,DBA要着重关注SYSTEM,SYSAUX,UNDO,TEMP表空间,SYSTEM表空间的大小一般是衡定的,UNDO和TEMP表空间的大小由数据库的业务情况决定,而SYSAUX表空间在默认条件下你如果不做任何配置,随着时间的推移,会膨胀的越来越大!SYSAUX表空间做为SYSTEM表空间的辅助表空间,主要存放EM相关的内容以及表统计信息,AWR快照,审计信息等,个人认为,如果你的SYSAUX表空间大小超过2G,那么该考虑让他减肥了!
SELECT * FROM (
SELECT D.TABLESPACE_NAME,
SPACE || 'M' "SUM_SPACE(M)",
BLOCKS "SUM_BLOCKS",
SPACE - NVL (FREE_SPACE, 0) || 'M' "USED_SPACE(M)",
ROUND ( (1 - NVL (FREE_SPACE, 0) / SPACE) * 100, 2) || '%'
"USED_RATE(%)",
FREE_SPACE || 'M' "FREE_SPACE(M)"
FROM ( SELECT TABLESPACE_NAME,
ROUND (SUM (BYTES) / (1024 * 1024), 2) SPACE,
SUM (BLOCKS) BLOCKS
FROM DBA_DATA_FILES
GROUP BY TABLESPACE_NAME) D,
( SELECT TABLESPACE_NAME,
ROUND (SUM (BYTES) / (1024 * 1024), 2) FREE_SPACE
FROM DBA_FREE_SPACE
GROUP BY TABLESPACE_NAME) F
WHERE D.TABLESPACE_NAME = F.TABLESPACE_NAME(+)
UNION ALL
SELECT D.TABLESPACE_NAME,
SPACE || 'M' "SUM_SPACE(M)",
BLOCKS SUM_BLOCKS,
USED_SPACE || 'M' "USED_SPACE(M)",
ROUND (NVL (USED_SPACE, 0) / SPACE * 100, 2) || '%' "USED_RATE(%)",
NVL (FREE_SPACE, 0) || 'M' "FREE_SPACE(M)"
FROM ( SELECT TABLESPACE_NAME,
ROUND (SUM (BYTES) / (1024 * 1024), 2) SPACE,
SUM (BLOCKS) BLOCKS
FROM DBA_TEMP_FILES
GROUP BY TABLESPACE_NAME) D,
( SELECT TABLESPACE_NAME,
ROUND (SUM (BYTES_USED) / (1024 * 1024), 2) USED_SPACE,
ROUND (SUM (BYTES_FREE) / (1024 * 1024), 2) FREE_SPACE
FROM V$TEMP_SPACE_HEADER
GROUP BY TABLESPACE_NAME) F
WHERE D.TABLESPACE_NAME = F.TABLESPACE_NAME(+)
ORDER BY 1)
WHERE TABLESPACE_NAME IN ('SYSAUX','SYSTEM','UNDOTBS1','TEMP');
SELECT occupant_name "Item",
space_usage_kbytes / 1048576 "Space Used (GB)",
schema_name "Schema",
move_procedure "Move Procedure"
FROM v$sysaux_occupants
ORDER BY 1
、三:只要处理AWR的快照信息就可以将存储空间清理出来,修改统计信息的保持时间,
默认为31天,这里修改为7天,过期的统计信息会自动被删除
SQL> select dbms_stats.get_stats_history_retention from dual;
GET_STATS_HISTORY_RETENTION
---------------------------
31
SQL> exec dbms_stats.alter_stats_history_retention(7);
PL/SQL procedure successfully completed.
SQL> select dbms_stats.get_stats_history_retention from dual;
GET_STATS_HISTORY_RETENTION
---------------------------
7
四:检查快照采样间隔为每30分钟一次,保留时间为8天,当然这个值从Oracle 11g 开始,默认值就为30分钟一次,如果没有特殊要求可以不做修改。
修改AWR快照的保存时间为7天(7*24*60),每小时收集一次,也可以通过EM界面查看和修改.
SQL> begin
dbms_workload_repository.modify_snapshot_settings (
interval => 60,
retention => 10080,
topnsql => 100
);
end;
五:删除AWR快照,再次查看SYSAUX表空间使用率,最后表空间使用率降低为38.42%。
注意: 这是个大坑此过程通过删除表数据
select min(snap_id),max(snap_id) from dba_hist_snapshot;//查询最最小和最大快照ID
注意: 这是个大坑此过程通过删除表数据,数据量比较大,会将undo与归档空间给占满,导致oracle挂掉。
你要删除的快照信息不多时,仍然是首选该过程处理。如下命令。
begin
dbms_workload_repository.drop_snapshot_range(
low_snap_id => 10758,
high_snap_id => 10900,
dbid => 387090299);
end;
官网说明如下:
Syntax:
DBMS_WORKLOAD_REPOSITORY.DROP_SNAPSHOT_RANGE(
low_snap_id IN NUMBER,
high_snap_id IN NUMBER
dbid IN NUMBER DEFAULT NULL);
Examples:
EXECUTE DBMS_WORKLOAD_REPOSITORY.DROP_SNAPSHOT_RANGE(37091, 37679);
六.大坑描述与分析
根据用DBMS_WORKLOAD_REPOSITORY.DROP_SNAPSHOT_RANGE来删除快照耗时非常久,此时我也感觉到困惑,生产库这样子操作很危险,于是就继续跟踪查找问题,最后发现在执行该过程时后台实际运行的都是delete基表的动作,这下大家明白了吧,delete大表呀, undo表空间够不够大,归档日志切换频繁,导致归档目录空间不足。多么可怕的大坑啊!
七.另外一种处理方式,简单粗暴,但很简单实用,思路是按照上面操作存储过程的方法进行改量,采取手动备份基表部分数据,truncate基表,再将备份部分数据插入回基表。经验证该方法很高效而且成功,顺便提一句,truncate表同时索引空间也被清空了。
SYS@orcl1 > select min(snap_id),max(snap_id) from dba_hist_snapshot;
MIN(SNAP_ID) MAX(SNAP_ID)
------------ ------------
37091 37680
select * from (select segment_name,PARTITION_NAME,segment_type,bytes/1024/1024 from dba_segments where tablespace_name='SYSAUX' order by 4 desc) where rownum<=10;
3.查表基本的组织结构发现WRH$表中都有snap_id字段,所以我们就用这个字段进行分界线处理。我们对占用空间第一的表进行处理,备份WRH$_ACTIVE_SESSION_HISTORY表保留数据到WRH$_ACTIVE_SESSION_HISTORY_B表。
CREATE TABLE WRH$_ACTIVE_SESSION_HISTORY_B AS SELECT * FROM WRH$_ACTIVE_SESSION_HISTORY WHERE SNAP_ID>37679 ;
SELECT COUNT(*) FROM WRH$_ACTIVE_SESSION_HISTORY_B;
TRUNCATE TABLE WRH$_ACTIVE_SESSION_HISTORY;
INSERT INTO WRH$_ACTIVE_SESSION_HISTORY SELECT * FROM WRH$_ACTIVE_SESSION_HISTORY_B;
COMMIT;
SELECT COUNT(*) FROM WRH$_ACTIVE_SESSION_HISTORY;
drop table WRH$_ACTIVE_SESSION_HISTORY_B purge;
在这次处理sysaux辅助表空间时,我们掌握了两种方法:
(1)DBMS_WORKLOAD_REPOSITORY.DROP_SNAPSHOT_RANGE 存储过程方式
(2)查出哪些基表占用空间大,进行手工备份与删除 。
在这次清理过程中,让我们感觉到使用ORACLE提供的存储过程也会有大坑,还是要了解清楚,或者在测试环境测试过方可在生产上执行,否则还真会带来不少麻烦
目录 返回
首页