2012-07-14 21:20
SYSTEM:HP-UX 11.31
ORACLE:10.2.0.5 RAC
PDA RAC服务器其中一节点HANG住,应用及sqlplus都不能连接,印象中老白书中提到有sqlplus -prelim连接数据库可以解决,于是上网找资料
老熊的文章:http://www.laoxiong.net/inside_sqlplus_prelim.html
于是,跟着做了一遍测试
(备注:在metalink下面这篇文章第一次见到sqlplus -prelim的用法。
Taking Systemstate Dumps when You cannot Connect to Oracle [ID 121779.1])
sqlplus -prelim / as sysdba
oradebug setmypid
oradebug unlimit;
oradebug dump systemstate 10
oradebug TRACEFILE_NAME
普通方式连接
$ sqlplus /nolog
SQL*Plus: Release 10.2.0.5.0 - Production on Sat Jul 14 22:42:59 2012
Copyright (c) 1982, 2010, Oracle. All Rights Reserved.
SQL> conn / as sysdba
Connected.
SQL> exit
Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
加prelim参数时的情况
$ sqlplus /nolog
SQL*Plus: Release 10.2.0.5.0 - Production on Sat Jul 14 22:41:10 2012
Copyright (c) 1982, 2010, Oracle. All Rights Reserved.
SQL> set _prelim on
SQL> conn / as sysdba
Prelim connection established
对比发现,使用prelim连接时,提示为“Prelim connection established”,退出sqlplus没有显示banner。
还可以用另一种方式以prelim选项连接数据库:
$ sqlplus /nolog
SQL*Plus: Release 10.2.0.5.0 - Production on Sat Jul 14 22:44:35 2012
Copyright (c) 1982, 2010, Oracle. All Rights Reserved.
SQL> set _prelim on
SQL> conn / as sysdba
Prelim connection established
启用10046事件trace未做,这里就摘抄老熊里的原文
从生成的trace文件中,可以发现在正常连接时,连接上数据库后,sqlplus自动执行了下面的SQL:
而sqlplus使用prelim连接上数据库后,没有生成10046 trace文件,看起来没有执行SQL,也就是没有执行任何初始化动作和查询必要的信息。也许这也就是称之为“初级连接”的来历吧。
由于使用prelim方式连接,没有执行sql语句的,所以在数据库的某些hang住的情况下,能够连接上数据库。比如由于library cache latch 被长时间持有不能释放,不能解析SQL语句引起的hang。有的人会说,我的应用刚连上去还没做任何操作就hang住了。这只是表面现象,连接上数据库后,一般都会做一些初始化的操作,如设定环境之类的。
sqlplus -prelim能够在数据库hang住的情况下连接数据库,但只能说是连接,并不代表能够做很多操作。比如执行SQL查询。这种情况下,可能最有用的就是使用oradebug。
本文只是简单地“inside”,其实并不很深入,Oracle还会有其他的跟prelim有关的东西,是我们还没发现的。有兴趣的朋友,可以进一步研究。比如通过抓取tns包进行分析等等。