0x00--目的

整理一下以前一个SYSTEM表空间和SYSAUX表空间使用率达到99%上限的处理思路和相关知识点,好记性不如烂笔头

0x01--表空间使用率现状

通过查询可得知目前表空间使用情况如下图:可看到SYSAUX表空间和SYSTEM表空间使用率都已经高达99%,SYSAUX表空间甚至只剩下6.19MB的空间空间。

可看出两张系统关键表空间的使用率已经不容乐观。急需找出占用空间的幕后凶手!并将之绳之以法

0x02--AWRINFO脚本初步诊断

通过Oracle数据库自带的awrinfo脚本进行初步诊断,下边截取关键内容,可得到如下信息,快照过期信息是占用SYSAUX的元凶

0x03--v$sysaux_occupants视图查询明细

进一步查询SYSAUX表空间使用详细情况:

 SQL> select owner,segment_name,partition_name,bytes// from dba_segments where tablespace_name='SYSAUX' order by  desc where rownum <=20;

 OWNER                   SEGMENT_NAME                                     PARTITION_NAME         BYTES//
------------------------------ --------------------------------------------------------------------------------- ------------------------------ ---------------
SYS WRH$_ACTIVE_SESSION_HISTORY WRH$_ACTIVE_1404287032_0
SYS WRH$_EVENT_HISTOGRAM_PK WRH$_EVENT__1404287032_0
SYS WRH$_EVENT_HISTOGRAM WRH$_EVENT__1404287032_0
SYS WRH$_LATCH WRH$_LATCH_1404287032_0
SYS WRH$_SYSSTAT_PK WRH$_SYSSTA_1404287032_0
SYS WRH$_LATCH_MISSES_SUMMARY_PK WRH$_LATCH__1404287032_0
SYS WRH$_SQLSTAT WRH$_SQLSTA_1404287032_0
SYS WRH$_LATCH_PK WRH$_LATCH_1404287032_0
SYS WRH$_LATCH_MISSES_SUMMARY WRH$_LATCH__1404287032_0
SYS WRH$_SYSSTAT WRH$_SYSSTA_1404287032_0
SYS WRH$_ACTIVE_SESSION_HISTORY_PK WRH$_ACTIVE_1404287032_0
SYS WRH$_PARAMETER_PK WRH$_PARAME_1404287032_0
SYS WRH$_PARAMETER WRH$_PARAME_1404287032_0
SYS WRH$_SEG_STAT WRH$_SEG_ST_1404287032_0
SYS WRH$_SYSTEM_EVENT WRH$_SYSTEM_1404287032_0
SYS WRH$_SYSTEM_EVENT_PK WRH$_SYSTEM_1404287032_0
SYS WRH$_SERVICE_STAT_PK WRH$_SERVIC_1404287032_0
SYS WRH$_SQLSTAT_PK WRH$_SQLSTA_1404287032_0
SYS WRH$_DLM_MISC WRH$_DLM_MI_1404287032_0
SYS WRH$_DLM_MISC_PK WRH$_DLM_MI_1404287032_0
SYS WRH$_SEG_STAT_PK WRH$_SEG_ST_1404287032_0

查询v$sysaux_occupants视图,我们可以确定占用SYSAUX表空间过多的大部分都是AWR的基表,所以,根据实际业务需求,删除部分AWR数据理论上就可以回收一部分SYSAUX表空间,在Oracle中,通常AWR信息都会设置保留期限,Oracle 10g版本默认保留7天,Oracle 11g版本默认保留8天,可以通过dba_hist_wr_control视图来查看保留期限。也可以手动更改AWR保留时间,设置AWR基线。

 select * from dba_hist_wr_control;

0x04-顺带AWR讲解

既然说到这里,就顺带一下AWR的日常操作:

AWR (Automatic Workload Repository)
一堆历史性能数据,放在SYSAUX表空间上, AWR和SYSAUX都是10g出现的,是Oracle调优的关键特性; 大约1999年左右开始开发,已经有约20年历史
主要是MMON(Manageability Monitor Process)和它的小工进程(m00x)来维护AWR。
 ##手动执行一个快照:
Exec dbms_workload_repository.create_snapshot;
##创建一个AWR基线
Exec DBMS_WORKLOAD_REPOSITORY.CREATE_BASELINE(start_snap_id,end_snap_id ,baseline_name);
##单节点AWR报告
@?/rdbms/awrrpt.sql
##AWR比对报告
@?/rdbms/admin/awrddrpt
##RAC 全局AWR
@?/rdbms/admin/awrgrpt
##RAC中可选择节点生成AWR报告
@?/rdbms/admin/awrrpti

