首先,我是做BI的,在工作中偶尔会出现一些特殊情况,比如突然在某天ETL日增量调度的时候一个简单的插入操作卡住不动几小时都过不去,平时可能30分钟左右。

可能是资源征用导致DataStage资源分配不均等各种原因,这个时候通常会有运维的同事协助中断此作业的运行,进行重新插入。

中断后就要开始漫长的等待,等全部rollback后进行rerun这个JOB。

而这时候业务用户就不爽了,为什么都9点了我还看不了报表数据? 通常情况我们会先各种赔礼道歉然后给一个大概的时间点安抚用户,

等待时间基本就是回滚时间 + 重新插数时间,插数时间可以从调度日志中获取历史平均值,而回滚时间就难以获取,这里给大家普及一个查看事物回滚时间的知识点

这里我们不详细讲解DB异常关闭的SMON事务回滚,大概说下:

基本分3种方式:

1. 查询视图V$FAST_START_TRANSACTIONS中字段UNDOBLOCKSDONE,UNDOBLOCKSTOTAL估算smon恢复进度

2. 跟踪日志

3. 查询内部试图x$ktuxe [k]ernel layer [t]ransaction layer [u]ndo transaction [e]ntry

这里主要说下一个insert、delete、update等语句的rollback时间估算

建个测试表create table table_chenxu as select * from dba_objects

插入大量数据begin

for i in 1..100

loop

insert into table_chenxu

select * from dba_objects;

commit;

end loop;

end;

首先第一步我们要拿到正在回滚的SQL的SQLID和SESSIONID,这个简单,假如我们对table_chenxu进行delete,回滚过程中这个table_chenxu必定是被锁的,所以我们可以根据gv$locked_object来查看当前对象是否被锁,且根据sid查看锁表的SQL

我们先update下这个表

update table_chenxu t set t.owner = 'azzo';

然后查询被锁的相关信息:

注:多个系统视图关联查询的时候为了防止试图合并可以加上use_hash或者no_merge

点击(此处)折叠或打开select /*+ use_hash(o,s,t,q)*/

t.object_name, o.session_id, s.sql_id, q.sql_text, s.*

from gv$locked_object o, dba_objects t, gv$session s, gv$sql q

where t.object_id = o.object_id

and o.session_id = s.sid

and s.sql_id = q.sql_id

and t.object_name = 'TABLE_CHENXU'

结果如下:

我是PC机,update用了628秒,现在rollback(plsql developer死了。。于是重新开一个):

使用如下SQL查看ktuxesiz字段,过一段时间(如10s)再执行一次,再看一下,两个结果相减除以10就是每秒回滚的速度select

s.username,

t.xidusn,

t.xidslot,

t.xidsqn,

x.ktuxesiz

from

sys.x$ktuxe x,

sys.v_$transaction t,

sys.v_$session s

where

x.inst_id = userenv('Instance') and

x.ktuxesta = 'ACTIVE' and

x.ktuxesiz > 1 and

t.xidusn = x.ktuxeusn and

t.xidslot = x.ktuxeslt and

t.xidsqn = x.ktuxesqn and

s.saddr = t.ses_addr;

或者使用自动化脚本(取自网络)declare

cursor tx is

select

s.username,

t.xidusn,

t.xidslot,

t.xidsqn,

x.ktuxesiz

from

sys.x$ktuxe x,

sys.v_$transaction t,

sys.v_$session s

where

x.inst_id = userenv('Instance') and

x.ktuxesta = 'ACTIVE' and

x.ktuxesiz > 1 and

t.xidusn = x.ktuxeusn and

t.xidslot = x.ktuxeslt and

t.xidsqn = x.ktuxesqn and

s.saddr = t.ses_addr;

user_name varchar2(30);

xid_usn number;

xid_slot number;

xid_sqn number;

used_ublk1 number;

used_ublk2 number;

begin

open tx;

loop

fetch tx into user_name, xid_usn, xid_slot, xid_sqn, used_ublk1;

exit when tx%notfound;

if tx%rowcount = 1

then

sys.dbms_lock.sleep(10);

end if;

select

sum(ktuxesiz)

into

used_ublk2

from

sys.x$ktuxe

where

inst_id = userenv('Instance') and

ktuxeusn = xid_usn and

ktuxeslt = xid_slot and

ktuxesqn = xid_sqn and

ktuxesta = 'ACTIVE';

if used_ublk2

then

