sqlplus prelim选项 常规情况下sqlplus无法登录

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:

ALTER SESSION SET NLS_LANGUAGE= ‘SIMPLIFIED CHINESE’ NLS_TERRITORY= ‘CHINA’ NLS_CURRENCY= ‘¥’ NLS_ISO_CURRENCY= ‘CHINA’ NLS_NUMERIC_CHARACTERS= ‘.,’ NLS_CALENDAR= ‘GREGORIAN’ NLS_DATE_FORMAT= ‘DD-MON-RR’ NLS_DATE_LANGUAGE= ‘SIMPLIFIED CHINESE’ NLS_SORT= ‘BINARY’ TIME_ZONE= ‘+08:00′ NLS_COMP= ‘BINARY’ NLS_DUAL_CURRENCY= ‘¥’ NLS_TIME_FORMAT= ‘HH.MI.SSXFF AM’ NLS_TIMESTAMP_FORMAT= ‘DD-MON-RR HH.MI.SSXFF AM’ NLS_TIME_TZ_FORMAT= ‘HH.MI.SSXFF AM TZR’ NLS_TIMESTAMP_TZ_FORMAT= ‘DD-MON-RR HH.MI.SSXFF AM TZR’

select value$ from props$ where name = ‘GLOBAL_DB_NAME’

select SYS_CONTEXT(’USERENV’, ‘SERVER_HOST’), SYS_CONTEXT(’USERENV’, ‘DB_UNIQUE_NAME’), SYS_CONTEXT(’USERENV’, ‘INSTANCE_NAME’), SYS_CONTEXT(’USERENV’, ‘SERVICE_NAME’), INSTANCE_NUMBER, STARTUP_TIME, SYS_CONTEXT(’USERENV’, ‘DB_DOMAIN’) from v$instance where INSTANCE_NAME=SYS_CONTEXT(’USERENV’, ‘INSTANCE_NAME’)

select decode(failover_method, NULL, 0 , ‘BASIC’, 1, ‘PRECONNECT’, 2 , ‘PREPARSE’, 4 , 0), decode(failover_type, NULL, 1 , ‘NONE’, 1 , ‘SESSION’, 2, ‘SELECT’, 4, 1), failover_retries, failover_delay, flags from service$ where name = :1

而sqlplus使用prelim连接上数据库后,没有生成10046 trace文件,看起来没有执行SQL,也就是没有执行任何初始化动作和查询必要的信息。也许这也就是称之为“初级连接”的来历吧。

由于使用prelim方式连接,没有执行sql语句的,所以在数据库的某些hang住的情况下,能够连接上数据库。比如由于library cache latch 被长时间持有不能释放,不能解析SQL语句引起的hang。有的人会说,我的应用刚连上去还没做任何操作就hang住了。这只是表面现象,连接上数据库后,一般都会做一些初始化的操作,如设定环境之类的。

sqlplus -prelim能够在数据库hang住的情况下连接数据库,但只能说是连接,并不代表能够做很多操作。比如执行SQL查询。这种情况下,可能最有用的就是使用oradebug。


本文只是简单地“inside”,其实并不很深入,Oracle还会有其他的跟prelim有关的东西,是我们还没发现的。有兴趣的朋友,可以进一步研究。比如通过抓取tns包进行分析等等。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值