0x05--AWR过期快照信息清理

在本博文的案例中,Oracle版本为11.2.0.4.0,AWR默认保留期限8天。但是为什么会占用这么多SYSAUX表空间呢?首先,要明确AWR快照信息的删除方式:AWR报告默认是采取DELETE
的方式进行过期信息删除的,相比TRUNCATE而言,就会产生大量的碎片,对于开启了自动扩展数据文件的表空间而言,碎片的现会象更加严重。再有一点,ASH的信息在有可能不受AWR快照
保留策略的控制。从如下SQL查询可得知,从SNAP_ID为1的快照到目前为止的所有快照都还在数据库中保存着,导致WRH$_ACTIVE_SESSION_HISTORY表很大,使用
DBMS_WORKLOAD_REPOSITORY包清理过期或者不需要的AWR数据,可以回收这部分空间。

 SQL> select min(snap_id),max(snap_id) from  wrh$_active_session_history;

 MIN(SNAP_ID) MAX(SNAP_ID)
------------ ------------

通过DBMS_WORKLOAD_REPOSITORY包清理快照信息:

 exec DBMS_WORKLOAD_REPOSITORY.DROP_SNAPSHOT_RANGE (low_snap_id =>,high_snap_id => );

2 PL/SQL procedure successfully completed.

但是,通过这种方式清理的AWR信息,再次查看SYSAUX表空间的空间,发现空间并没有被回收,使用率还和之前一样,这是因为清理AWR操作是通过DELETE操作实现的,表的水位线并没有下降导致的。但是通过再次查询WRH$_ACTIVE_SESSION_HISTORY可发现表记录已经少了。但是表大小还是没有变化。

0x06--对分区进行MOVE操作,回收表空间

通过上边查询出来的SYSAUX表空间占用分布情况,将占用空间较大的对象进行MOVE操作,回收表空间。

①首先查看表的分区情况以及大小

  select segment_name,partition_name,bytes/// gb from dba_segments where segment_name='WRH$_EVENT_HISTOGRAM';

②对分区表进行MOVE操作,回收空间

 alter table WRH$_EVENT_HISTOGRAM move partition WRH$_EVENT__1404287032_0;
 alter table WRH$_EVENT_HISTOGRAM move partition WRH$_EVENT_HISTO_MXDB_MXSN;

③MOVE后,重建分区表索引

 ##查看分区表索引信息
select index_name from dba_indexes where table_name='WRH$_EVENT_HISTOGRAM';
##重建分区表索引
SQL> select index_name from dba_indexes where table_name='WRH$_EVENT_HISTOGRAM';
INDEX_NAME
------------------------------
WRH$_EVENT_HISTOGRAM_PK
SQL> alter index WRH$_EVENT_HISTOGRAM_PK rebuild partition WRH$_EVENT__1404287032_0;
SQL> alter index WRH$_EVENT_HISTOGRAM_PK rebuild partition WRH$_EVENT_HISTO_MXDB_MXSN;

以下是操作参考:

 SQL> select segment_name,partition_name,bytes/// gb from dba_segments where segment_name='WRH$_EVENT_HISTOGRAM';
