ORACLE 11G SYSAUX表空间满处理及move和shrink区别

今天收到11G表空表空间SYSAUX超过90%一个告警,之前的思路是简单的加数据文件,因为改空间存储是非业务数据,是可以通过配置来压缩表空间的。

查看是什么内容占用了SYSAUX表空间

SELECT occupant_name "Item",
       space_usage_kbytes / 1048576 "Space Used (GB)",
       schema_name "Schema",
       move_procedure "Move Procedure"
  FROM v$sysaux_occupants
 ORDER BY space_usage_kbytes DESC;

SYSAUX表空间中各个段占用空间大小

SELECT *
  FROM (SELECT owner, segment_name, segment_type, SUM(bytes) / 1024 / 1024 / 1024 GB
          FROM dba_segments
         WHERE tablespace_name = 'SYSAUX'
         GROUP BY owner, segment_name, segment_type
         ORDER BY 4 DESC)
 WHERE rownum < 10

发现占用最高的就是WRI$_OPTSTAT_HISTGRM_HISTORY 这个表及其上面的2个索引

SM/OPTSTAT 占用空间高处理方式

发现是SM/OPTSTAT 即统计信息占用空间较高。

经过查看系统保留了31天的统计信息,没必要用这么高:

select dbms_stats.get_stats_history_retention from dual; 

查看统计信息最早时间:

select dbms_stats.get_stats_history_availability from dual;

来设置保留10天就可以:

EXEC dbms_stats.alter_stats_history_retention(10);  

然后删除十天之前的数据:

--对于几十G的数据来说,这个sql比较耗时,需要在业务清闲时执行
exec dbms_stats.purge_stats(sysdate-10);

高水位处理

经过上面的的清理操作后,发现空间占用率并没降下来,因为清理的存储过程dbms_stats.purge_stats(sysdate-10) 本质是delete sql 来删除数据,需要清理高水位。参考ORACLE 官方文档 Doc ID 454678.1

--业务空闲时间段执行
1- Take a full backup of the database
2- Move the tables:

SQL> alter table WRI$_OPTSTAT_TAB_HISTORY move;
SQL> alter table WRI$_OPTSTAT_OPR move;
SQL> alter table WRI$_OPTSTAT_IND_HISTORY move;
SQL> alter table WRI$_OPTSTAT_HISTHEAD_HISTORY move;
SQL> alter table WRI$_OPTSTAT_HISTGRM_HISTORY move;
SQL> alter table WRI$_OPTSTAT_AUX_HISTORY move;

3- For indexes, find the indexes for the above tables and rebuild them. In case an index is unusable, please see the following example:

SQL> select status from dba_indexes where index_name='I_WRI$_OPTSTAT_IND_OBJ#_ST';
SQL> select status from dba_indexes where index_name='I_WRI$_OPTSTAT_TAB_ST';

Assuming that indexes: I_WRI$_OPTSTAT_IND_OBJ#_ST & I_WRI$_OPTSTAT_TAB_ST are unusable, then, we have to do the following:

a.Determine the DDL's for the indexes using dbms_metadata package as shown in the example below
 SQL> set long 4000
 SQL> select dbms_metadata.get_ddl('INDEX','I_WRI$_OPTSTAT_IND_OBJ#_ST','SYS') from dual;
 SQL> select dbms_metadata.get_ddl('INDEX','I_WRI$_OPTSTAT_TAB_ST','SYS') from dual;
   
b.Then drop and recreate the indexes using the obtained DDL's.
   
c.Once done you can confirm the status by running the following query for example :
SQL> select status from dba_indexes where index_name='I_WRI$_OPTSTAT_IND_OBJ#_ST';
SQL> select status from dba_indexes where index_name='I_WRI$_OPTSTAT_TAB_ST';

4- To ensure that statistics history will be retained for at least 8 days:

SQL> exec dbms_stats.alter_stats_history_retention(8); 

或者只针对WRI$_OPTSTAT_HISTGRM_HISTORY表进行在线重建索引

SQL> alter table WRI$_OPTSTAT_HISTGRM_HISTORY move;
 
Table altered.
 
SQL> alter index I_WRI$_OPTSTAT_H_OBJ#_ICOL#_ST rebuild online;
 
