###########issue 0: db alert 有如下提示, thread 1 cannot allocatete new log, sequenec 1111

通过检查v$log ,发现10组日志,每组1G, 一个小时产生10G 日志,应该是够用的。

怀疑是没有提交的巨量事物导致这个报错:

检查
SELECT a.used_ublk
FROM v$transaction a, v$session b
WHERE a.addr = b.taddr

查看更新的进度:

select sql.sql_text sql_text,

t.USED_UREC Records,

t.USED_UBLK Blocks,

s.sid,

t.start_time,

(t.USED_UBLK * 8192 / 1024) KBytes  from v$transaction t, v$session s, v$sql sql  where t.addr = s.taddr  and s.sql_id = sql.sql_id  and s.username = '&USERNAME'  order by t.used_ublk desc;

USED_UREC 列显示所使用的undo记录数量
USED_UBLK 显示事务所占用的undo数据块数

更多USED_UREC 解释,见下文

http://www.cnblogs.com/feiyun8616/p/8052776.html

####issue 1 检查回滚的时间,使用alter system kill session 方法,观察方法如下:
pmon Monitor the Rollback progress ,after alter system kill session "pid,serial", the ospid is still exsist after kill

after kill , the ospid 14001 still exsit;
lsof -p 14001 can check process

Problem Description
-------------------

You did not commit your transactions and the session were accidentally
killed. Your transactions are rolling back and it is taking a long time.
Rollback started hours ago and is still in progress.

You want to know if there is any way to speed up the process such as using
cleanup_rollback_entries in the init.ora and then restarting the database.

You also want to know what will happen if you shutdown the database after 12
hours of rollback. Will the rollback pick up where it left off?

SQL> SELECT a.used_ublk
FROM v$transaction a, v$session b
WHERE a.addr = b.taddr AND b.sid = 206;

For example:

If used_ublk showed 29,900 12 hours ago and is now 22,900, it has
taken 12 hours to rollback 7,000 entries. It will take approximately
another 36 hours to complete depending on the types of transactions
that are rolling back.

SELECT USED_UBLK FROM V$TRANSACTION;

select ses.username,ses.sid,substr(ses.program, 1, 19) command,tra.used_ublk from v$session ses, v$transaction tra where ses.saddr = tra.ses_addr;

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;

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

set serveroutput on

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 < used_ublk1
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;

/db/aa/oradata对应的是不是这块盘 VxVM27001

Solution Description
--------------------
没有办法加快rollback 的速度。

There is no way to speed up the rollback process and there is no formula for
determining how long it will take to complete. It depends on what type of
undo the application has generated. Some undo may take little space in an
undo block, but may take awhile to apply.

You can look at used_ublk in V$transaction to estimate how long it is going
to take to complete the rollback.

SQL> SELECT a.used_ublk
FROM v$transaction a, v$session b
WHERE a.addr = b.taddr AND b.sid = <SID>;

For example:

If used_ublk showed 29,900 12 hours ago and is now 22,900, it has
taken 12 hours to rollback 7,000 entries. It will take approximately
another 36 hours to complete depending on the types of transactions
that are rolling back.

CLEANUP_ROLLBACK_ENTRIES determines how long SMON will be holding onto one
transaction's resources. It only affects recovery of transactions in the
background such as after an instance crash. It doesn't affect rollback
by the transaction itself.

Rollback will pick up where it left off if you do shutdown after 12 hours
of rollback.

Solution Explanation
--------------------

You can use V$transaction used_ublk to estimate how long the rollback is
going to take but there is no formula for this. If you shutdown the
database after rollback has started, it will begin where it left off.

For Oracle 9i and onwards ,check :
SQL> SELECT DISTINCT ktuxesiz
FROM x$ktuxe
WHERE ktuxecfl='DEAD';

########### 检查回滚的时间,kill -9 的方法杀进程,观察方法如下:
issue 2 smon Transaction recovery by SMON , the ospid is not exsist.

###monitor

SMON process takes over the recovery when

->Server process is dead / crashed. the ospid is not exsist.
->Instance itself is crashed

3. Speed up SMON transaction recovery
SMON transaction recovery can be controlled using the FAST_START_PARALLEL_ROLLBACK parameter

a. Parallel Transaction Recovery:

To enable Parallel recovery mode, set the parameter FAST_START_PARALLEL_ROLLBACK to LOW / HIGH.

ALTER SYSTEM SET FAST_START_PARALLEL_ROLLBACK = HIGH
OR
ALTER SYSTEM SET FAST_START_PARALLEL_ROLLBACK = LOW
b. If the parallel recovery is hanging, enable serial recovery:

To enable serial recovery mode, set the parameter FAST_START_PARALLEL_ROLLBACK to FALSE.

