由一个案例引出SMON的一个功能: Recover Dead transaction

2024-04-04 01:48

本文主要是介绍由一个案例引出SMON的一个功能: Recover Dead transaction,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


  

一.故障说明

 

前段时间一朋友遇到的案例,根据他的描述,我小整理了一下。

 

数据库环境:AIX + ORACLE 10.2.0.5, 单机。

 

朋友说一个大事务不能完成回滚操作,系统异常。 查看等待事件,如下图:

 

 

这里的row cache lock 较为严重。 row cache lock 对应的cache#=11,对应的child latch是dc_object_ids。

 

如何获取这个child latch可以参考如下blog:

latch row cache objects 等待事件及 child latch对象 说明

http://www.cndba.cn/Dave/article/1550

 

Trace 文件出现大量的: waitfor stopper event to be increased。

 

 

这个wait forstopper event to be increased的等待事件是SMON进程的event,也就是说我们的SMON 进程在这个时候出现了异常。

 

    SMON 进程有一个非常重要的功能,就是Recover Dead transaction。

 

使用如下SQL 查看了一下Recover的进度:

SELECT usn,

       state,

      undoblockstotal "Total",

      undoblocksdone "Done",

      undoblockstotal -undoblocksdone "ToDo",

       DECODE(

         cputime,

          0, 'unknown',

            SYSDATE

          +(  (  (undoblockstotal-undoblocksdone)

               / (undoblocksdone/cputime))

             /86400))

          "Estimatedtime to complete"

  FROMv$fast_start_transactions;

 

返回结果如下:

 

粗略的看一下,需要5个月的时间。 开了一个国际玩笑。

 

刚拿到数据,以为是如下文档里说的现象:

Database Appearsto Hang Waits for "Wait for a undo record" and "Wait for stopperevent to be increased" Due to Parallel Transaction Recover [ID 464246.1]

 

MOS的现象有3种:

1)  Database appears to hang

2)  Undo tablespace is growing.

3)  Systemstate dump shows thesignificant waits are for "Wait for a undo record" and "Wait forstopper event to be increased".

 

和朋友确认了一下,数据库没有hang住,UNDO 表空间分配了96G,使用了86%。也正常。所以排除了这个方法。

 

在[ID 464246.1]中,MOS提供的解决方法是:

fast_start_parallel_rollback= false

 

参考如下MOS文档:

Database Hangs Because SMON Is Taking 100% CPUDoing Transaction Recovery [ID 414242.1]

 

    设置fast_start_parallel_rollback参数来提高SMON 进程进行回滚的并行度。将该参数设置为false那么并行回滚将被禁用,若设置为Low(默认值)那么会以2*CPU_COUNT数目的并行度回滚,当设置为High则4*CPU_COUNT数目的回滚进程将参与进来。

 

尝试设置fast_start_parallel_rollback=High,提高SMON的回滚速度,测试的实际结果是没有变化。

 

后来Oracle 原厂说是bug:

Bug 11693365 - Concurrent Droptable and Select on Reference constraint table hangs (deadlock) [ID 11693365.8]

 

该bug的现象:

1)  Deadlock

2)  Hang(Process Hang)

3)  Waits for "library cachelock"

4)  Waits for "row cachelock"

5)  Stack is likely to includedtbdrp

 

该bug的解决方案是:

Disable and drop all the referentialintegrity constraints before dropping the child table.

 eg:

 alter table <child_table_name> disable constraint<constraint_name>;

 alter table <child_table_name> drop constraint<constraint_name>;

 drop table <child_table_name> cascade constraints purge;

 

实际上这个方案在朋友这不可取,所以Oracle 最后建议将数据库升级到11.2.0.3。 这个方案同样也不可取。因为这个变动太大了。

 

朋友的这个环境太复杂了,出现问题的表是一张簇表,表中有5亿的数据,又使用了同义词,关联太多。 这个表是一年前系统从9i升级到10g时迁移过来的。 测试的时候导过一次,后来drop掉了,又正式迁移了一次。

