在早期Oracle版本中,由于技术不成熟等原因,数据库锁定和僵死状态还是时有发生的。对待这些问题,老先生们的处理策略无外乎是“重启”和“考究”两种策略。所谓“重启”,通过强制的重启服务器或者数据库,将软硬件偶然出现的锁定僵死状态重置,是一种最简单的处理办法。但是,如果是应用程序层面潜在的缺陷、数据库的Bug或者诸如大规模事务回滚的情况,重启大法的作用是很有限的。况且,一些关键业务系统,重启数据库是需要很高级别的审批流程的。这个时候,就需要进行“考究”,仔细研究故障点进行精准分析。

“考究”的过程是非常复杂的。传统方法是将数据库内存状态全部dump到Trace文件中,从其中观察到各个进程之间复杂的交互关系,最后定位到数据库锁定的原因。

由于Oracle的负责性,Trace文本文件通常成千上万行,进行读取也是非常消耗精力的事情。数据库故障在任何企业都是大事故,每分每秒都意味着巨大的经济损失,早一分钟定位错误,解决问题,是有着重大意义的。

Linux体系对于正则表达式、文本处理是有很强的积淀的。AWK/SED命令就可以处理比较负责的文本分析问题。于是,行业中推出了结合awk命令使用的ass109.awk命令程序,实现快速的系统trace文件分析。

下面通过一个比较简单的会话间锁定测试,来演示awk命令处理思路。具体ass109.awk脚本在网络上下载比较方便,就不累列本文。

1、测试环境准备

实验环境选择Oracle 11gR2,版本为11.2.0.4。

SQL> select * from v$version;

BANNER

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

Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

PL/SQL Release 11.2.0.4.0 - Production

CORE    11.2.0.4.0 Production

TNS for Linux: Version 11.2.0.4.0 - Production

NLSRTL Version 11.2.0.4.0 – Production

实验场景找一个比较简单的就好,双Session共同更新相同记录,构成锁定状态。

--Session 1

SQL> create table t as select object_id from dba_objects;

Table created

SQL> select sid from v$mystat where rownum<2;

SID

----------

319

SQL> delete t where object_id=1000;

1 row deleted

--Session 2

SQL> select sid from v$mystat where rownum<2;

SID

----------

479

SQL> delete t where object_id=1000;

(Hang住)

319和479会话处在锁定等待状态。

2、数据库状态Trace

下面就需要将系统状态System State,笔者选择使用oradebug工具来进行处理。

[oracle@testlife trace]$ sqlplus /nolog

SQL*Plus: Release 11.2.0.4.0 Production on Fri Oct 14 20:01:13 2016

Copyright (c) 1982, 2013, Oracle.  All rights reserved.

SQL> conn / as sysdba

Connected.

SQL> oradebug setmypid

Statement processed.

SQL> oradebug dump systemstate 10;

Statement processed.

SQL> oradebug tracefile_name;

/u01/app/oracle/diag/rdbms/testdb/testdb/trace/testdb_ora_8344.trc

定位到Trace File所在的目录,确认文件生成。同时,确定ass109处理文件也在该目录下。

[oracle@testlife trace]$ ls -l | grep testdb_ora_8344.trc

-rw-r-----  1 oracle oinstall 1021451 Oct 14 20:01 testdb_ora_8344.trc

[oracle@testlife trace]$ ls -l | grep ass109.awk

-rw-r--r--  1 root   root       34549 Oct 14 19:25 ass109.awk

3、分析处理

使用awk分析trace文件极其简单,分析结果直接就输出在屏幕中。

[oracle@testlife trace]$ awk -f ass109.awk testdb_ora_8344.trc

Starting Systemstate 1

............................

Ass.Awk Version 1.0.9 - Processing testdb_ora_8344.trc

System State 1

~~~~~~~~~~~~~~~~

1:

2:  0: waiting for 'pmon timer'

3:  0: waiting for 'rdbms ipc message'