PS: The parameter FAST_START_PARALLEL_ROLLBACK will be effective only when SMON does the transaction recovery (generally after a instance crash).

Monitor the transaction recovery by SMON
select usn, state, undoblockstotal "Total", undoblocksdone "Done", undoblockstotal-undoblocksdone "ToDo", decode(cputime,0,'unknown',sysdate+(((undoblockstotal-undoblocksdone) / (undoblocksdone / cputime)) / 86400)) "Estimated time to complete" from v$fast_start_transactions;

USN STATE Total Done ToDo Estimated time to Complete

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

->none

####solution:

You may notice that UNDOBLOCKSDONE is not increasing or increases very slowly.

1、停止并行回滚,减少IO请求,快速提升系统响应能力
如果你没时间等待回滚进程完成回滚操作,可根据如下提示进行操作。
最后在google上根据ora_p001, wait for a undo record 的关键字,找到了一些信息,以下信息引起了我的注意:
Oracle工程师首先怀疑是临时表空间空间不足导致,经检查临时表空间没有空间不足的情况,仔细观察日志发现重做日志文件不断切换,分析应该是有较多的事务没有完成提交或者有较多没有提交的事务完成回滚。现在面临的问题是我们没有很多时间去等待所有的事务去完成回滚或提交。解决问题的思路就是如何尽快结束这些事务的回滚或提交。
1) 查看spfile文件中是否有fast_start_parallel_rollback参数的设置,检查结果G网数据库没有设置该参数。如果没有显式设置,则该参数的默认值为low。修改该参数值为false
  2) 将数据库启动到nomount状态:startup nomount
  3) 修改改参数值:alter system set fast_start_parallel_rollback = FALSE scope=spfile
  4) shutdown immediate关闭数据库
  5) startup启动
  6) 查看该参数是否生效:show parameter fast_start_parallel_rollback
  7) 等待一段时间
8) shutdown immediate数据库可以关闭
2、加快回滚速度
提高并行回滚进程的数量,设置为HIGH时回滚进程=4*cpu数。在sql命令行模式下执行
ALTER SYSTEM SET FAST_START_PARALLEL_ROLLBACK = HIGH

refer http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=116213&id=147411

#####issue 3:

set lines 200
set pagesize 2000
col name for a65
SELECT NAME,ASYNCH_IO FROM V$DATAFILE F,V$IOSTAT_FILE I
WHERE F.FILE#=I.FILE_NO
AND FILETYPE_NAME='Data File';

#####ISSUE 4:

##使用pl/sql developer  beatiful 功能 来 编辑  ,模仿 ,生成 如下语句,建议加入监控 。

SELECT TRIM(DBMS_LOB.SUBSTR(WM_CONCAT(DATAVAL))) VALUE
FROM (SELECT 'CNT=' || MAX(FLAG) AS DATAVAL
FROM (SELECT '0' FLAG
FROM (select sql.sql_text sql_text,
t.USED_UREC Records,
t.USED_UBLK Blocks,
t.start_time,
(t.USED_UBLK * 8192 / 1024) KBytes
from v$transaction t, v$session s, v$sql sql
where t.addr = s.taddr
and s.sql_id = sql.sql_id
and t.USED_UBLK > 100000) ---max undo > 800M
UNION ALL
SELECT '1' FLAG
FROM (select sql.sql_text sql_text,
t.USED_UREC Records,
t.USED_UBLK Blocks,
t.start_time,
(t.USED_UBLK * 8192 / 1024) KBytes
from v$transaction t, v$session s, v$sql sql
where t.addr = s.taddr
and s.sql_id = sql.sql_id
and t.USED_UBLK > 400000) --max unod > 3200M
UNION ALL
SELECT '2' FLAG
FROM (select sql.sql_text sql_text,
t.USED_UREC Records,
t.USED_UBLK Blocks,
t.start_time,
(t.USED_UBLK * 8192 / 1024) KBytes
from v$transaction t, v$session s, v$sql sql
where t.addr = s.taddr
and s.sql_id = sql.sql_id
and t.USED_UBLK > 800000)) --MAX UNDO > 6400M
UNION ALL
SELECT TRIM(DBMS_LOB.SUBSTR(WM_CONCAT(ABC))) DATAVAL
FROM (SELECT 'SQL_TEXT=' || SQL_TEXT || ':USERNAME=' || NAME ||
':Blocks=' || Blocks || ':Kbytes=' || KBytes|| ';please first contact application support or dba to check it' AS ABC
FROM (select sql.sql_text sql_text,
s.username name,
t.USED_UREC Records,
t.USED_UBLK Blocks,
t.start_time,
(t.USED_UBLK * 8192 / 1024) KBytes
from v$transaction t, v$session s, v$sql sql
where t.addr = s.taddr
and s.sql_id = sql.sql_id
order by t.used_ublk desc)));

