当前位置:  数据库>oracle

使用AWK分析Oracle系统锁定、Hang状态

    来源: 互联网  发布时间:2017-06-24

    本文导语: 在早期Oracle版本中,由于技术不成熟等原因,数据库锁定和僵死状态还是时有发生的。对待这些问题,老先生们的处理策略无外乎是“重启”和“考究”两种策略。所谓“重启”,通过强制的重启服务器或者数据库,将软硬件偶...

在早期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 delete t where object_id=1000;

1 row deleted

--Session 2

SQL> select sid from v$mystat where rownum 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 * 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命令文件,可以比较方便的让我们快速定位问题,解决问题。


    
 
 

您可能感兴趣的文章:

  • Photoshop教程:图层蒙版、图层锁定及解锁、图层样式的使用介绍
  • 如何锁定源代码,一次只能有一个线程使用?
  • 使用钩子如何锁定键盘的方法分享
  • java多线程并发中使用Lockers类将多线程共享资源锁定
  • 我使用一个递归 mutex,因为一个可能会连续锁定它两次 ,在PC机上的x86gcc可以,但ARMGCC就不行,两个版本一样。
  • 在linux下取系统信息,网卡带宽,内存使用率,CPU,I/O状态,网络状态的命令分别是什么?
  • 在windows下使用虚拟机运行linux,在不插入网线的状态下可不可以使用smb服务
  • 使用实现状态栏?
  • 博客 iis7站长之家
  • 使用python检测手机QQ在线状态的脚本代码
  • python中使用urllib2获取http请求状态码的代码例子
  • 使用python在校内发人人网状态(人人网看状态)
  • :::::::::我想保持当前对象的状态,在另一个程序中使用,高手请进!!!
  • 使用apachetop实时监控日志、动态分析服务器运行状态
  • Linux中使用mysqladmin extended-status配合Linux命令查看MySQL运行状态
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • linux下free命令显示的内存使用情况分析
  • Java内存使用分析 HeapAnalyzer
  • 使用java如何分析系统不能识别的字符串?
  • 如何使用yacc分析c语言程序?
  • 磁盘使用分析工具 Filelight
  • [linux_centos6.3_xampp]中型网站如何分析带宽使用?
  • MySQL DNS的使用过程详细分析
  • 我想做一个截获并分析网络数据包的工具,linux windows使用哪个平台更方便
  • 不要使用CSS Expression的原因分析
  • Android中gravity与layout_gravity的使用区别分析
  • linux下使用crontab实现定时PHP计划任务失败的原因分析
  • 深入分析Java内存区域的使用详解
  • ThinkPHP后台首页index使用frameset时的注意事项分析
  • Mysql自带profiling性能分析工具使用分享
  • C#词法分析器之词法分析的使用详解
  • 查询优化之EXPLAIN的使用分析
  • 使用shell脚本分析网站日志统计PV、404、500等数据
  • C#中this的使用实例分析
  • 请问谁能分析下《自己动手写操作系统》堆栈使用
  • Android SharedPreferences的使用分析
  • SQL 查询分析中使用net命令问题
  • C++ I/O 成员 tellg():使用输入流读取流指针
  • 在测试memset函数的执行效率时,分为使用Cash和不使用Cash辆种方式,该如何控制是否使用缓存?
  • C++ I/O 成员 tellp():使用输出流读取流指针
  • 求ibm6000的中文使用手册 !从来没用过服务器,现在急需使用它,不知如何使用! 急!!!!!
  • Python不使用print而直接输出二进制字符串
  • 请问:在使用oracle数据库作开发时,是使用pro*c作开发好些,还是使用库函数如oci等好一些啊?或者它们有什么区别或者优缺点啊?
  • Office 2010 Module模式下使用VBA Addressof
  • 急求结果!!假设一个有两个元素的信号量集S,表示了一个磁带驱动器系统,其中进程1使用磁带机A,进程2同时使用磁带机A和B,进程3使用磁带机B。
  • windows下tinyxml.dll下载安装使用(c++解析XML库)
  • c#中SAPI使用总结——SpVoice的使用方法


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3