SEGMENT_NAME PARTITION_NAME GB
--------------------------------------------------------------------------------- ------------------------------ ----------
WRH$_EVENT_HISTOGRAM WRH$_EVENT__1404287032_0 2.5
WRH$_EVENT_HISTOGRAM WRH$_EVENT_HISTO_MXDB_MXSN .
SQL> alter table WRH$_EVENT_HISTOGRAM move partition WRH$_EVENT__1404287032_0; Table altered. SQL> alter table WRH$_EVENT_HISTOGRAM move partition WRH$_EVENT_HISTO_MXDB_MXSN; Table altered.
SQL> select index_name from dba_indexes where table_name='WRH$_EVENT_HISTOGRAM'; INDEX_NAME
------------------------------
WRH$_EVENT_HISTOGRAM_PK SQL> alter index WRH$_EVENT_HISTOGRAM_PK rebuild partition WRH$_EVENT__1404287032_0; Index altered. SQL> alter index WRH$_EVENT_HISTOGRAM_PK rebuild partition WRH$_EVENT_HISTO_MXDB_MXSN; Index altered. SQL> select sum(bytes)// from dba_segments where segment_name='WRH$_EVENT_HISTOGRAM'; SUM(BYTES)//
--------------------
. SQL> select segment_name,partition_name,bytes/// gb from dba_segments where segment_name='WRH$_LATCH'; SEGMENT_NAME PARTITION_NAME GB
--------------------------------------------------------------------------------- ------------------------------ ----------
WRH$_LATCH WRH$_LATCH_MXDB_MXSN .
WRH$_LATCH WRH$_LATCH_1404287032_0 1.5625 SQL> alter table WRH$_LATCH move partition WRH$_LATCH_1404287032_0; Table altered. SQL> alter table WRH$_LATCH move partition WRH$_LATCH_MXDB_MXSN; Table altered. SQL> select index_name from dba_indexes where table_name='WRH$_LATCH'; INDEX_NAME
------------------------------
WRH$_LATCH_PK SQL> alter index WRH$_LATCH_PK rebuild partition WRH$_LATCH_1404287032_0; Index altered. SQL> alter index WRH$_LATCH_PK rebuild partition WRH$_LATCH_MXDB_MXSN; Index altered. SQL> select segment_name,partition_name,bytes/// gb from dba_segments where segment_name='WRH$_LATCH'; SEGMENT_NAME PARTITION_NAME GB
--------------------------------------------------------------------------------- ------------------------------ ----------
WRH$_LATCH WRH$_LATCH_MXDB_MXSN .
WRH$_LATCH WRH$_LATCH_1404287032_0 . SQL> select segment_name,partition_name,bytes/// gb from dba_segments where segment_name='WRH$_SYSSTAT'; SEGMENT_NAME PARTITION_NAME GB
--------------------------------------------------------------------------------- ------------------------------ ----------
WRH$_SYSSTAT WRH$_SYSSTA_1404287032_0 1.0625
WRH$_SYSSTAT WRH$_SYSSTAT_MXDB_MXSN . SQL> alter table WRH$_SYSSTAT move partition WRH$_SYSSTA_1404287032_0; Table altered. SQL> alter table WRH$_SYSSTAT move partition WRH$_SYSSTAT_MXDB_MXSN; Table altered. SQL> select index_name from dba_indexes where table_name='WRH$_SYSSTAT'; INDEX_NAME
------------------------------
WRH$_SYSSTAT_PK SQL> alter index WRH$_SYSSTAT_PK rebuild partition WRH$_LATCH_1404287032_0;
alter index WRH$_SYSSTAT_PK rebuild partition WRH$_LATCH_1404287032_0
*
ERROR at line :
ORA-: Specified partition does not exist SQL> alter index WRH$_SYSSTAT_PK rebuild partition WRH$_SYSSTA_1404287032_0; Index altered. SQL> alter index WRH$_SYSSTAT_PK rebuild partition WRH$_SYSSTAT_MXDB_MXSN; Index altered. SQL> select segment_name,partition_name,bytes/// gb from dba_segments where segment_name='WRH$_SYSSTAT'; SEGMENT_NAME PARTITION_NAME GB
--------------------------------------------------------------------------------- ------------------------------ ----------
WRH$_SYSSTAT WRH$_SYSSTA_1404287032_0 .
WRH$_SYSSTAT WRH$_SYSSTAT_MXDB_MXSN . SQL> select segment_name,partition_name,bytes/// gb from dba_segments where segment_name='WRH$_LATCH_MISSES_SUMMARY'; SEGMENT_NAME PARTITION_NAME GB
--------------------------------------------------------------------------------- ------------------------------ ----------
WRH$_LATCH_MISSES_SUMMARY WRH$_LATCH__1404287032_0 1.125
WRH$_LATCH_MISSES_SUMMARY WRH$_LATCH_MISSE_MXDB_MXSN . SQL> alter index WRH$_LATCH_MISSES_SUMMARY_PK rebuild partition WRH$_LATCH__1404287032_0; Index altered. SQL> select segment_name,partition_name,bytes/// gb from dba_segments where segment_name='WRH$_LATCH_MISSES_SUMMARY'; SEGMENT_NAME PARTITION_NAME GB
--------------------------------------------------------------------------------- ------------------------------ ----------
WRH$_LATCH_MISSES_SUMMARY WRH$_LATCH__1404287032_0 1.125
WRH$_LATCH_MISSES_SUMMARY WRH$_LATCH_MISSE_MXDB_MXSN . SQL> alter table WRH$_LATCH_MISSES_SUMMARY move partition WRH$_LATCH__1404287032_0; Table altered. SQL> alter table WRH$_LATCH_MISSES_SUMMARY move partition WRH$_LATCH_MISSE_MXDB_MXSN; Table altered. SQL> alter index WRH$_LATCH_MISSES_SUMMARY_PK rebuild partition WRH$_LATCH__1404287032_0; Index altered. SQL> alter index WRH$_LATCH_MISSES_SUMMARY_PK rebuild partition WRH$_LATCH_MISSE_MXDB_MXSN; Index altered. SQL> select segment_name,partition_name,bytes/// gb from dba_segments where segment_name='WRH$_LATCH_MISSES_SUMMARY'; SEGMENT_NAME PARTITION_NAME GB
--------------------------------------------------------------------------------- ------------------------------ ----------
WRH$_LATCH_MISSES_SUMMARY WRH$_LATCH__1404287032_0 .
WRH$_LATCH_MISSES_SUMMARY WRH$_LATCH_MISSE_MXDB_MXSN .

