本文转自:http://www.linuxidc.com/Linux/2015-10/123959.htm

感谢分享

1、问题说明

运维人员都有“节日休假恐怖症”,越到节日、休假和外出出差,系统越可能出现问题。笔者在进行一个系统的例行检查时,出现了问题。

数据库版本为11gR2,具体版本编号为11.2.0.3。

SQL> select * from v$version;

BANNER

--------------------------------------------------------------------------------

Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production

PL/SQL Release 11.2.0.3.0 - Production

CORE    11.2.0.3.0    Production

TNS for Linux: Version 11.2.0.3.0 - Production

NLSRTL Version 11.2.0.3.0 – Production

问题发现的由头是生成AWR报告的时候,发现近几天都没有正常生成AWR Snapshot。由于是很少用的系统,所以笔者只在每月进行一次跟踪。这种情况肯定不正常,进入10g之后,AWR后台默认每隔一小时,都会自动生成一个Snapshot镜像数据。

这种情况,笔者本能想去定位alert log,大部分异常情况,Oracle都会记录在数据库中。果然在其中发现了问题。

Wed Sep 30 14:24:15 2015

ORA-1653: unable to extend table SYS.SCHEDULER$_EVENT_LOG by 128 in                tablespace SYSAUX

Errors in file /home/oracle/app/diag/rdbms/xxx/xxxdb/trace/xxxdb_j000_3385.trc:

ORA-01653: unable to extend table . by  in tablespace

ORA-01653: unable to extend table SYS.SCHEDULER$_EVENT_LOG by 128 in tablespace SYSAUX

Wed Sep 30 15:06:58 2015

ORA-1653: unable to extend table SYS.SCHEDULER$_EVENT_LOG by 128 in                tablespace SYSAUX

Errors in file /home/oracle/app/diag/rdbms/xxxdb/xxxdb/trace/xxxdb_j000_5102.trc:

ORA-01653: unable to extend table . by  in tablespace

ORA-01653: unable to extend table SYS.SCHEDULER$_EVENT_LOG by 128 in tablespace SYSAUX

从内容上看,是sysaux表空间满了。默认情况下,Oracle的系统性质表空间都是不支持文件自动拓展的。如果原有大小写满了,同时不支持自动拓展,的确会有报错异常。

此时,AWR配置内容是默认方式。

SQL> select * from dba_hist_wr_control;

DBID SNAP_INTERVAL                          RETENTION                              TOPNSQL

---------- --------------------------------------- --------------------------------------- ----------

1778314713 +00000 01:00:00.0                      +00008 00:00:00.0                      DEFAULT

默认AWR是每小时保存一个镜像,镜像数据会保存八天。此时,AWR中已经没有对应的数据镜像了。

SQL> select snap_id, dbid, startup_time from dba_hist_snapshot;

SNAP_ID      DBID STARTUP_TIME

---------- ---------- --------------------------------------------------------------------------------

2、问题缓解

一般数据库故障,通常不是一个单独策略可以解决的。笔者认为:问题分轻重缓急,解决方案也分猛药温补。关键的取舍取决于不同的场景优先级别。在这种情况下,恢复AWR工作,增加sysaux表空间存储是首要需求。

这种操作比较简单,只要单独定位和允许文件自动拓展即可。

SQL> alter database datafile '/data/xxxdb/systs/sysaux01.dbf' autoextend on;

Database altered

SQL> select bytes/1024/1024, AUTOEXTENSIBLE from dba_data_files where tablespace_name='SYSAUX';

BYTES/1024/1024 AUTOEXTENSIBLE

--------------- --------------

1032 YES

Alert log中记录信息。

YSAUX

Wed Sep 30 15:30:13 2015

alter database datafile '/data/xxxdb/systs/sysaux01.dbf' autoextend on

Completed: alter database datafile '/data/xxxdb/systs/sysaux01.dbf' autoextend on

手工测试生成AWR镜像,判断问题是否解决。

SQL> exec dbms_workload_repository.create_snapshot;

PL/SQL procedure successfully completed

SQL> select snap_id, to_char(BEGIN_INTERVAL_TIME,'yyyy-mm-dd hh24:mi:ss') from dba_hist_snapshot;