4:  0: waiting for 'VKTM Logical Idle Wait'

5:  0: waiting for 'rdbms ipc message'

6:  0: waiting for 'DIAG idle wait'

7:  0: waiting for 'rdbms ipc message'

8:  0: waiting for 'DIAG idle wait'

9:  0: waiting for 'rdbms ipc message'

10: 0: waiting for 'rdbms ipc message'

11: 0: waiting for 'rdbms ipc message'

12: 0: waiting for 'rdbms ipc message'

13: 0: waiting for 'smon timer'

14: 0: waiting for 'rdbms ipc message'

15: 0: waiting for 'rdbms ipc message'

16: 0: waiting for 'rdbms ipc message'

17:

18:

19: 0: waiting for 'rdbms ipc message'

20: 0: waiting for 'Streams AQ: qmn coordinator idle wait'

21: 0: waiting for 'rdbms ipc message'

22: 0: waiting for 'Streams AQ: qmn slave idle wait'

23: 0: waiting for 'Streams AQ: waiting for time management or cleanup tasks'

24: 0: waiting for 'Space Manager: slave idle wait'

25: 0: waiting for 'SQL*Net message from client'

26: 0: waiting for 'SQL*Net message from client'

27: 0: waiting for 'enq: TX - row lock contention'[Enqueue TX-00060002-00000611]

28:

Blockers

~~~~~~~~

Above is a list of all the processes. If they are waiting for a resource

then it will be given in square brackets. Below is a summary of the

waited upon resources, together with the holder of that resource.

Notes:

~~~~~

o A process id of '???' implies that the holder was not found in the

systemstate.

Resource Holder State

Enqueue TX-00060002-00000611    26: 0: waiting for 'SQL*Net message from client'

Object Names

~~~~~~~~~~~~

Enqueue TX-00060002-00000611

18642 Lines Processed.

分析结果很简单,也很容易看懂。分析重点是从process入手,将当前系统中所有对应的Process信息逐个整理出来,将对应的等待事件wait event理出来。最后,将存在Block的情况整理列出来。

从上面的结果看,可以发现资源Enqueue TX-00060002-00000611被26号会话持有,该会话却处在等待用户信息输入状态。而上面的Process列表中,对于这个资源27号进程是等待持有的。

那么,我们直到了26和27直接有问题,如何定位究竟哪个会话呢?注意:这个26和27对应的就是v$process中数据库内部的进程编号PID。

SQL> select addr,pid,spid from v$process where pid in (26,27);

ADDR                    PID SPID

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

00000001339FDBD0         26 7505

00000001339FEC88         27 8317

SQL> select sid, serial#, paddr, event from v$session where paddr in ('00000001339FDBD0','00000001339FEC88');

SID    SERIAL# PADDR            EVENT

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

319         21 00000001339FDBD0 SQL*Net message from client

479         43 00000001339FEC88 enq: TX - row lock contention

正确定位到319和479会话。

3、结论

数据库资源相互锁定在应用领域非常常见,例如资源释放问题、会话操作失误和事务回滚等,都会引起或大或小的资源锁定。通过awk命令配合ass109.awk命令文件,可以比较方便的让我们快速定位问题,解决问题。

zhuan :http://blog.itpub.net/17203031/viewspace-2126337/