0x07--SYSTEM表空间回收

查询得知,SYSTEM表空间大多被AUD$占用,即Oracle数据库审计信息,对于审计信息,如无特殊需求,可以直接通过truncate即可回收SYSTEM表空间。相比SYSAUX而言,是不是简单很多。要注意,SYSTEM表空间的日常备份,以及空间预警。

 TRUNCATE TABLE AUD$;

0x08--扩展点--High Water Mark 水位线

在清理SYSAUX表空间时,发现通过DBMS_WORKLOAD_REPOSITORY包清理快照信息时,SYSAUX表空间并未释放,这里涉及到一个Oracle数据库中一个关于Segment(段)的关键概念---HWM(High Water Mark),段中用于表示已使用和未使用空间的边界。

##Oracle官方文档给出的简要解释
high water mark (HWM)
The boundary between used and unused space in a segment.

那么,在Oracle数据库中,Segment是什么呢?Segment是占用磁盘空间的一个对象,比如我们常见的Table(表)、表分区、Cluster(聚簇)、Index索引、索引分区、LOB分区、嵌套表、回滚段等,都是不同类型的Segment(段)。

##Oracle官方定义的Segment概念
segment
A set of extents allocated for a specific database object such as a table, index, or table cluster. User segments, undo segments, and temporary segments are all types of segments.

在Oracle9i之前,Oracle数据库中,段空间的管理方式是MSSM--manual segment space management,手动段空间管理,段空间的观念里和分配需要调整很多参数进行管理,非常之繁琐。比如FREELISTS等参数,关键是这些参数配置正确合理与否,对Oracle数据库的性能影响非常之大。表的剩余空间的管理与分配都是由链接列表freelist来完成的,因为freelist存在串行的问题因此容易引起往往容易引起段头的争用与空间的浪费,最主要的还是因为需要人为的 花费大量的精力和时间去管理这些争用并监控表的空间利用。

从Oracle9i开始,Oracle数据库推出了ASSM,详见ASSM官网说明,automatic segment space management,自动段空间管理。ASSM,链接列表freelist被位图所取代,它是一个二进制的数组,能够效地管理存储扩展和剩余区块(free block)。

高水位线就是数据块在一个段内历史周期内达到的最大的位置,高水位线只增不减,只升不降,直到这个segment对象被truncate,才会降低。这里这个高水位线对数据库性能的影响还是有的。为什么不会释放呢?

①空间利用率:

上述文中,如果不对表分区进行MOVE,那个高水位线是不会降低的,删除的数据本质上是通过DELETE语句去删除的,但是这部分的空间(EXTEND)还是属于它原有的段(Segment),不能被其他对象所使用,在表空间无法自动扩展或者未开启自动扩展的情况下,这些空间(EXTEND)只能是原来所属表新增数据进行使用;如果在开启了自动扩展的表空间下,且未达到上限的表空间中,这部分的空间将被“遗忘”,无法被再次利用,这就会导致碎片化,DELETE后的空间是无法被其他对象使用的。

②性能影响:

在Oracle数据库中,全表扫描时,会对HWM高水位线以下的所有数据块进行扫描,虽然数据块中没有任何数据,但是也会一一进行扫描,这对资源是一种不必要的消耗,而且会对数据库的性能产生影响。

再下去就要说说行迁移、行链接以及ASSM相关参数,PCTFREE,PCTUSED,BUFFER_POOL等等,之后再详细记录吧。