sys.dbms_output.put_line(

user_name ||

'''s transaction ' ||

xid_usn || '.' ||

xid_slot || '.' ||

xid_sqn ||

' will finish rolling back at approximately ' ||

to_char(

sysdate + used_ublk2 / (used_ublk1 - used_ublk2) / 6 / 60 / 24,

'HH24:MI:SS DD-MON-YYYY'

)

);

end if;

end loop;

if user_name is null

then

sys.dbms_output.put_line('No transactions appear to be rolling back.');

end if;

end;

结果如下:

SCOTT's transaction 8.19.1171 will finish rolling back at approximately 19:47:57 07-9月 -2015

是不是很方便~  不过自动化脚本需要有dba权限哦,sys.dbms_lock.sleep(10)这个包,普通用户是没权限以调用的,如果没有dba权限就掐表计时吧

直到写完这篇文章,我的plsql还在未响应中。。。

oracle按照时间点回退,【Oracle】查看事务回滚的时间相关推荐

  1. oracle计算回滚时间,事务回滚时间估算

    事务回滚时间估算 1. 当Oracle处于open 状态,当Oracle回滚事务的时候,可以从used_urec,used_ublk数值可以初步估计Oracle回滚事务 的速度. SQL> se ...

  2. PostgreSQL的clog—从事务回滚速度谈起

    如果是之前学习别的数据库的人,看PostgreSQL会感觉到有句话非常奇怪:"PostgreSQL的回滚是立即完成的,不会受到事务大小本身的影响". 奇怪在哪里呢?比方我曾经遇到过 ...

  3. sql server 事务_如何使用显式SQL Server事务回滚

    sql server 事务 In this article, we will explore the process of rollback an explicit SQL Server transa ...

  4. 事务回滚什么意思 try_三问Spring事务:解决什么问题?如何解决?存在什么问题?...

    1. 解决什么问题 让我们先从事务说起,"什么是事务?我们为什么需要事务?".事务是一组无法被分割的操作,要么所有操作全部成功,要么全部失败.我们在开发中需要通过事务将一些操作组成 ...

  5. MySQL的rollback--大事务回滚

    经常会遇到操作一张大表,发现操作时间过长或影响在线业务,想要回退大表操作的场景.在停止大表操作之后,等待回滚是一个很漫长的过程,尽管可能对知道一些缩短时间的方法,处于对生产环境数据完整性的敬畏,也会选 ...

  6. java pg数据库事务回滚,基于Postgresql 事务的提交与回滚解析

    用过oracle或mysql的人都知道在sqlplus或mysql中,做一个dml语句,如果发现做错了,还可以rollback;掉,但在PostgreSQL的psql中,如果执行一个dml,没有先运行 ...

  7. Hibernate(1)Hibernate简介和简单示例,了解Hibernate事务回滚用法

    1 Hibernate简介 Hibernate是一个orm(object relation mapping 对象关系映射)框架,处于项目的持久层,也叫持久层框架(持久层框架还有ojb等). Hiber ...

  8. C#使用SqlTransaction事务回滚与SqlBulkCopy批量插入数据

    C#中批量处理数据,有时候因为一条记录导致整个批量处理失败.这时候肯能会导致数据不全等问题,这时候我们可以使用SqlTransaction来进行事务回滚,即是要么全部成功要么全部不成功.如下代码 // ...

  9. java中的事务回滚_Spring中的事务回滚机制

    问题:在Java项目汇中,添加@Transactional注解,报错之后,事务回滚未生效,数据仍插入数据库中.经查看报错位置位于新增成功之后.空指针异常. 一.特性 先了解一下@Transaction ...

最新文章

  1. Numpy和Pandas的区别
  2. DBA基础(一)用户授权
  3. Flask框架(SQLAlchemy(python3版本)中添加数据 )
  4. 欠条和借条傻傻分不清?小心借出的钱要不回!
  5. Linux下通过jstat命令查看jvm的GC情况
  6. 分类信息采集发布采集器软件
  7. C++中两个栈实现一个队列
  8. 在centos里面安装配置caddy
  9. 快门光圈感光度口诀_基础教程之单反设置篇:60秒让你设置好快门光圈以及感光度...
  10. 一文了解滴滴与蚂蚁金服开源共建的SQLFlow
  11. 用计算机程序计算兴利库容,闸坝多目标泄流估算方法及系统与流程
  12. 怎么屏蔽百度搜索时的百度热榜?
  13. 基于VC++的七参数转换实现
  14. Day01 每日英语
  15. 记一次任意用户密码重置漏洞(session覆盖)
  16. php 搜索引擎包含哪些技术,浅谈三大搜索引擎爬虫性感 B-G-B
  17. Java+Swing+mysql5实现超市商品管理系统
  18. 比我聪明漂亮还比我努力的人,告诉我10个tips
  19. 程序员用 Python 分析中国演员排名,票房最高的是意料之中的他
  20. 运维小白和网站安全扫描的那点事儿

热门文章

  1. ​JavaScript 开发人员的主要基本技能是?
  2. TMD 之后,再无 BAT? | 畅言
  3. 如何在 JavaScript 面试中过五关斩六将?
  4. HTTP/1 已死!
  5. 背靠 Google 的 Go 语言,就不会失败?
  6. 观看直播 | IoT in Action 微软深圳物联网大会开幕在即,精彩不打烊
  7. 被罚 50 亿美元,Android 究竟招谁惹谁了?
  8. “头脑王者”爆红被封,微信小程序迎来蛮荒期
  9. 如何避免可怕的中年危机?看完这篇彻底明白了
  10. 图论算法 最短路程_图论与图学习(二):图算法