巧用闪回查询来分析事务延迟的问题

   前段时间有个开发的同事向我咨询一个问题,
    开发同事:Oracle会存在一个用户插入数据,已经提交了;但是另外一个用户还查询不到吗?都是同一张表
    jeanron:   不会的。
    开发同事: 我们现在一个用户写入,程序日志是说已经写入;可是读取的用户还读取不到,在线延迟5分钟可能的问题在哪儿?或者你帮忙监控一下?
    jeanron:   是Oracle吗,MySQL还可能有这种情况
    开发同事: Oracle,MySQL是什么情况下会这样?
    jeanron:  MySQL,主库写,从库查,可能会有这种延迟

   后续和他们确认了下,是Oracle环境,而且都是在主库端查询,而且是同一个表。这种情况听起来着实有点意思,当然我们知道多版本查询是Oracle的一个亮点,也是作为MVCC的一个必备特征。如果这个都不能保证,数据就会乱套了。
    但是目前数据库中的数据根据开发同学的反馈确实有这种情况,这一点就让很有意思了。当然他们说感觉延迟,我希望能够让他们也帮忙具体定位一下,比如提供一条数据记录,他们从前端的日志中发现有延迟的这种情况,我在数据库端就容易来定位问题了。
没过多久,开发同学就提供了一个语句,他们使用rowid定位到了那条记录,这个对我来说就方便多了。
语句类似下面的样子:
select count(*)from heart   where rowid='AAASdNAAHAAMgirABN'
   他们反馈根据数据的情况,说这条记录是在2016-07-14 16:40:00 这个时间点插入的,但是有很大的延迟,一直查不到数据。
这个时候使用Oracle的闪回查询就是一个很好的实践。首先确保根据rowid能够定位到数据。
select count(*)from heart   where rowid='AAASdNAAHAAMgirABN'
1
    然后延迟5秒钟看看是否能够看到数据,结果奇怪的是没有找到匹配的数据
select count(*)from heart  as of timestamp to_timestamp('2016-07-14 16:40:05','yyyy-mm-dd hh24:mi:ss') where rowid='AAASdNAAHAAMgirABN'
0
    然后我逐步放大实践延迟,一直放大到延迟6分钟,还是没有找到匹配的数据。
select count(*)from heart  as of timestamp to_timestamp('2016-07-14 16:46:00','yyyy-mm-dd hh24:mi:ss') where rowid='AAASdNAAHAAMgirABN'
0
    继续放大延迟间隔,终于看到了匹配的记录。
select count(*)from heart  as of timestamp to_timestamp('2016-07-14 16:47:00','yyyy-mm-dd hh24:mi:ss') where rowid='AAASdNAAHAAMgirABN'
1
    从这个简单的测试来看,这个数据是在2016-07-14 16:40:00插入的,可以从表里的数据看出,表里有一个字段会做标示,但是数据在一个事务内一直未提交,所以其他的用户查询的时候会始终查到的是未提交状态的数据,而数据是在16:46:00~16:47:00这个时间段提交的,而具体的时间戳已经不重要了,因为已经说明了问题。
    可以基本断定是在应用端存在一个大事务,迟迟未提交,导致数据的状态一直没有得到更新,确认了这点,应用端就很好去分析和处理了。

本页内容版权归属为原作者,如有侵犯您的权益,请通知我们删除。
【故障处理】 ORA-19809 错误处理 1    BLOG 文档结构图       2    前言部分 2.1    导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~ : ① ORA-19809: limit exceeded for recovery files 错误的处理方法 RMAN-03009: failure of backup command on ORA_DISK_1 channel at 07/26/2016 17

手工搭建Data Guard - 2016-08-03 17:08:05

Data Guard的搭建可以使用GC图形化安装,优缺点很明显,优点就是图形化操作,符合国人的习惯(据secooler介绍外国程序员能用图形化做的事就一定用图形做,因为boss看得懂,和国人正相反。。。),缺点就是如同Windows一样,宛如黑盒,换句话说,要时刻祈祷不要出问题,否则有时很难知道他为什么挂了。。。 Data Guard还可以使用命令行操作,正如各位所知,图形化的任何操作背后,其实都是使用的命令。OCM第七场景考试中,我也是纠结了许久,临开始前才决定使用手工方式创建DG,怕的就是图形安装的不

mysql分区技术测试 - 2016-07-25 19:07:38