由Oracle 11g SYSAUX 和 SYSTEM 表空间回收引发的联想的更多相关文章

  1. Oracle 11g安装,新建表空间和用户

    windows版: 官网下载,两个压缩包,总共2G,解压到同一个文件夹下,setup.exe双击执行,首次安装的话,一直下一步就可以了,最后一步可能时间比较长,等着就好了,一般性能的机器大概要半小时左 ...

  2. SYSTEM表空间满,解决方法

    SYSTEM表空间是Oracle创建数据库时候自动创建的,每个Oracle数据库都会有SYSTEM表空间,而且SYSTEM表空间总是要保持在联机模式下,因为其包含了数据库运行所要求的基本信息,如:数据 ...

  3. Oracle 数据库、实例、表空间、用户、数据库对象

    Oracle是一种数据库管理系统,是一种关系型的数据库管理系统.通常情况了我们称的“数据库”,包含了物理数据.数据库管理系统.内存.操作系统进程的组合体,就是指这里所说的数据库管理系统. 完整的Ora ...

  4. 11g RAC添加用户表空间(数据文件)至文件系统(File System)的修正

    前提:非TEMP.UNDO和SYSTEM表空间,这仨是大爷,您得搂着点.来自博客园AskScuti .客户是添加临时表空间数据文件时,不小心 ADD 到了文件系统中,然后发现,后悔了,还在OS层面 R ...

  5. [Oracle]System 表空间的文件丢失

    如果system 表空间的文件丢失,假设有备份的情况,可以恢复.数据库需要设置为mount 状态,然后restore/recover datafile 模拟实验: SQL> select nam ...

  6. Oracle system表空间满的暂定解决方法

    Oracle system表空间满的暂定解决方法 数据库用的是Oracle Express 10.2版本的.利用Oracle Text做全文检索应用,创建用户yxl时没有初始化默认表空间,在系统开发过 ...

  7. oracle问题之SYSTEM表空间不足 (二)

    杂症二.SYSTEM表空间不足报错 一.杂症: PLSQL登录,报错: ORA-00604: 递归 SQL 层  出现错误 ORA-01653: 表.无法通过(在表空间中)扩展 ORA-02002: ...

  8. oracle数据库解决system表空间已爆满的问题

    有时会发现数据库system表空间增长很快,使用以下语句查看system表空间使用量.也可以使用toad直接看. select b.tablespace_name "表空间", b ...

  9. Oracle数据库体系结构(7) 表空间管理1

    表空间是Oracle数据库最大的逻辑存储结构,有一系列段构成.Oracle数据库对象存储结构的管理主要是通过表空间的管理实现的. 1.表空间的分类 表空间根据存储类型不同分为系统表空间和非系统表空间 ...

随机推荐

  1. JS十进制转二进制(控制位数)

    主要需求:十进制转二进制,可以控制指定的位数. 转化显示后的二进制数为bin-bit中输入的数字宽度.dec-number为5,bin-bit为5,则转化后数字为00101.如果bin-bit小于转化 ...

  2. vue click事件获取当前元素属性

    Vue可以传递$event对象 <body id="app"> <ul> <li @click="say('hello!', $event) ...

  3. ArcGIS 10.3 for Server部署策略

    注:以下部署策略整理自官方文档,主要是为方便以后查阅各种部署方案. 1.单机部署与反向代理 1.1.反向代理 反向代理可采用ArcGIS Web Adaptor或者第三方的反向代理服务器. 1.2.部 ...

  4. ImageNet download

    Download Original Images Note: On Feb 8, 2014, our terms of access changed along with the APIs/URLs ...

  5. 花1台的钱入手2台【最能抗DDoS】阿里云主机【攻略】

    花1台的钱入手2台[最能抗DDoS]阿里云主机[攻略]: 第一步:先申请0元半年 http://click.aliyun.com/m/335/:注:0元机器只有新帐号可申请第二步:再买6折37/月 h ...

  6. 初学scrum及首次团队开发

    一.初学scrum 1.什么是scrum Scrum在英语的意思是橄榄球里的争球.而在这里Scrum是一种迭代式增量软件开发过程,经常性的被用于敏捷软件开发.Scrum包括了一系列实践和预定义角色的过 ...

  7. Redux学习笔记--异步Action和Middleware

    异步Action 之前介绍的都是同步操作,Redux通过分发action处理state,所有的数据流都是同步的,如果需要一步的话怎么办? 最简单的方式就是使用同步的方式来异步,将原来同步时一个acti ...

  8. Oracle中用户和方案的区别

    从定义中我们可以看出方案(Schema)为数据库对象的集合,为了区分各个集合,我们需要给这个集合起个名字,这些名字就是我们在企业管理器的方案下看到的许多类似用户名的节点,这些类似用户名的节点其实就是一 ...

  9. 如何在 Linux 虚拟机上扩展根文件系统

    问题描述 通过 Azure 平台部署的 Linux 虚拟机默认的根文件系统容量有限,需要进行扩展. 问题分析 由于 Azure 平台部署的 Linux 虚拟机默认根文件系统容量比较小,客户在使用过程中 ...

  10. laravel中delete()方法和destroy()方法的区别

    delete()方法是实例方法,需要查询到相应的数据并通过模型实例调用 destroy()方法可以直接调用,通过索引删除记录 举个栗子: /*delete()方法删除*/ //先查找记录 $blog ...