暂无图片
暂无图片
3
暂无图片
暂无图片
暂无图片

sysaux空间满了

原创 薛晓刚 2023-03-22
1341

   SYSAUX表空间是数据库的辅助表空间,一般是自动扩展的。有人遇到问题问我,我看了一下,这个空间已经几十G了。虽然自动扩展但是这样也应该干预一下。

   我以我的练习环境为例说明,先查询占用最多的:

   SQL:select d.owner, d.segment_name, bytes / 1024 / 1024/1024 G, d.segment_type from dba_segments d where d.tablespace_name = 'SYSAUX' order by 3 desc;

  一般来说占用最大的对象都是--WRI$_ADV_OBJECTS  

  这个占用大说明一个问题,就是SQL写的不好,而且很长。因为这是给建议的,说明待改进的SQL真的很差。

   所以我们可以直接用下面这句:

SQL> select d.segment_name, bytes / 1024 / 1024/1024 G, d.segment_type from dba_segments d where d.tablespace_name = 'SYSAUX' and d.segment_name='WRI$_ADV_OBJECTS';

SEGMENT_NAME
--------------------------------------------------------------------------------
G SEGMENT_TYPE
---------- ------------------
WRI$_ADV_OBJECTS
.001953125 TABLE


   我们看看这个对象保留了多久?在CDB下执行。

SQL> SELECT parameter_name, parameter_value FROM DBA_ADVISOR_PARAMETERS WHERE task_name='AUTO_STATS_ADVISOR_TASK' and PARAMETER_NAME IN 'EXECUTION_DAYS_TO_EXPIRE';

未选定行

从结果表明,这个是在PDB上的,在CDB中没有。

切换到PDB

SQL> alter session set container=tu;

会话已更改。

SQL> SELECT parameter_name, parameter_value FROM DBA_ADVISOR_PARAMETERS WHERE task_name='AUTO_STATS_ADVISOR_TASK' and PARAMETER_NAME IN 'EXECUTION_DAYS_TO_EXPIRE';

PARAMETER_NAME
--------------------------------------------------------------------------------
PARAMETER_VALUE
--------------------------------------------------------------------------------
EXECUTION_DAYS_TO_EXPIRE
30

可以看出是保留了默认30天。如果说空间不足,我们要首先先清理。

通过以下命令进行清理。一下仅仅是针对19C数据库。其他版本略有不同。

DECLARE
v_tname VARCHAR2(32767);
BEGIN
v_tname := 'AUTO_STATS_ADVISOR_TASK';
DBMS_STATS.DROP_ADVISOR_TASK(v_tname);
END;
2 3 4 5 6 7 /

PL/SQL 过程已成功完成。

SQL> EXEC DBMS_STATS.INIT_PACKAGE();

PL/SQL 过程已成功完成。

exec dbms_pdb.exec_as_oracle_script('ALTER TABLE WRI$_ADV_OBJECTS MOVE');
exec dbms_pdb.exec_as_oracle_script('ALTER INDEX WRI$_ADV_OBJECTS_PK REBUILD');
exec dbms_pdb.exec_as_oracle_script('ALTER INDEX WRI$_ADV_OBJECTS_IDX_01 REBUILD');
exec dbms_pdb.exec_as_oracle_script('ALTER INDEX WRI$_ADV_OBJECTS_IDX_02 REBUILD');

PL/SQL 过程已成功完成。

SQL>
PL/SQL 过程已成功完成。

SQL>
PL/SQL 过程已成功完成。

SQL>
PL/SQL 过程已成功完成。

清理过后再次检查,是不是释放了?

SQL> select d.segment_name, bytes / 1024 / 1024/1024 G, d.segment_type from dba_segments d where d.tablespace_name = 'SYSAUX' and d.segment_name='WRI$_ADV_OBJECTS';

SEGMENT_NAME
--------------------------------------------------------------------------------
G SEGMENT_TYPE
---------- ------------------
WRI$_ADV_OBJECTS
.000061035 TABLE

可见000061035开始的001953125小了。说明有效果。

说明:如果这个越大越慢,所以要低峰时间维护,而且不要让他很大,否则积重难返。

最后我们修改30天,设置7天,自动维护。

SQL> EXEC DBMS_ADVISOR.SET_TASK_PARAMETER( 'AUTO_STATS_ADVISOR_TASK', 'EXECUTION_DAYS_TO_EXPIRE', 7);

PL/SQL 过程已成功完成。

最后修改时间:2023-03-23 10:30:16
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论