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 过程已成功完成。