转载于:https://www.cnblogs.com/feiyun8616/p/8039149.html

oracle rollback 观察时间相关推荐

  1. 修改oracle数据库默认时间格式

    oracle数据库默认的时间格式只能精确到天(DD-MON-RR),在实际工作环境中,开发程序通常需要取得精确到秒的时间值,经查询资料在oracle中修改时间值的方式大致可以分为以下几种: 1.临时修 ...

  2. oracle插入java时间,java向oracle中插入字符或时间型 时间数据

    /** * * @param date * @param bool true:插入时间类型,false:插入字符类型 * 向oracle中插入时间类型数据 * @return */ public st ...

  3. oracle-关于时间的sql

    oracle-关于时间的sql 以下内容来源:http://www.cnblogs.com/hl3292/archive/2010/11/03/1868159.html 转换的格式: 表示 year ...

  4. [原创]修改oracle 数据库默认时间格式

    突然想修改下oracle默认的时间格式,在论坛搜索了一大圈,尝试了很多答案,发现都是谬论,以下是oracle在linux环境下的解决方案. linux下通过修改spfile文件可以解决,跟环境变量 N ...

  5. oracle回滚事务的关键字,Oracle ROLLBACK语句(回滚事务)

    Oracle ROLLBACK语句(回滚事务) 在Oracle中,ROLLBACK语句可以用来撤销当前事务或有问题的事务.本教程就将教大家如何使用ROLLBACK语句. ROLLBACK语法 ROLL ...

  6. Oracle数据库更新时间的SQL语句

    ---Oracle数据库更新时间字段数据时的sql语句 ---格式化时间插入 update t_user u set u.name='pipi',u.modifytime=to_date('2015- ...

  7. MySql查询系统时间,SQLServer查询系统时间,Oracle查询系统时间

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. MySQL查询系统时间 第一种方法:select current_date: MySQL> s ...

  8. oracle 时间间隔,ORACLE JOB间隔时间参考

    关键字: oracle job 间隔时间 trunc 假设你的存储过程名为PROC_RAIN_JM 再写一个存储过程名为PROC_JOB_RAIN_JM 内容是: Create Or Replace  ...

  9. oracle不连续得时间如何分组,Oracle按不同时间分组统计的sql

    Oracle按不同时间分组统计的sql以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Oracle按不同时间分组统计的s ...

最新文章

  1. 2007年上半年 网络工程师 上下午试卷【附带答案】
  2. SAP转储单全面总结
  3. Python错误“ImportError: No module named MySQLdb”解决方法
  4. PYTORCH笔记 actor-critic (A2C)
  5. 明源云创CI/CD技术演进
  6. day10 Python 形参顺序
  7. configure: error: ZLib not installed
  8. eclipse(jee) 配置Tomcat
  9. mybatis plus关联查询_Mybatis 和 Hibernate 持久层框架之间的区别是啥?
  10. import MySQLdb UserWarning
  11. Swift中的willSet与didSet
  12. ConcurrentDictionary 与 Dictionary
  13. 遗传算法(Genetic Algorithm)原理详解和matlab代码解析实现及对应gaot工具箱实现代码
  14. 人人网首页登录页面html码,人人网的登录页面 - BryanYang的个人空间 - OSCHINA - 中文开源技术交流社区...
  15. elasticsearch,使用normalizer优化keyword字段的查询
  16. cad文字递增快捷键_CAD文字/表格递增复制怎么用,快捷键是什么?
  17. 34套Java项目教程+源码包含Java swing项目 Java web项目 Java控制台项目(视频教程+源码)
  18. php resque demo,php-resque 极简php消息队列
  19. 爬虫----爬虫基本原理
  20. 解决p标签自动换行文字两端不对齐问题

热门文章

  1. 今日讨论:时间紧,工作量太大,作为测试该怎么办?
  2. 学会这一招,轻松玩转 app 中混合应用自动化测试
  3. 在职测试多年整理了自己常用的Linux命令...
  4. D-S证据理论基本概念
  5. linux 内核编程 延时函数,linux中内核延时编程
  6. 如何从文件名字符串中获取文件扩展名_Linux操作系统:文件系统的功能和命名...
  7. 计算机组成原理尾数的求法,计算机组成原理第八讲(运算办法).ppt
  8. oracle如何增加磁盘,牛刀小试Oracle之ORACLE 11GR2 RAC安装配置-asm磁盘组配置添加(四)...
  9. java 斗地主_java 斗地主
  10. Farthest sampling on 3d mesh with mesh kept