关于ORA-01555的问题分析(r5笔记第87天)
今天开发的同事发给我一个问题,在运行某一个Job的时候抛出了ORA错误,希望我们看看从数据库层面能不能发现什么。 错误日志如下:
Function: EntitySQLCursor::query
Line number: 113
Time: Thu Jul 2 22:52:46 2015
Message text: (PE1-000143) Internal IO Framework Database Error, message ORA-01555: snapshot too old: rollback segment number 22 with name "_SYSSMU22_234950861$" too small
, code 1555.
看这个错误,似乎是oracle分配的回滚段太小导致的。对于这个问题,因为已经过去了一段时间,所以能够合理分析的一种途径就是使用ash. 根据错误信息中的时间戳,基本定位在了22:52~22:53这一分钟之内,抓取了一个ash报告。 因为信息针对性更强,可以很清晰的看到在那一分钟之内数据库层面有一些查询和dml的语句在运行,有些走了全表扫描,有些走了索引扫描。
Top SQL with Top Events
SQL ID |
Planhash |
Sampled # of Executions |
% Activity |
Event |
% Event |
Top Row Source |
% RwSrc |
SQL Text |
---|---|---|---|---|---|---|---|---|
fzn01wc5pg2dg |
1199754052 |
2 |
15.67 |
CPU + Wait for CPU |
11.75 |
TABLE ACCESS - FULL |
11.75 |
SELECT /*+ ALL_ROWS USE_NL ("A... |
db file sequential read |
2.61 |
TABLE ACCESS - FULL |
2.61 |
|||||
direct path read |
1.31 |
TABLE ACCESS - FULL |
1.31 |
|||||
5q2mguqdcrq4a |
421773076 |
1 |
12.01 |
db file sequential read |
12.01 |
INDEX - RANGE SCAN |
7.05 |
SELECT RE.L3_NET_START_TIME, R... |
a793wrq0q27c5 |
201265388 |
1 |
10.70 |
db file sequential read |
8.09 |
DELETE |
8.09 |
delete from RATED_EVENT WHERE ... |
CPU + Wait for CPU |
1.57 |
DELETE |
1.57 |
|||||
direct path read temp |
1.04 |
DELETE |
1.04 |
|||||
496x3fkydc1xj |
84305990 |
1 |
9.92 |
db file sequential read |
8.62 |
INDEX - RANGE SCAN |
8.62 |
** SQL Text Not Available ** |
CPU + Wait for CPU |
1.31 |
INDEX - RANGE SCAN |
1.31 |
|||||
dm1d93bw2jdzc |
2843169790 |
27 |
8.09 |
db file sequential read |
4.70 |
INDEX - RANGE SCAN |
2.09 |
select sk.rowid , sk.subscribe... |
CPU + Wait for CPU |
3.39 |
SELECT STATEMENT |
2.35 |
需要重点关注的是全表扫描的语句和DML语句。
先来看看全表扫描的语句。
SELECT /*+ ALL_ROWS USE_NL ("AC1_CONTROL_HIST") FULL ("AC1_CONTROL_HIST") */ .... from "AC1_CONTROL_HIST" WHERE "CUR_PGM_NAME"='RGD' AND "IDENTIFIER"=:1
语句输出字段较多,但是相关的表只有一个,这个表从表名可以看出是一个历史表,数据量相比也是相当大的,一查看统计信息,数据量都在亿级以上。
这么大的表,使用了hint,指定全表扫描,相比是某些地方需要吧,带着疑问查看了索引的信息,而其中的主键索引就是IDENTIFIER字段开始的。
所以从这个角度来看,这个问题是一个很明显的问题,因为使用Hint不当导致了,本该走索引扫描的查询结果走了极为消耗资源的全表扫描。
当然了,哲学中有句话是 存在即合理,可能在早期的时候数据量不大,处于某种需要,可能需要全表扫描,或者这部分逻辑是直接从某个地方参考而来,而其中的hint都忘了变更,导致了这样的问题。
出了问题,找问题的理由也是多种多样。当然最终这个问题还是发生了,能够及时发现修复才是更重要的。
对于这个问题的分析暂时告一段落,但是还有dml对于undo的影响也不容小视,可供参考的就是前面表格中的delete语句了。
对于这个语句,delete涉及的表也是很大的一个分区表,数据量亿级以上。在基于索引扫描的前提下,做了根据时间戳进行数据清理的操作。对于这种操作,我们可以反过来考虑一下,目前delete的逻辑是对的,在排除了ac1_control_hist全表扫描影响的前提下,delete操作还是会消耗大量的undo资源。这个时候也需要同时考虑目前的undo大小是否完全满足系统的要求。目前的库里undo的大小在17G左右,几个大分区表都在百G以上,如果删除所限定的时间戳大一些,undo的消耗就会更大,所以也需要考量undo的大小,根据目前的情况,可以考虑适当增大undo空间。
所以这个问题的分析结果就是两个建议,第一个就是对于本该索引扫描的语句走了全表扫描进行改进,规范hint的使用。另外一方面是建议适当调大undo的大小,以满足系统的需求,使得系统的负载更有张力。
- 小心,Android木马工具SpyNote免费啦!远程监听就是这么简单
- R语言的kmeans客户细分模型聚类
- .NET的资源并不限于.resx文件,你可以采用任意存储形式[下篇]
- 量化投资教程:用R语言打造量化分析平台
- 也谈事件(Event)
- Zuul:构建高可用网关之多维度限流
- Hystrix:HystrixCollapser请求合并
- oauth2.0 实现spring cloud nosession
- 基于自定义向导的C++单元测试环境自动化配置
- 【spring cloud】自定义jwt实现spring cloud nosession
- R语言的三种聚类方法
- ArrayList foreach 循环里进行元素的 remove add 操作有什么现象?
- 10个令人相见恨晚的R语言包
- 小心Windows旧版认证暴露你的系统帐户密码
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- strpos() 函数判断字符串中是否包含某字符串的方法
- Laravel框架基于ajax和layer.js实现无刷新删除功能示例
- 详解php伪造Referer请求反盗链资源
- Laravel框架基于ajax实现二级联动功能示例
- django haystack实现全文检索的示例代码
- 基于Python下载网络图片方法汇总代码实例
- 基于pytorch中的Sequential用法说明
- pytorch VGG11识别cifar10数据集(训练+预测单张输入图片操作)
- tp5(thinkPHP5)框架数据库Db增删改查常见操作总结
- PHP基于cookie实现统计在线人数功能示例
- PHP实现对数字分隔加千分号的方法
- PHP验证类的封装与使用方法详解
- Laravel框架实现的rbac权限管理操作示例
- Laravel框架实现的批量删除功能示例
- PyTorch中model.zero_grad()和optimizer.zero_grad()用法