【探索】【oerr】对oerr出处的一点点探索

oerr可以在Linux和UNIX操作系统上查询简短的报错信息的含义,可以很好的辅助排查Oracle故障。
这个小文儿介绍一下这个工具的使用方法,然后从oerr脚本中找点有意思的信息。

1.oerr的使用方法
[oracle@BJS ~]$ oerr ora 12571
12571, 00000, "TNS:packet writer failure"
// *Cause: An error occurred during a data send.
// *Action: Not normally visible to the user. For further details, turn
// on tracing and reexecute the operation. If error persists, contact
// Oracle Customer Support.

2.使用which命令查询oerr工具的位置
secooler@testdb /home/oracle$ which oerr
/oracle/app/oracle/product/10.2.0/db_1/bin/oerr

3.看一下这个脚本文件记录的内容
secooler@testdb /home/oracle$ vi /oracle/app/oracle/product/10.2.0/db_1/bin/oerr
  1 #!/bin/sh
  2 #
  3 # $Id: oerr 28-aug-2001.15:35:03 mkrohan Exp $
  4 # Copyright (c) 1994, 2001, Oracle Corporation.  All rights reserved.
  5 #
  6 # Usage: oerr facility error
  7 #
  8 # This shell script. is used to get the description and the cause and actio    n
  9 # of an error from a message text file when a list of error numbers are pa    ssed
 10 # to it.  It supports different language environments and errors from diff    erent
 11 # facilities.
 12 #
 13
 14 #
 15 # Turn on script. tracing if, requested
 16 [ "$ORACLE_TRACE" = "T" ] && set -x
 17
 18 #
 19 # If ORACLE_HOME is not set, we will not be able to locate
 20 # the message text file.
 21 if [ ! "$ORACLE_HOME" ]
 22 then
 23         echo "ORACLE_HOME not set.  Please set ORACLE_HOME and try again."     1>&2
 24         exit 1
 25 fi
 26
 27 #
 28 # Ignore user locale
 29 LC_ALL=C
 30 export LC_ALL
 31
 32 #
 33 # Definition script. "constants"
 34 Facilities_File=$ORACLE_HOME/lib/facility.lis
 35
 36 #
 37 # Check script. usage
 38 if [ "$#" != "2" ]
 39 then
 40         exec 1>&2
 41         echo 'Usage: oerr facility error'
 42         echo
 43         echo 'Facility is identified by the prefix string in the error mes    sage.'
 44         echo 'For example, if you get ORA-7300, "ora" is the facility and     "7300"'
 45         echo 'is the error.  So you should type "oerr ora 7300".'
 46         echo
 47         echo 'If you get LCD-111, type "oerr lcd 111", and so on.'
 48         exit 1
 49 fi
 50
 51 #
 52 # Pickup the command line arguments
 53 Facility="$1"
 54 Code="$2"
 55
 56 #
 57 # Get the facility information from the oerr data file
 58 Fac_Info=`grep -i "^${Facility}:" $Facilities_File 2> /dev/null`
 59 if [ $? -ne 0 ]
 60 then
 61         echo "oerr: Unknown facility '$Facility'" 1>&2
 62         exit 1
 63 fi
 64
 65 #
 66 # Parse the components from the Fac_Info string into Shell variables
 67 eval `echo "$Fac_Info" | awk -F: '{
 68                 if (index ($3, "*") == 0)
 69                         printf ("Facility=%s\n", $3);
 70                 else
 71                         printf ("Facility=%s\n", $1);
 72                 printf ("Component=%s\n", $2);
 73                 }'`
 74 if [ -z "$Facility" -o -z "$Component" ]
 75 then
 76         echo "oerr: Invalid facilities entry '$Fac_Info'" 1>&2
 77         exit 1
 78 fi
 79
 80 #
 81 # The message file searched is always the US English file
 82 Msg_File=$ORACLE_HOME/$Component/mesg/${Facility}us.msg
 83 if [ ! -r $Msg_File ]
 84 then
 85         echo "oerr: Cannot access the message file $Msg_File" 1>&2
 86         exit 1
 87 fi
 88
 89 #
 90 # Search the message file for the error code, printing the message text
 91 # and any following comments which should give the cause and action for
 92 # the error.
 93 awk "BEGIN { found = 0; }
 94         /^[0]*$Code/    { found = 1; print ; next;}
 95         /^\/\//         { if (found) { print; } next; }
 96                         { if (found) { exit; } }" $Msg_File
 97
 98 exit 0

