剖析Oracle中oerr命令

Oralce中的命令非常丰富,oerr命令是一个不错的辅助工具,很多看起来没有眉目的错误代码,可以让DBA很快定位问题的缘由,我们根本不需要去记有哪些ORA错误,除非那些错误已经完全和你的工作分不开。
绝大多数的命令都是二进制的形式,比如sqlplus我们可一窥其中的奥妙,oerr是一个shell脚本,而且实现原理也不难,我们来剖析一下,看看这个工具的设计思想。
首先这个工具位于$ORACLE_HOME/bin下,直接看还看不出是个shell脚本。
[oracle@db117 ~]$ ll $ORACLE_HOME/bin/oerr
-rwxr-xr-x 1 oracle oinstall 2567 Apr 23  2014 /U01/app/oracle/product/11.2.0.4/bin/oerr
但是我就是喜欢折腾,所以无意中就打开了这个文件。可以看到这个脚本的注释如下:
# Usage: oerr facility error
#
# This shell script is used to get the description and the cause and action
# of an error from a message text file when a list of error numbers are passed
# to it.  It supports different language environments and errors from different
# facilities.
当然脚本的完整内容也没有多少行,我们来简单看看,有一个配置文件facility.lis
Facilities_File=$ORACLE_HOME/lib/facility.lis
需要从这个配置文件中取得相应的component,比如我们使用命令oerr ora 12345,则ora就是第一个参数,根据这个参数可以得到接下来需要使用的component值。
脚本里面有如下一行类似的内容,我们带入参数ora,当然还可以输入tns等等。
Fac_Info=`grep -i "^${Facility}:" $Facilities_File 2> /dev/null`
我们转换一下,可以看到得到的component是rdbms
[oracle@db117 ~]$ grep -i "^ora:" $ORACLE_HOME/lib/facility.lis
ora:rdbms:*:
至于这一行内容的解释,在文件中也可以轻松找到。
#
# The entries in this file are colon separated defining, for each
# facility (field 1), the component name (field 2), the "real" facility
# name for facilities with aliases (field 3) with a value of "*" for
# facilities without renamings and an optional facility description
# (field 4)
#
#       facility:component:rename:description
#

里面的内容如下:
acfs:usm:*:
acfsk:usm:*:
advm:usm:acfs:
advmk:usm:*:
amd:cwmlite:*:
amdu:rdbms:*:
当然这只是开始,错误信息的文件在一个指定的文件中,比如component是rdbms,则错误信息的文件为$ORACLE_HOME/rdbms/mesg
[oracle@db117 ~]$ cd $ORACLE_HOME/rdbms/mesg
而错误信息的文件也是有规律的,和ora相关的一个文件,oraus.msg也是大体这样的格式。
[oracle@db117 mesg]$ ll ora*us*msg
-rw-r--r-- 1 oracle oinstall 4976647 Apr 23  2014 oraus.msg

比方这个时候我们移步到错误信息的文件中,找到了下面两行错误信息。
64477, 00000, "Multiple token tables are not supported."
// *Cause:   An attempt was made to create a new token table. If encountered
//           during an import, a critical patch was possibly missing on the
//           export database.
// *Action:  Use the default token table. If encountered during an import,
//           apply the appropriate patch on the export database and try the
//           export and import again.

64621, 00000, "SQL statement length (%s) exceeds maximum allowed length (%s)"
// *Cause:  An attempt was made to issue a SQL statement that exceeded the
//          maximum allowed length of a statement.
// *Action: Modify the SQL statement or the views to which it refers to fit
//          within the maximum length or split the SQL statement.
//
这个时候怎么去解析读取这个文件的呢,
首先就是解析错误编码,比如输入错误编码64621,我们也可以输入064621等,这个地方都会使用sed来先转换一下,保证能够找到完全匹配的内容。
Code=`echo 64621|/bin/sed 's/^[0]*//'`
[oracle@db117 bin]$ echo 64621|/bin/sed 's/^[0]*//'
64621
[oracle@db117 bin]$ echo 064621|/bin/sed 's/^[0]*//'
64621
假设这个时候我们就看64621的错误信息,这个时候就可以使用awk来读取文件的内容。Oracle的调用方式类似下面的形式。
Code=64621
[oracle@db117 bin]$ awk "BEGIN { found = 0; }
        /^[0]*$Code/    { found = 1; print ; next;}
        /^\/\//         { if (found) { print; } next; }
                        { if (found) { exit; } }" $ORACLE_HOME/rdbms/mesg/oraus.msg