出现问题的时候,这个系统灵异的访问了原来在回收站里的表,这个也是后来通过10046 跟踪出来。最终他们的解决方案是把回收站里的表恢复出来,然后重新创建了同义词,系统就回复正常了。

 

    没有参与整个过程,因此无法具体描述,也是后来听朋友说起整个处理过程,了解了一个大概过程。 

 

通过这个案例引出我们SMON的一个重要功能:Recover Dead transaction。

 

 

二.SMON 的功能:Recover Dead transaction

 

2.1 Recover Dead transaction 说明

服务进程在提交事务(commit)前意外终止的话会形成死事务(dead transaction),PMON进程负责轮询Oracle进程,找出这类意外终止的死进程(dead process),通知SMON将与该dead process相关的dead transaction回滚清理,并且PMON还负责恢复dead process原本持有的锁和latch。

 

因此当我们kill掉一个正在运行的大事务,不管是用kill session(或者shutdown abort),数据库都可能被hang住,或者SMON进程会占用所有可用的CPU资源,用来roll back 中断的大事务,因为事务很大,可能会消耗大量的资源,从而影响数据库的性能。

 

这个时候不建议关闭数据库,因为这个时候执行shutdown immediate,也可能会hang住,所以最终只能用abort的方式来关闭数据库。这样不会降低SMON进程完成rollback的进度,反而会让情况更糟。

 

 

当SMON 进程执行rollback时,我们可以能在alert log里看到如下信息:

 

Waiting for smon to disable tx recovery

 

SMON: about to recover undo segment 12
SMON: mark undo segment 12 as available
SMON: about to recover undo segment 12
*** 2009-11-12 10:08:11.389
SMON: mark undo segment 12 as available

 

 

可以使用如下SQL 查看SMON进程处理事务recovery的进度:

 

SET LINESIZE 100

ALTER SESSIONSETNLS_DATE_FORMAT='DD-MON-YYYYHH24:MI:SS';

 

SELECT usn,

       state,

      undoblockstotal "Total",

      undoblocksdone "Done",

      undoblockstotal - undoblocksdone"ToDo",

       DECODE(

         cputime,

          0, 'unknown',

            SYSDATE

          +(  (  (undoblockstotal-undoblocksdone)

               / (undoblocksdone/cputime))

             /86400))

          "Estimatedtime to complete"

  FROMv$fast_start_transactions;

 

 

在有些版本里,cputime 参数值不正常,一直为0,因此不能估算进度。

 

 

在某些案例中,v$fast_start_transactions视图也不能正常显示,不过还可以查询oracle 内部的数据字典:x$ktuxe。 该字典代表rollback 需要剩余的undo blocks的数量。

 

SELECT ktuxeusn,

       TO_CHAR(SYSDATE,'DD-MON-YYYYHH24:MI:SS') "Time",

      ktuxesiz,

      ktuxesta

  FROMx$ktuxe

 WHEREktuxecfl = 'DEAD';

 

2.2 FAST_START_PARALLEL_ROLLBACK 参数说明

 

fast_start_parallel_rollback参数可以提高SMON 进程进行回滚的并行度。将该参数设置为false那么并行回滚将被禁用,若设置为Low(默认值)那么会以2*CPU_COUNT数目的并行度回滚,当设置为High则4*CPU_COUNT数目的回滚进程将参与进来。

 

 

官网的说明如下:

FAST_START_PARALLEL_ROLLBACK specifies thedegree of parallelism used when recovering terminated transactions.

Terminated transactions are transactionsthat are active before a system failure. If a system fails when there areuncommitted parallel DML or DDL transactions,thenyou can speed up transaction recovery during startup byusing this parameter.

 

Values:

FALSE: Parallelrollback is disabled

LOW: Limitsthe maximum degree of parallelism to 2 * CPU_COUNT

HIGH: Limitsthe maximum degree of parallelism to 4 * CPU_COUNT

 

Note:

If you change the value of this parameter, thentransaction recovery will be stopped andrestarted with the new implied degree of parallelism.

 

