首页 > Oracle > oracle死事务处理

oracle死事务处理

曾遇到两次死事务的问题,都是同事对一张大表清理时,PC机异常掉电,系统自动回滚造成的。smon会对死事务清理,会产生大量enq:TX锁等待,业务基本处理HANG的状态
一般说来DBA没有什么办法,只能乖乖的等着smon清理完,可业务等不急,如此下来一堆人围着你心情非常不爽。[@more@]1、如何查看是否有死事务?还有多少个块需要恢复?

用sys用户执行如下SQL:

SELECT KTUXEUSN ROLLBACK_SEGS_NUM,
KTUXESIZ UNDO_BLOCKS,
KTUXESLT,
KTUXESQN, /* Transaction ID */
KTUXESTA STATUS,
KTUXECFL FLAGS
FROM SYS.X$KTUXE
WHERE KTUXECFL = ‘DEAD’;

2、如何算一下需要多少时间恢复完?
可以看一下eygle的文章:http://www.eygle.com/archives/2007/09/smon_rollback_dead_transaction.html

3、事务对象查询

SQL> SELECT KTUXEUSN ROLLBACK_SEGS_NUM,
2 KTUXESIZ UNDO_BLOCKS,
3 KTUXESLT,
4 KTUXESQN, /* Transaction ID */
5 KTUXESTA STATUS,
6 KTUXERDBF FILE_ID,
7 KTUXERDBB BLOCK_ID
8 FROM SYS.X$KTUXE
9 WHERE KTUXECFL = ‘DEAD’;
ROLLBACK_SEGS_NUM UNDO_BLOCKS KTUXESLT KTUXESQN STATUS FILE_ID BLOCK_ID
—————– ———– ———- ———- ——- ——– ———-
149 1 5 19473789 ACTIVE 417 361541


SQL>alter system dump datafile 417 block 361541;

查看相应.trc文件,关注如下部分:

*—————————–
* Rec #0x1 slt: 0x13 objn: 1374656(0x0014f9c0) objd: 1374656 tblspc: 45(0x0000002d)
* Layer: 10 (Index) opc: 21 rci 0x00
Undo type: Regular undo Last buffer split: No
Temp Object: No
Tablespace Undo: No
rdba: 0x68458442
*—————————–

然后查找相应对象:

SQL> SELECT OWNER,
2 OBJECT_NAME,
3 SUBOBJECT_NAME,
4 OBJECT_ID,
5 DATA_OBJECT_ID,
6 OBJECT_TYPE
7 FROM DBA_OBJECTS
8 WHERE OBJECT_ID = 1374656
9 /
OWNER OBJECT_NAME SUBOBJECT_NAME OBJECT_ID DATA_OBJECT_ID OBJECT_TYPE
————– ————————— —————- ———- ————– —————
UIF_CRM4_STA4 IDX_TS_S_TRADE_DAY_STAFF_1 P_5 1374656 1374656 INDEX PARTITION

4、碰到这样的问题理想的处理方式是什么?

应用或业务人员在业务、程序流程中把相应的表给跳过去;如果能停业务及重启库的话那样更好,没有业务情形下SMON清理速度是超快的。

5、并行回滚与串行回滚的选择

有人说并行快,有人说串行快,其实不用争,改一下参数观察一下就明了了

改成串行的:

alter system set fast_start_parallel_rollback=false;

改成并行的:

alter system set fast_start_parallel_rollback=HIGH;

其默认值是:LOW

6、设置_cleanup_rollback_entries参数可以加快回滚速度。

_cleanup_rollback_entries设成400可以加快回滚速度,不过此参数是静态的,需重启才能生效。

SQL>alter system set “_cleanup_rollback_entries”=400 scope=spfile;

重启后看回滚速度情况
用完恢复原值:

SQL>alter system reset “_cleanup_rollback_entries” scope=spfile;

7、_smu_debug_mode参数

设置_smu_debug_mode参数为1024可以阻止SMON对死事务进行回滚,可以有效降低回滚对数据库的影响,以便在系统清闲时再进行死事务回滚。

SQL>alter system set “smu_debug_mode”=1024;

恢复原值:

SQL>alter system set “smu_debug_mode”=0;

8、10513事件

也可以用10513暂时关闭smon的事务清理。

关闭smon清理:

SQL> oradebug setorapid
SQL> oradebug event 10513 trace name context forever, level 2

打开smon清理:

SQL> oradebug setorapid
SQL> oradebug event 10513 trace name context off

需要说明的是命令可能会hang,原因在于你敲入命令的瞬间smon可能正在工作,control+c掉,多试几次就成功了.

9、其它
需关注一下UNDO表空间的利用率。

分类: Oracle 标签: ,
  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.