4.从这个脚本文件中能获得很多有意思的东西,抛个砖,指出一处。其他的大家慢慢发掘
我感兴趣的是脚本中的第82行
 82 Msg_File=$ORACLE_HOME/$Component/mesg/${Facility}us.msg
这里似乎暗示着我们,所有的检索信息都是来自于这些*.msg文件

我们在ORACLE_HOME目录中使用find命令查找与oraus关键字相关的文件,这里得到了两个文件
secooler@testdb /home/oracle$ find $ORACLE_HOME -name mesg | xargs find ora | grep -i oraus
/oracle/app/oracle/product/10.2.0/db_1/rdbms/mesg/oraus.msg
/oracle/app/oracle/product/10.2.0/db_1/rdbms/mesg/oraus.msb

在使用head命令查看部分信息后发现,oraus.msg文件非常的有意思,这个文件中记录了各种与ora相关的错误信息,oerr工具正是检索这个文件中的相应信息返回到屏幕中的。
oraus.msb文件是一个二进制文件,对我们的帮助不大。

通过上面的挖掘,我们得到了所有与命令“oerr ora *****”相关的报错信息的出处了,换一种说法就是:我们可以直接通过oraus.msg文件来得到与ora相关的报错信息汇总。

通过这个文件直接得到12571错误描述信息
$ vi oraus.msg
搜索12571得到如下信息,可以看到和使用oerr ora 12571得到的信息一致
12571, 00000, "TNS:packet writer failure"
// *Cause: An error occurred during a data send.
// *Action: Not normally visible to the user. For further details, turn
// on tracing and reexecute the operation. If error persists, contact
// Oracle Customer Support.
/

有兴趣的话可以导航到$ORACLE_HOME/rdbms/mesg/目录,查看*.msg类文件,可以得到更多有趣的信息。

5.最后我们使用"sh -x"的方式看一下这个脚本文件真实的执行过程,这个过程更加直接,比直接读脚本来的直接很多
[oracle@BJS ~]$ sh -x oerr ora 12571
+ '[' '' = T ']'
+ '[' '!' /oracle/app/oracle/product/10.2.0/db_1 ']'
+ LC_ALL=C
+ export LC_ALL
+ Facilities_File=/oracle/app/oracle/product/10.2.0/db_1/lib/facility.lis
+ '[' 2 '!=' 2 ']'
+ Facility=ora
+ Code=12571
++ grep -i '^ora:' /oracle/app/oracle/product/10.2.0/db_1/lib/facility.lis
+ Fac_Info='ora:rdbms:*:'
+ '[' 0 -ne 0 ']'
++ echo 'ora:rdbms:*:'
++ awk -F: '{
                if (index ($3, "*") == 0)
                        printf ("Facility=%s\n", $3);
                else
                        printf ("Facility=%s\n", $1);
                printf ("Component=%s\n", $2);
                }'
+ eval Facility=ora Component=rdbms
++ Facility=ora
++ Component=rdbms
+ '[' -z ora -o -z rdbms ']'
+ Msg_File=/oracle/app/oracle/product/10.2.0/db_1/rdbms/mesg/oraus.msg
+ '[' '!' -r /oracle/app/oracle/product/10.2.0/db_1/rdbms/mesg/oraus.msg ']'
+ awk 'BEGIN { found = 0; }
        /^[0]*12571/    { found = 1; print ; next;}
        /^\/\//         { if (found) { print; } next; }
                        { if (found) { exit; } }' /oracle/app/oracle/product/10.2.0/db_1/rdbms/mesg/oraus.msg
12571, 00000, "TNS:packet writer failure"
// *Cause: An error occurred during a data send.
// *Action: Not normally visible to the user. For further details, turn
// on tracing and reexecute the operation. If error persists, contact
// Oracle Customer Support.
+ exit 0

-- The End --