SNAP_ID TO_CHAR(BEGIN_INTERVAL_TIME,'Y

---------- ------------------------------

23383 2015-09-30 15:40:16

在日志中没有新的报错信息出现。可以认为初步问题解决。下一步就是定位问题:为什么会出现sysaux爆棚的情况。

3、深层分析过程

AWR和其他一些性能收集,的确是不断的将数据收集到sysaux表空间里面进行记录。笔者一直认为:任何正确的数据架构模式,必要条件之一就是“有进有出”。数据不断积累,一定要有机制(系统内或者系统外)让数据可以脱离系统。从微观角度看,数据表要维持一个稳定的体积容量结构。

AWR系统也的确是这样。在不断收集数据的时候,也会依据Retention规则(默认为8天)不断将数据Purge掉。无论如何设置,sysaux正常情况下应该是一个固定稳定的大小规格。笔者当前数据库已经运行一两年的时间,要出问题早就出现问题了。说明系统中,有一些数据在不断的“默默长大”,问题在不断的慢慢积累。

尝试检查当前sysaux表空间段结构排名,看有没有与此相关的信息。

SQL> select owner, segment_name, segment_type, bytes/1024/1024 from (select * from dba_segments where tablespace_name='SYSAUX' order by bytes desc) where rownum<5;

OWNER      SEGMENT_NAME          SEGMENT_TYPE      BYTES/1024/1024

---------- ------------------------------ ------------------ ---------------

SYS  WRM$_SNAPSHOT_DETAILS_INDEX INDEX                          102

SYS  WRM$_SNAPSHOT_DETAILS      TABLE                          88

SYS  SMON_SCN_TO_TIME_AUX      CLUSTER                        80

XDB  SYS_LOB0000057474C00025$$  LOBSEGMENT                53.1875

疑问出现了,最大的几个对象中,snapshot赫然出现在其中。当前Snapshot里面没有数据,无论是被自然purge掉,还是认为删掉,都不应该有数据存在。查看基础数据表:

SQL> select count(*) from WRM$_SNAPSHOT_DETAILS;

COUNT(*)

----------

1723102

SQL> select * from WRM$_SNAPSHOT_DETAILS where rownum<5;

SNAP_ID      DBID INSTANCE_NUMBER  TABLE_ID BEGIN_TIME

---------- ---------- --------------- ---------- -------------------------------

1 1778314713              1          4 05-12??-12 05.00.08.719 ????

1 1778314713              1          5 05-12??-12 05.00.08.771 ????

1 1778314713              1          6 05-12??-12 05.00.08.841 ????

1 1778314713              1          7 05-12??-12 05.00.08.892 ????

其中数据量还是很大的,重点在于snap_id。

SQL> select max(snap_id), min(snap_id) from WRM$_SNAPSHOT_DETAILS;

MAX(SNAP_ID) MIN(SNAP_ID)

------------ ------------

23383            1

“慢慢变大”的数据找到了,作为AWR基础的数据,从来就没有被删除。手工删除呢?是不是可以删除?

SQL> select snap_id from dba_hist_snapshot;

SNAP_ID

----------

23383

SQL> exec dbms_workload_repository.drop_snapshot_range(1,23383);

PL/SQL procedure successfully completed

SQL> select snap_id from dba_hist_snapshot;

SNAP_ID

----------

SQL> select max(snap_id), min(snap_id) from WRM$_SNAPSHOT_DETAILS;

MAX(SNAP_ID) MIN(SNAP_ID)

------------ ------------

23383            1

SQL> select max(snap_id), min(snap_id) from WRM$_SNAPSHOT;

MAX(SNAP_ID) MIN(SNAP_ID)

------------ ------------

删除的数据,没有连带将基础数据表WRM$_SNAPSHOT_DETAILS内容删除。诡异的问题!

经过查证MOS,发现该数据表不能删除是一个Oracle Bug,具体描述如下:

Bug 9797851 - WRM$_SNAPHOST_DETAILS is never purged

The verification criteria for the bug are:

Drop a range of snap id's using dbms_workload_repository.drop_snapshot_range()

Check the corresponding snap id's in WRM$_SNAPSHOT_DETAILS.

If snap id's from the range that you chose to drop are still present, then you are hitting this bug.

The following solutions are available:

The Patch 9797851 for unpublished Bug 9797851 is available for some platforms and can be downloaded from My Oracle Support

If the patch is not available on your platform on a supported version, please contact Oracle Support.

This issue will be fixed from release Oracle 12.1

As a workaround, it is possible to manually purge the range of snap id's from the table WRM$_SNAPSHOT_DETAILS using appropriate delete statments under the guidance of Oracle Support.

其中内容所,如果要解决这个问题,需要进行补丁操作,或者在Oracle Support指导之下手工进行删除。

由于是生产环境,经过协调,认为当前开启拓展sysaux策略是可以接受的解决方案。于是笔者打算适可而止,不影响系统正常运行。

4、恢复自动AWR收集

最后需要恢复AWR收集。注意:在一些资料中,建议最开始有一个snapshot,通过手工创建,之后Oracle才能自动的进行生成。

为了快速验证,调整收集周期是10分钟。

SQL> exec dbms_workload_repository.create_snapshot;

PL/SQL procedure successfully completed

SQL> exec dbms_workload_repository.modify_snapshot_settings(interval=>10);

PL/SQL procedure successfully completed

SQL> select * from dba_hist_wr_control;

DBID SNAP_INTERVAL                          RETENTION                              TOPNSQL

---------- --------------------------------------- --------------------------------------- ----------

1778314713 +00000 00:10:00.0                      +00008 00:00:00.0                      DEFAULT

经过一段时间,可以看到数据变化。

SQL> select snap_id, to_char(BEGIN_INTERVAL_TIME,'yyyy-mm-dd hh24:mi:ss') from dba_hist_snapshot;

SNAP_ID TO_CHAR(BEGIN_INTERVAL_TIME,'Y

---------- ------------------------------

23384 2015-09-30 16:07:51

SQL> select snap_id, to_char(BEGIN_INTERVAL_TIME,'yyyy-mm-dd hh24:mi:ss') from dba_hist_snapshot;

SNAP_ID TO_CHAR(BEGIN_INTERVAL_TIME,'Y

---------- ------------------------------

23384 2015-09-30 16:07:51

23385 2015-09-30 16:39:32

SQL> select snap_id, to_char(BEGIN_INTERVAL_TIME,'yyyy-mm-dd hh24:mi:ss') from dba_hist_snapshot;

SNAP_ID TO_CHAR(BEGIN_INTERVAL_TIME,'Y

---------- ------------------------------

23384 2015-09-30 16:07:51

23385 2015-09-30 16:39:32

23386 2015-09-30 16:50:17

恢复60分钟收集。

SQL> exec dbms_workload_repository.modify_snapshot_settings(interval=>60);

PL/SQL procedure successfully completed

问题解决。

5、结论

经过这个案例,笔者的感受有两条。首先,定期检查alert log,检查系统性能数据情况是非常重要的运维手段。要么依靠自动监控工具,要么依靠运维人员的日常工作。所谓“养病如养虎,虎大必伤人”在运维领域同样存在。其次就是“有可为,有可不为”,发现问题时候,要根据情形进行分析,找到技术、管理、业务的平衡点。

【ORACLE】awr报告问题分析的更多相关文章

  1. Oracle AWR报告详细分析--比较详细

    https://blog.csdn.net/demonson/article/details/79474133

  2. (原创)如何在性能测试中自动生成并获取Oracle AWR报告

    版权声明:本文为原创文章,转载请先联系并标明出处 由于日常使用最多的数据库为Oracle,因此,最近又打起了Oracle的AWR报告的主意. 过去我们执行测试,都是执行开始和结束分别手动建立一个快照, ...

  3. ORACLE AWR报告生成步骤

    ORACLE AWR报告生成步骤 (以PL/SQL中命令窗口为例) 1.sqlplus或plsql的commod窗口(命令窗口)运行命令 @D:\oracle\product\10.2.0\db_1\ ...

  4. 快速熟悉 Oracle AWR 报告解读

    目录 AWR报告简介 AWR报告结构 基本信息 Report Summary Main Report RAC statistics Wait Event Statistics 参考资料 本文面向没有太 ...

  5. Oracle AWR报告指标全解析-11011552

    1-5 Top 5 Timed EventsWaits : 该等待事件发生的次数, 对于DB CPU此项不可用Times : 该等待事件消耗的总计时间,单位为秒, 对于DB CPU 而言是前台进程所消 ...

  6. Oracle AWR 报告详解

    转自:http://blog.csdn.net/laoshangxyc/article/details/8615187 持续更新中... Oracle awr报告详解 DB Name DB Id In ...

  7. Oracle AWR报告生成和性能分析

    目录 一.AWE报告生成步骤 1.1 工具选择 1.2 自动创建快照 1.3 手工创建快照 1.4 生成AWR报告 二.AWR报告分析 2.1 AWR之DB Time 2.2 AWR之load_pro ...

  8. [转]oracle awr报告生成和分析

    转自:http://blog.csdn.net/cuker919/article/details/8767328 最近由于数据库cpu占用非常高,导致VCS常常自动切换,引起很多问题. 最近学习一下数 ...

  9. ORACLE AWR报告生成过程出现多个实例记录分析

    在一次生成AWR报告中,发现在"Instances in this Workload Repository schema"部分,出现了多个实例记录信息(host敏感信息被用host ...

随机推荐

  1. MySQL 锁(完整版)

    目录 锁总览 锁的作用 加锁流程 锁对数据库的影响 锁等待 死锁 锁类型 锁范围 锁方式 全局锁 全局读锁 全局QC锁 QC锁存在的问题: 备份锁 backup lock MDL锁 MDL锁类型 MD ...

  2. Idea中Web项目Jsp文件找不到类解决方法

    在src下创建package,java代码放到包中,编译时才能在WEB-INFO的classes文件夹中生成可识别的class文件 https://blog.csdn.net/youwanname/a ...

  3. js下 Day20、综合案例

    一.购物车 效果图: 功能思路分析: 1. 面向对象框架 2. 模拟数据 1.多个店铺数组套对象 2.每个店铺多个商品,数组套对象

  4. 工作三年!全靠大佬的Java笔记,年底跳槽阿里涨了10K

    前言 不论是校招还是社招都避免不了各种⾯试.笔试,如何去准备这些东⻄就显得格外重要,之前8月底阿里的人事部门打电话叫我要不要面试,当时正处于换工作的期间,于是就把简历发给阿里hr,人事审核后经过一些列 ...

  5. [日常摸鱼]Uva11178Morley's Theorem-几何

    题意:给一个$\Delta ABC$,分别做三个角的三等分线相交成$\Delta DEF$,求出$D,E,F$的坐标. 直接根据题意模拟 #include<cstdio> #include ...

  6. Java项目连接数据库Mysql报错create connection SQLException

    今天编写了一个Java项目,对数据库Mysql的表进行增删改查,然后遇到了这个问题 严重: create connection SQLException, url: jdbc:mysql://loca ...

  7. SpringBoot从入门到精通教程(五)

    上节,我们讲了 SpringBoot 如何使用MyBatis 今天我们讲讲 Springboot Logo自定义的问题, 我们在启动 SpringBoot 时,控制台会打印 SpringBoot Lo ...

  8. 干货满满:python实现二维图制作

    python全代码如下 import re import csv import matplotlib.pyplot as plt x=[] y=[] m=eval(input()) #输入折线条数 f ...

  9. python scipy 求解简单线性方程组和fmin求函数最小值

    ###这是一个利用内置函数求最小值#####def func(x): return x ** 2 - 2 *x x = 1 func(x) opt.fmin(func ,x)## 用scipy求解线性 ...

  10. java基础:数组详解以及应用,评委打分案例实现,数组和随机数综合,附练习案列

    1.数组 1.1 数组介绍 数组就是存储数据长度固定的容器,存储多个数据的数据类型要一致. 1.2 数组的定义格式 1.2.1 第一种格式 数据类型[] 数组名 示例: int[] arr;     ...