mysql是否支持partition呢,在mysql下执行show plugins;(显示插件) 其中包含了partition字段就说明你的数据库支持分区技术 1,创建带有分区的表 表明创建了带有hash分区技术的表,t2表有5个分区 mysql支持的几种分区技术,最常用的是range和list二种,Hash主要用来测试 看到test中有12张t2表,每个分区表都有表索引,检索数据更快。 把t2表创建索引 create index in_id on t2(id); 2、现在我们插入一个一千万行的数据来测试

Oracle 学习笔记 - 2016-07-25 18:07:03

1,oracle安装包下载: 官网地址:http://www.oracle.com/technetwork/indexes/downloads/index.html#database 2,安装: 在oracle官网下载安装包,以oracle 11g为例,下载下来有两个压缩包,分别是win32_11gR2_database_1of2和win32_11gR2_database_2of2,把它俩解压到同一个文件夹下,注意路径中不能出现中文符号。 3.然后双击可执行文件【setup.exe】,如图所示: 4.双击
1. Oracle11g安装 http://pan.baidu.com/s/1gfa3e63 ; 这里是我在Oracle官网下载好了Windows系统64位的安装包,有2个zip文件。不想去官网找下载地址的童鞋可以直接用这个百度云盘的下载链接。 1.去 www.oracle.com 下载最新的oracle11g安装包的压缩文件,有2个压缩文件,都需要下载,下载完成以后需要解压缩在同一个目录下。 在开始oracle数据安装之前建议 : 1.关闭本机的病毒防火墙。 2.断开互联网。 这样可以避免解压缩丢失文件

HBASE RPC 详细解析 - 2016-07-25 18:07:33

HBASE RPC 详细解析  注:下面的图是作者随便画的,不怎么严格,大家能看懂就好。 由于篇幅所限,本文只是大略的讲解了一下RPC所涉及到的大概模块,较为模糊,有兴趣者可以继续深挖 RPC (远程过程调用协议) 是不同主机进程间通讯的一种方式,协议采用客户机 - 服务器模式的架构,请求程序为客户机,服务提供程序为服务器, hbase 在 client 与 server 通信上采用的也是 RPC 协议,并在 client 端与 server 端实现了具体的 RPC 协议内容 ,现在我们就从客户机,服务器

mysql入门的十条语句 - 2016-07-25 17:07:06

默认已经装好了mysql服务器,下来介绍一些入门的基本语句。 一、连接数据库所需要的工具   mysql是一种服务器,帮助我们对数据进行管理,是一个服务器端。我们要与mysql服务器进行交互,必须通过客户端。常见的客户端mysql_front,navcat,mysql自带的命令行客户端。现在我们使用windows自带的命令行与mysql服务器进行交互。当然首先要与mysql服务器进行连接。 打开命令行,进入到mysql里面。 系统会报错 ,这是因为没有与mysql服务器进行连接。 1、那么如何连接服务器呢

mysql的分区技术 - 2016-07-25 14:07:48

mysql是否支持partition呢,在mysql下执行show plugins;(显示插件) 其中包含了partition字段就说明你的数据库支持分区技术 1,创建带有分区的表 表明创建了带有hash分区技术的表,t2表有5个分区 mysql支持的几种分区技术,最常用的是range和list二种,Hash主要用来测试 看到test中有12张t2表,每个分区表都有表索引,检索数据更快。 把t2表创建索引 create index in_id on t2(id); 2、现在我们插入一个一千万行的数据来测试

0722 sql 语句那些事 - 2016-07-25 14:07:43

     刚接触这个项目的时候,还记得同事拿着一堆sql拼接和嵌套的代码,来问我们。当时感觉真的好麻烦,好复杂。以前用的sql都是简单的增删该查,后来ITOO中也是封装好的,所以就懒了。但是现在又遇到这个问题啦,这几天我负责的是手机端的考勤统计部分,所以用到了大量的纯sql查询语句。又将以前的知识好好学习了一下,总结一下。      这是用slqsever建立的两张表,下面几个例子都将以A、B两表为基础,介绍几种常用的连接。     一、左连接 span select * from A left join

主流NoSQL技术详解与比较 - 2016-07-24 19:07:00

主流NoSQL分类 1键值(Key-Value)存储数据库 键值对NoSQL是比较流行的一种NoSQL的解决方案,特点就是采用键值对来存储数据,它的优势在于容易部署和简单性,但是如果查询的部分只是整个数据库的小部分,那性能并不是特别突出。 2列存储数据库 列存储NoSQL比较适合的场景是处理海量的分布式存储的数据,它的主键可能是指向多个列的,数据量增加的时候几乎不影响性能。 3文档型数据库 文档数据库是采用类似键值对的方式进行存储,更准确的说是采用的JSON的格式进行存储,可以嵌套键值对,文档数据库比键值