64621, 00000, "SQL statement length (%s) exceeds maximum allowed length (%s)"
// *Cause:  An attempt was made to issue a SQL statement that exceeded the
//          maximum allowed length of a statement.
// *Action: Modify the SQL statement or the views to which it refers to fit
//          within the maximum length or split the SQL statement.
//
所以学以致用,我们也可以仿照这种方式简单定制符合自己需求的内容。

时间: 2024-10-30 03:38:27

剖析Oracle中oerr命令的相关文章

Oracle中SPOOL命令使用方法详解

举例:test.sh  代码如下 复制代码 #! /bin/sh sqlplus -s scott/tiger<<EOF  set head off  set linesize 20000  set echo off  set feedback off  set pagesize 0  set termout off  set trimout on  set trimspool on   spool /home/test.txt    select empno || '|' || ename

oracle 中 sqlplus命令大全_oracle

1.简介: Oracle的sql*plus是与oracle进行交互的客户端工具.在sqlplus中,可以运行sqlplus命令与sqlplus语句,我们通常所说的DML.DDL.DCL语句都是sqlplus语句,它们执行完后,都可以保存在一个被称为sql buffer的内存区域中,并且只能保存一条最近执行的sql语句,我们可以对保存在sql buffer中的sql 语句进行修改,然后再次执行,sqlplus一般都与数据库打交道. 2.常用命令 sqlplus username/password

Oracle中imp命令使用出错——未知命令开头

大家要知道imp是在cmd命令行中才起作用了.不要弄到sqlplus里面了.要注意^  ^.

oracle 中常见的set命令

当管理的数据库比较多的时候,在sqlplus里切换就是一件麻烦的事.要非常小心,以防出错.可以修改sqlplus的提示符:SQL>,把这个改成我们用户和实例名,这样就不容易出错. 先看一下Oracle自定义的参数: SQL>define DEFINE _DATE = "11-MAY-11" (CHAR) DEFINE _CONNECT_IDENTIFIER = "dave1" (CHAR) DEFINE _USER = "SYS" (

oracle 11g sqlplus-Oracle求解,sqlplus中运行命令出现异常

问题描述 Oracle求解,sqlplus中运行命令出现异常 才装的Oracle 11g,按照书上的步骤开始打开sqlplus输命令就出现了这种情况,真心无解,求大神指教.另我是win8.1,64位的系统,安装过程都很顺畅,按照网上的步骤下来的. 解决方案 hr没锁了吧...你试试其它语句看能不能运行 解决方案二: 你的权限.数据库连接以及数据库中是否有这个用户,最好用图形界面看下.

Oracle RAC中Srvctl命令详细说明

Oracle RAC中srvctl命令详细说明(转) SRVCTL Add 添加数据库或实例的配置信息.在增加实例中,与-i一起指定的名字应该与INSTANCE_NAME 和 ORACLE_SID参数匹配. srvctl add database -d database_name [-m domain_name] -o oracle_home [-s spfile] srvctl add instance -d database_name -i instance_name -n node_nam

【sessions】Oracle中sessions和processes的大小关系(10g和11g不同)

[sessions]Oracle中sessions和processes的大小关系(10g和11g不同) 1  BLOG文档结构图 BLOG_Oracle_lhr_[sessions]Oracle中sessions和processes的大小关系(10g和11g不同).pdf 2  前言部分 2.1  导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~: ① sessions和processes的大小设置,10g和11g不同(重点

关于Oracle中重启数据库的一个bug

关于drop database在oracle中是致命的操作,这个操作自己在测试环境中体验过,会完全删除数据文件,因此这个操作非常敏感但是实用性不强,不过话说过来,这个操作也不是随便就能执行的,除了操作敏感的权限之外,其实还是有一些前提条件的. 在数据库open状态,是无法运行这个命令的.SQL> drop database TEST;drop database TEST              *ERROR at line 1:ORA-00933: SQL command not proper

在ORACLE中移动数据库文件

在ORACLE中移动数据库文件 ---- ORACLE数据库由数据文件,控制文件和联机日志文件三种文件组成.由于磁盘空间的变化,或者基于数据库磁盘I/O性能的调整等,数据库管理员可能会考虑移动数据库文件.下面以UNIX平台为例,分别讨论三种数据库文件的移动方法. ---- 一.移动数据文件: ---- 可以用ALTER DATABASE,ALTER TABLESPACE两种方法移动数据文件. ---- 1. ALTER DATABASE方法: ---- 用此方法,可以移动任何表空间的数据文件.