闪回区空间不足引发的SQL问题分析

有一天上班的时候,收到一封报警邮件。
ZABBIX-监控系统:
------------------------------------
报警内容: archive_area_usage
------------------------------------
报警级别: PROBLEM
------------------------------------
监控项目: archive_area_usage:ARCHIVED
LOG-->70.25-->
------------------------------------
报警时间:2016.09.20-08:52:47

可以看出是闪回区快满了,当然我设置了阈值70%,比Oracle默认的80%要更低一些,希望尽可能早的发现这些潜在的问题。
碰到这个问题,让我有些奇怪。
现在服务器端都有默认的crontab来设置定期删除过期的归档,怎么闪回区还会这么快就满了呢。这类问题的原因相对来说复杂一些,如果说从数据库层面来看,如果在10gR2的版本中,可能出现这种情况,那就是有些命令的兼容性问题导致,如果是系统层面可能就是就是存储路径失效,比如nfs挂载点失效等导致。
目前这个数据库是11gR2,存储都是本地磁盘。
我们来看看crontab的设置,可以看出是每个小时会运行,触发的频率较高,如果每天触发一次,如果存在这个问题可能还能理解,为什么在这种频率下删除归档依旧闪回区空间不足?
$ crontab -l
*/50 * * * *  . $HOME/.bash_profile;$HOME/dbadmin/scripts/rman_trun_arch.sh
我们来看看脚本的内容。我贴出关键的部分。
可以看出归档的删除过期归档,保留时间是10个小时之内,其实已经算是很短的了。保留近半天的归档而已。
rman target / <<EOF
CONFIGURE ARCHIVELOG DELETION POLICY TO APPLIED ON STANDBY;
crosscheck archivelog all;
delete noprompt expired archivelog all;
delete noprompt archivelog until time "sysdate-10/24";
exit
EOF
如此频率下怎么还会有这类问题。看看当前闪回区的情况。

可以看到已经存在300多个归档。
这问题确实有意思了,有大量的归档,有频繁的删除策略,但是闪回区还报错。
我们来换个姿势看这个问题,就是查看归档频率。

这个脚本的强大的之处就在于可以查看近2周的归档频率,通过这种方式就可以看出这个问题其实是一个周期性的。在周二会定期出现,只是之前没有引起重视而已。
可以看到每个小时的归档频率极高,按照这种情况,6个小时就会积累300多个归档,一个归档日志成员是1G来算,那么这个归档量就很大了。
一个统计库怎么这么忙,这是一个问题,我们来看看数据库的负载情况。

可以看到在早间的时候数据库的负载还是有很大的提升。
那么这个时间段内是否有SQL引起的如此的变化,比如一个AWR报告,比如一个脚本就能够定位。
当然抓到罪魁祸首是关键,我是使用脚本来做,抓到了下面的语句。发现了不少负载高的查询语句。

进一步定位,发现都有千丝万缕的关键,那就是其中一个存储过程调用,会调用里面的一些SQL语句。
最终发现SQL语句是这样的形式
SQL_FULLTEXT
----------------------------------------------------------------------------------------------------
UPDATE TESTINFO A SET A.MAX_LEVEL = NVL((SELECT USER_CLASS FROM ROLE_CLASS_INFO B WHERE A.GROUPID =
B.GROUP_ID AND B.CN_GUID = A.ROLE_GUID), A.MAX_LEVEL) WHERE DRAWED = 'Y'

看这个语句其实逻辑也不复杂,但是如果查看数据量就会发现这个工作量真是太大了,两个表都是亿级的数据量。

按照过滤条件,数据量2亿,过滤得到4千万,都不是小数目,所以全表看来也是一种方案。
SQL> select DRAWED,count(*)from test.testinfo group by DRAWED;
D   COUNT(*)
- ----------
Y   43807108
N  216762221
Elapsed: 00:00:36.17  
但是显然这里还是存在一些需要确认的地方,这个语句本该不需运行,至少不应该在统计层面来保证数据的业务逻辑一致性,应该在OLTP系统中就应该保证,所以我的努力方向就是取消这个JOB,这种优化才是最有效的。

时间: 2024-10-23 17:37:34

闪回区空间不足引发的SQL问题分析的相关文章

闪回区报警引发的性能问题分析(r11笔记第11天)

自从有了Zabbix+Orabbix,很多监控都有了一种可控的方式,当然对于报警处理来说,报警是表象,很可能通过表象暴露出来的是一些更深层次的问题.这不又来一个,不看不知道,一看让自己着实吓了一跳. 首先是一个报警信息,可以看到是闪回区超过了报警的阈值,为了尽可能提前发现问题,我把阈值设置为了70%,和Oracle默认的80%有一些差别. ZABBIX-监控系统: ------------------------------------ 报警内容: archive_area_usage ----