使用AWK分析Oracle系统锁定、Hang状态的更多相关文章

  1. 工具: ass109.awk 分析 Oracle 的跟踪文件

    原文链接:http://www.eygle.com/archives/2009/11/awk_ass109.html 以前分析Oracle的跟踪文件,主要靠手工阅读,最近发现ass109.awk文件是 ...

  2. Oracle包被锁定的原因分析及解决方案

    http://blog.csdn.net/jojo52013145/article/details/7470812 在数据库的开发过程中,经常碰到包.存储过程.函数无法编译或编译时会导致PL/SQL ...

  3. 一篇分析诊断被&quot;hang&quot;住数据库的资料(Oracle Performance Diagnostic Guide——Hang/Locking)

    该资料已上传至本人QQ群空间,如需该资料,可到本人QQ群空间查找.下面贴表文本: Oracle Performance Diagnostic GuideHang/LockingVersion 3.1. ...

  4. [转帖]总结ORACLE系统视图及表大全

    总结ORACLE系统视图及表大全:dba_开头.....dba_users 数据库用户信息dba_segments 表段信息dba_extents 数据区信息dba_objects 数据库对象信息db ...

  5. oracle系统视图字段说明

    oracle系统表v$session.v$sql表的列字段说明‍ 在本视图中,每一个连接到数据库实例中的 session都拥有一条记录.包括用户 session及后台进程如 DBWR, LGWR, a ...

  6. ORACLE系统表大全

    下面全面是对Oracle系统表的一些介绍: 数据字典dict总是属于Oracle用户sys的. 1.用户: select username from dba_users; 改口令 alter user ...

  7. oracle系统表查询

    oracle查询用户下的所有表 select * from all_tab_comments -- 查询所有用户的表,视图等select * from user_tab_comments -- 查询本 ...

  8. Linux查看系统中socket状态

    当我们打开的socket数量很多时,netstat就会变得慢了,有什么办法可以快速查看系统中socket状态? IPv4: $ cat /proc/net/sockstat sockets: used ...

  9. Oracle 系统常用命令

    1.基本口令 1.1.show user                               作用:显示当前连接用户 1.2.conn 用户名/密码                       ...

随机推荐

  1. Python 排序---sort与sorted学习

    当我们从数据库中获取一写数据后,一般对于列表的排序是经常会遇到的问题,今天总结一下python对于列表list排序的常用方法: 第一种:内建方法sort() 可以直接对列表进行排序 用法: list. ...

  2. Linux操作系统简介

    一:Linux系统概述 1.常见操作系统 - 服务端操作系统 : linux.unix.windows server - 单机操作系统 : windows(dos .ucdos.win95.win98 ...

  3. 自定义URL协议在Web中启动本地应用程序

    转自(http://blog.csdn.net/jackychen_king/article/details/7743811) 1.注册应用程序来处理自定义协议 你必须添加一个新的key以及相关的va ...

  4. 初次使用Bootstrap

    一.概述也好,过程也好,反正就是这样 知道这个还是从群里听到的,一个人的视野是有限,必须借助他人来扩展.好奇使我去搜索了解了一下.原来是一个网页前端框架,可以适合不同大小屏幕,自动适应正常显示.这就是 ...

  5. windows 2008 server R2 服务器docker安装

    1.安装包选择 windows win10 较新版本,使用 Get Docker for Windows (Stable) 或者 Get Docker for Windows (Edge) 其余使用  ...

  6. Linux服务器上安装tomcat

    安装软件 : apache-tomcat-9.0.0.M1.tar.gz(下载地址http://tomcat.apache.org/) 步骤一 Tomcat是其中一个开源的且免费的java Web服务 ...

  7. LeetCode OJ:Implement Stack using Queues(队列实现栈)

    Implement the following operations of a stack using queues. push(x) -- Push element x onto stack. po ...

  8. Docker搭建独立服务器

    用Docker尝试搭建了一个Apache2服务器,整体安装很简单,但是从容器中退出后,Apache2服务器也就随之停止,网上有很多说可以通过docker run 加上-d参数可以使得服务器跑在后台,但 ...

  9. pg_bulkload使用记录

    很久之前就使用过pg_bulkload来导入数据了,并做了对比试验,现在另一个项目又需要用了,这里做个记录: 1.rpm包比较老,下下来之后发现只支持到pg94,目前我用的是pg10,因此放弃. 2. ...

  10. Quartz创建多个不同名字的scheduler实例

    _http://my.oschina.net/laiweiwei/blog/122280 需求创建多个不同的Scheduler实例,每个实例自主启动.关闭 问题 如果直接用 SchedulerFact ...