时间: 2024-09-16 06:30:02

【探索】【oerr】对oerr出处的一点点探索的相关文章

PHP内核探索之变量(6)- 后续内核探索系列大纲备忘

原文:PHP内核探索之变量(6)- 后续内核探索系列大纲备忘 年前因为工作比较饱和,现在又忙着换工作的事情,基本停止了对博文的更新.后续的博文,还是慢慢补上吧. 为了不至于过于发散,先搞个未成形的大纲,如下: PHP内核探索之变量  不平凡的字符串 PHP内核探索之变量  变量的生命周期.类型转换 PHP内核探索之变量  变量的循环(foreach,其实放到Zend部分更加合理一些) PHP内核探索之SAPI  (比较疑惑,为什么这么靠后? ) PHP内核探索之函数  (函数实现原理.用户函数和

【OERR】 oerr ora 错误 11.2.0.3 【00000-19999】

【OERR】 oerr ora 错误 11.2.0.3 【20000-64307】

【OERR】 oerr ora 错误 12.2.0.1 【20000-39999】

小麦苗BLOG文章索引

小麦苗BLOG文章索引            自从2014年7月1号开始写blog到2015年5月5日,历时10个月的时间,大概写了90篇文章,这blog多了就乱了,今天抽空出来整理整理,方便大家也方便自己阅读,本文将一直更新,另外,最后我把所有的blog文章全列出来,可能会有用.    小麦苗的所有文章:itpub文章链接-小麦苗.zip     2015年06月03日更新一次,我写的blog数量:109 篇    2015年07月03日更新一次,我写的blog数量:126 篇    2016

Groovy探索 自定义Range 三 自定义Range与责任链模式

责任链模式也是我们比较常用的一种模式,我在<Groovy探索之责任链模式>中有个探索.大家也可以在网上搜索,应该有很多这方面的文章. 在这里,我们将使用自定义的Range类来实现责任链模式,使用的例子还是在<Groovy探索之责任链模式>一文中所谈到的"孙悟空大战二郎神"的这个情节.这样,我们可以把这两篇的文字结合起来看,使得我们能够对比这两种开发方式.使得我们能够深入的理解自定义Range类的使用. 在"孙悟空大战二郎神"这个情节里,重点讲

探索式测试的问与答(2)

接探索式测试的问与答(1) 既然学习非常重要,那么如何才能高效地学习呢?软件专家Andrew Hunt指出:"一种高效的学习环境应该允许你安全地做三件事情:探索.创造和应用."Andrew的解释如下: 探索就是在陌生的环境中玩(Play).你需要自由地探索才能学习.我们不仅仅接受信息,而是亲自探索和构建思维模型.玩引入了一种新奇的感觉,也就是 乐趣.用一种好玩的方式学习新资料或者解决问题,可以让这个过程变得更让人享受,也让学习变得更容易.为了更好地学习,请更好地玩. 你需要自由地创造-

探索测试十问十答

常被人问到各种探索测试的问题, 我总是不断在重复.因此借一次回答10个问题的机会,把自己的答复都固化下来, 积累在自己的技术博客中, 希望能减少重复回答的次数. 1.探索性测试能解决什么样的问题?不能解决什么类型的问题? --解决快速发现功能级bug的问题:不能系统的解决性能测试.稳定性测试的问题. 2.一个产品线如何确定是否适合这种方法?如何将探索性测试方法与具体的产品结合起来? ――所有产品都适合应用,只是ET所在投入比例不同(我在硬件驱动软件测试.Linux文件系统测试.windows客户

基于内容、位置与关系的探索模式

信噪比,是指有用信息与无用信息的比值.如果信息能够有效过滤,信噪比高(甚至非常高),那么信息爆炸不仅不是坏事,反而还将大大拓展我们的眼界,提高生活的深度. Flickr探索 与此同时,我们越来越倾向于一个彻底个性化,同时做好隐私保护的综合平台.喜新厌旧是人的天性,这就注定了"个性化"不能只停留在"定制"的范畴,还应该包括"探索". 社交网络的现状 社会化网络服务 三层服务 在线社区经过这几年的沉淀,目前有以下三种层次的服务: - 内容服务 基于内