Index altered.
 
SQL> alter index I_WRI$_OPTSTAT_H_ST rebuild online;
 
Index altered.

SQL> exec dbms_stats.alter_stats_history_retention(8); 

附言 move和shrink 的区别

shrink

shrink的前提是,先开启行迁移。

 alter table WRI$_OPTSTAT_HISTGRM_HISTORY enable row movement;
 alter table WRI$_OPTSTAT_HISTGRM_HISTORY shrink space cascade;

语法示意:

alter table TABLE_NAME shrink space [compact|cascade]
Segment shrink执行的两个阶段:

1、数据重组(compact):

通过一系列insert、delete操作,将数据尽量排列在段的前面。在这个过程中需要在表上加RX锁,即只在需要移动的行上加锁。

由于涉及到rowid的改变,需要enable row movement.同时要disable基于rowid的trigger.这一过程对业务影响比较小。

2、HWM调整:第二阶段是调整HWM位置,释放空闲数据块。

此过程需要在表上加X锁,会造成表上的所有DML语句阻塞。在业务特别繁忙的系统上可能造成比较大的影响。

注意:shrink space语句两个阶段都执行。

shrink space compact只执行第一个阶段。如果系统业务比较繁忙,可以先执行shrink space compact重组数据,然后在业务不忙的时候再执行shrink space降低HWM释放空闲数据块。

举例

alter table TABLE_NAME shrink space compact; –- 只整理碎片 不回收空间,
alter table TABLE_NAME shrink space; –- 整理碎片并回收空间。
alter table TABLE_NAME shrink space cascade; – 整理碎片回收空间 并连同表的级联对象一起整理(比如索引)
alter table pt_table modify PARTITION P1 shrink space cascade; --分区表

shrink的优点

1.可在线执行

2.可使用参数cascade,同时收缩表上的索引

3.执行后不会导致索引失效

4.可避免alter table move执行过程中占用很多表空间(如果表10G大小,那alter table move差不多还得需要10G空间才能执行)。

move

1、move table的功能:

①:将一个table从当前的tablespace上移动到另一个tablespace上:

②:来改变table已有的block的存储参数,如:alter table t move storage (initial 30k next 50k);

③:move操作也可以用来解决table中的行迁移的问题。

2、使用move的一些注意事项:

①:table上的index需要rebuild:

在前面我们讨论过,move操作后,数据的rowid发生了改变,我们知道,index是通过rowid来fetch数据行的,所以,table上的index是必须要rebuild的。

alter index index_name rebuild online;
②:move时对table的锁定

当我们对table进行move操作时,查询v$locked_objects视图可以发现,table上加了exclusive lock

③:关于move时空间使用的问题:

当我们使用alter table move来降低table的HWM时,有一点是需要注意的,这时,当前的tablespace中需要有1倍于table的空闲空间以供使用。

三、move和hrink的区别是:

1、move后,表在表空间中的位置肯定会变,可能前移也可能后移,一般来说如果该表前面的表空间中有足够空间容纳该表,则前移,否则后移。

2、shrink后,表在表空间中的位置肯定不变,也就是表的段头位置不会发生变化。

3、Move会移动高水位,但不会释放申请的空间,是在高水位以下(below HWM)的操作。

4、shrink space 同样会移动高水位,但也会释放申请的空间,是在高水位上下(below and above HWM)都有的操作。

5、使用move时,会改变一些记录的ROWID,所以MOVE之后索引会变为无效,需要REBUILD。

6、使用shrink space时,索引会自动维护。如果在业务繁忙时做压缩,

可以先shrink space compact,来压缩数据而不移动HWM,等到不繁忙的时候再shrink space来移动HWM。

7、shrink可以单独压缩索引,alter index xxx shrink space来压缩索引。另外、压缩表时指定Shrink space cascade会同时压缩索引.

参考文档:

https://blog.csdn.net/csdn201420142015/article/details/100496907
https://blog.csdn.net/renyanjie123/article/details/114832842
https://blog.51cto.com/fengfeng688/1955137
https://www.modb.pro/db/26483

猜你喜欢

转载自blog.csdn.net/x6_9x/article/details/122921220