oracle闪回区管理

Errors in file /home/oracle/diag/rdbms/orarpt/orarpt/trace/orarpt_mmon_22508.trc: ORA-19815: WARNING: db_recovery_file_dest_size of 2147483648 bytes is 98.55% used, and has 31102976 remaining bytes available. *****************************************

Oracle闪回区满

  一台老的测试AIX服务器,没人理过,最近一看Oracle闪回满了.清理了下. Version: Oracle 10gR2 for AIX 现象: ? 1 2 3 4 5 6 7 SQL> alter database open; alter database open * ERROR at line 1: ORA-16014: log 3 sequence# 157 not archived, no available destinations ORA-00312: online log 3

关于闪回区溢出导致的数据hang(r11笔记第12天)

对于Oracle数据库的闪回区的设置,之前和一个同事和讨论过,总体来说有一些不同的意见. 首先这个闪回区是一个逻辑的概念,闪回区的大小不会严格依赖于磁盘空间的情况,比如磁盘空间目前剩余100G,但是你设置闪回区为200G是没有问题的. 如此一来,和只使用归档参数想比,这个闪回区似乎有一点问题,总体来说闪回区的管理还是比较方便的,可以监控管理闪回区中的归档,闪回日志,备份等的大小. 使用的视图为v$flash_recovery_area_usage,在11g做了简化,为v$recovery_are

一个闪回区报警的数据恢复(r11笔记第63天)

    今天在火车上接到一个电话说,数据库有个报警,让我看看是怎么回事. 看着报警信息一直重复出现,看来是有些问题了.     这是一个统计库,出现了DG相关的报警(自定义配置的),看起来是备库端接收归档的时候出现了问题. Error 270 creating remote archivelog file 'sgstatdb3' 我们知道备库端其实是有一个80%的阈值控制闪回区的,当时限于在火车上,网络,信号不顺畅,所以让同事帮忙看了下,大体是说闪回区满了,但是系统层面设置了crontab定期去

10g关闭归档/启用闪回恢复区归档

一.关闭归档 1.启动SQL*PLUS以管理身份登录Oracle数据库: SQL> connect / as sysdba 2.关闭数据库实例 SQL> shutdown immediate 3.备份数据库:在对数据库做出任何重要的改变之前,建议备份数据库以免出现任何问题. 4.启动一个新的实例并装载数据库,但不打开数据库: SQL> startup mount 5.禁止自动存档 SQL> alter system archive log stop; 6.禁止存档联机重做日志:转换

性能-关于Oracle闪回的问题

问题描述 关于Oracle闪回的问题 请问Oracle闪回的数据是否可以按照时间设置多少小时内可闪回? 还是Oracle闪回的数据只能设置数据量的大小? 另:Oracle闪回空间的设置对数据库性能有哪些方面的影响? 解决方案 Oracle的闪回技术提供了一组功能,可以访问过去某一时间的数据并从人为错误中恢复.闪回技术是Oracle 数据库独有的,支持任何级别的恢复,包括行.事务.表和数据库范围.使用闪回特性,您可以查询以前的数据版本,还可以执行更改分析和自助式修复,以便在保持数据库联机的同时从逻

Oracle 闪回技术详细介绍及总结_oracle

Oracle闪回技术详解,这里整理了4种闪回技术,对Oracle 闪回技术做一个整理总结.  概述: 闪回技术是Oracle强大数据库备份恢复机制的一部分,在数据库发生逻辑错误的时候,闪回技术能提供快速且最小损失的恢复(多数闪回功能都能在数据库联机状态下完成).需要注意的是,闪回技术旨在快速恢复逻辑错误,对于物理损坏或是介质丢失的错误,闪回技术就回天乏术了,还是得借助于Oracle一些高级的备份恢复工具如RAMN去完成(这才是Oracle强大备份恢复机制的精髓所在啊)  撤销段(UNDO SEG

Oracle 闪回特性(FLASHBACK DATABASE)

--===================================== -- Oracle 闪回特性(FLASHBACK DATABASE) --=====================================       闪回技术通常用于快速简单恢复数据库中出现的认为误操作等逻辑错误,从闪回的方式可以分为基于数据库级别闪回.表级别闪回.事务 级别闪回,根据闪回对数据的影响程度又可以分为闪回恢复,闪回查询.闪回恢复将修改数据,闪回点之后的数据将全部丢失.而闪回查询则可 以查询数