sqlplus -prelim,sqplus区别
偶爾在論壇上看見帖子說"sqlplus -prelim / as sysdba"去連接oracle,都一次見,于是去baidu了一下,如下轉(zhuǎn)了一位兄臺(tái)的blog文章。
*****************************************************************************
我們知道,在Oracle 10g中,如果數(shù)據(jù)庫實(shí)例hang住了,應(yīng)用及sqlplus都不能連接時(shí),可以用sqlplus -prelim連接數(shù)據(jù)庫。那么sqlplus連接時(shí),加上-prelim這個(gè)參數(shù)有什么特別的地方呢?下面,讓我們來研究一下:
測(cè)試環(huán)境:Linux AS4上的Oracle 10.2.0.1,客戶端(sqlplus)版本為Windows 2003下的10.2.0.1。
首先在數(shù)據(jù)庫上啟用10046事件:
SQL> alter system set events ‘10046 trace name context forever’;
System altered.
先用普通的方式連接:
D:\>sqlplus /nolog
SQL*Plus: Release 10.2.0.1.0 - Production on 星期六 11月 15 15:36:02 2008
Copyright (c) 1982, 2005, Oracle. All rights reserved.
SQL> conn sys/manage@xty as sysdba
已連接。
SQL> exit
從 Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options 斷開
再看看加prelim參數(shù)時(shí)的情況:
D:\>sqlplus -prelim /nolog
SQL*Plus: Release 10.2.0.1.0 - Production on 星期六 11月 15 15:36:34 2008
Copyright (c) 1982, 2005, Oracle. All rights reserved.
SQL> conn sys/manage@xty as sysdba
初級(jí)連接已建立
SQL> exit
從 ORACLE 斷開
從上面的信息可以看到,在使用prelim連接時(shí),提示為“初級(jí)連接已建立”,退出sqlplus沒有顯示banner。
也可以通過下面的方式來用prelim方式連接數(shù)據(jù)庫:
[oracle@xty ~]$ sqlplus /nolog
SQL*Plus: Release 10.2.0.3.0 - Production on Tue Dec 2 07:04:28 2008
Copyright (c) 1982, 2006, Oracle. All Rights Reserved.
SQL> set _prelim on
SQL> connect / as sysdba
Prelim connection established
再看看數(shù)據(jù)庫的10046 trace:
從生成的trace文件中,可以發(fā)現(xiàn)在正常連接時(shí),連接上數(shù)據(jù)庫后,sqlplus自動(dòng)執(zhí)行了下面的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連接上數(shù)據(jù)庫后,沒有生成10046 trace文件,看起來沒有執(zhí)行SQL,也就是沒有執(zhí)行任何初始化動(dòng)作和查詢必要的信息。也許這也就是稱之為“初級(jí)連接”的來歷吧。
由于使用prelim方式連接,沒有執(zhí)行sql語句的,所以在數(shù)據(jù)庫的某些hang住的情況下,能夠連接上數(shù)據(jù)庫。比如由于library cache latch 被長時(shí)間持有不能釋放,不能解析SQL語句引起的hang。有的人會(huì)說,我的應(yīng)用剛連上去還沒做任何操作就hang住了。這只是表面現(xiàn)象,連接上數(shù)據(jù)庫后,一般都會(huì)做一些初始化的操作,如設(shè)定環(huán)境之類的。
sqlplus -prelim能夠在數(shù)據(jù)庫hang住的情況下連接數(shù)據(jù)庫,但只能說是連接,并不代表能夠做很多操作。比如執(zhí)行SQL查詢。這種情況下,可能最有用的就是使用oradebug。
本文只是簡(jiǎn)單地“inside”,其實(shí)并不很深入,Oracle還會(huì)有其他的跟prelim有關(guān)的東西,是我們還沒發(fā)現(xiàn)的。有興趣的朋友,可以進(jìn)一步研究。比如通過抓取tns包進(jìn)行分析等等。
總結(jié)
以上是生活随笔為你收集整理的sqlplus -prelim,sqplus区别的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用UDEV服务解决RAC ASM存储设备
- 下一篇: Oracle 11g 中告警日志的位置