关于该参数具体的使用案例可以参考惜分飞的blog

FAST_START_PARALLEL_ROLLBACK与回滚恢复

http://www.xifenfei.com/2534.html

 

 

当fast_start_parallel_rollback= Low/High,即启用并行回滚时,可能会出现并行进程因为各种资源互相阻塞导致回滚工作停滞,如果遇到这种情况,可以将该参数设置为FALSE。一般可以保证恢复工作以串行形式在较长时间内完成。

 

 

 

 

 

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

版权所有,文章允许转载,但必须以链接方式注明源地址,否则追究法律责任!

QQ:492913789

Email:ahdba@qq.com

Blog:  http://www.cndba.cn/dave

Weibo:    http://weibo.com/tianlesoftware

Twitter:  http://twitter.com/tianlesoftware

Facebook: http://www.facebook.com/tianlesoftware

Linkedin: http://cn.linkedin.com/in/tianlesoftware

这篇关于由一个案例引出SMON的一个功能: Recover Dead transaction的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/874509

相关文章

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

让树莓派智能语音助手实现定时提醒功能

最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束对话,这样一来,chatbot定时提醒的触发就不会被语音助手获悉。那怎么让语音助手也具有定时提醒功能呢? 我最后选择的方法是用threading.Time

【区块链 + 人才服务】可信教育区块链治理系统 | FISCO BCOS应用案例

伴随着区块链技术的不断完善,其在教育信息化中的应用也在持续发展。利用区块链数据共识、不可篡改的特性, 将与教育相关的数据要素在区块链上进行存证确权,在确保数据可信的前提下,促进教育的公平、透明、开放,为教育教学质量提升赋能,实现教育数据的安全共享、高等教育体系的智慧治理。 可信教育区块链治理系统的顶层治理架构由教育部、高校、企业、学生等多方角色共同参与建设、维护,支撑教育资源共享、教学质量评估、

客户案例:安全海外中继助力知名家电企业化解海外通邮困境

1、客户背景 广东格兰仕集团有限公司(以下简称“格兰仕”),成立于1978年,是中国家电行业的领军企业之一。作为全球最大的微波炉生产基地,格兰仕拥有多项国际领先的家电制造技术,连续多年位列中国家电出口前列。格兰仕不仅注重业务的全球拓展,更重视业务流程的高效与顺畅,以确保在国际舞台上的竞争力。 2、需求痛点 随着格兰仕全球化战略的深入实施,其海外业务快速增长,电子邮件成为了关键的沟通工具。

【区块链 + 人才服务】区块链集成开发平台 | FISCO BCOS应用案例

随着区块链技术的快速发展,越来越多的企业开始将其应用于实际业务中。然而,区块链技术的专业性使得其集成开发成为一项挑战。针对此,广东中创智慧科技有限公司基于国产开源联盟链 FISCO BCOS 推出了区块链集成开发平台。该平台基于区块链技术,提供一套全面的区块链开发工具和开发环境,支持开发者快速开发和部署区块链应用。此外,该平台还可以提供一套全面的区块链开发教程和文档,帮助开发者快速上手区块链开发。

Spring框架5 - 容器的扩展功能 (ApplicationContext)

private static ApplicationContext applicationContext;static {applicationContext = new ClassPathXmlApplicationContext("bean.xml");} BeanFactory的功能扩展类ApplicationContext进行深度的分析。ApplicationConext与 BeanF

JavaFX应用更新检测功能(在线自动更新方案)

JavaFX开发的桌面应用属于C端,一般来说需要版本检测和自动更新功能,这里记录一下一种版本检测和自动更新的方法。 1. 整体方案 JavaFX.应用版本检测、自动更新主要涉及一下步骤: 读取本地应用版本拉取远程版本并比较两个版本如果需要升级,那么拉取更新历史弹出升级控制窗口用户选择升级时,拉取升级包解压,重启应用用户选择忽略时,本地版本标志为忽略版本用户选择取消时,隐藏升级控制窗口 2.