2016-11-28 65 views
8

我想知道它是否有可能通過某種方式得到sqlplus輸出來發現我的數據庫是否啓動。如何驗證sqlplus可以連接?

我想運行一個數據庫上的腳本列表,但在此之前,我想知道數據庫是否啓動並正在運行我的腳本。

這裏是我的嘗試:

sqlplus /@DB1 << EOF 
> select 1 from dual; 
> EOF 

它不能連接,但sqlplus中的返回碼仍表示「一切OK」!

 
SQL*Plus: Release 11.2.0.4.0 Production on Mon Nov 28 10:06:41 2016 

Copyright (c) 1982, 2013, Oracle. All rights reserved. 

ERROR: 
ORA-12505: TNS:listener does not currently know of SID given in connect 
descriptor 


Enter user-name: SP2-0306: Invalid option. 
Usage: CONN[ECT] [{logon|/|proxy} [AS {SYSDBA|SYSOPER|SYSASM}] [edition=value]] 
where ::= [/][@] 
     ::= [][/][@] 
Enter user-name: [email protected]:/tmp/jcho $ echo $? 
0 

我知道我可以用grep我的測試查詢的結果,這樣的:

a.sh

sqlplus /@DB1 << EOF 
    select 'ALL_GOOD_BOY' from dual; 
EOF 

電話:

給出1行,如果連接正常工作,0否則:

$ a.sh |grep ALL_GOOD_BOY|wc -l 

...這對我來說似乎很多步驟。任何其他方式設置sqlplus在「無法連接」給出一個「錯誤」返回碼的模式?

+1

說實話,我認爲從雙選擇的方式是檢查它的最好方法。這裏是另一個線程與非常相似的主題:http://dba.stackexchange.com/questions/4718/how-check-that-the-oracle-database-is-up – Kacper

+0

這就是我害怕。如果我真的可以連接,我可以像[這裏](http://stackoverflow.com/a/18111656/6019417)那樣更改SQLPLUS返回碼。但我不知道我能否連接。 –

+0

我不得不看更深一點,它在那裏:https://stackoverflow.com/questions/2254761/sqlplus-force-it-to-return-an-error-code –

回答

6

多虧了@Kacper給出的參考,我能夠適應這個sqlplus /nolog到我的情況;這裏的想法:

  1. 只開放sqlplus無需連接
  2. 設置一個特定的返回碼上SQLERROR - 這是當connect失敗
  3. 返回代碼可以收集作爲主叫腳本通常會發生什麼:

a.sh

sqlplus /nolog << EOF 
WHENEVER SQLERROR EXIT 50 
WHENEVER OSERROR EXIT 66 
connect /@${MISTERY_DB} 
exit; 
EOF 

接着,電話:

/ju $ export MISTERY_DB="eg_NON_EXISTING_DB" 
/ju $ a.sh 
SQL*Plus: Release 11.2.0.4.0 Production on Tue Nov 29 08:43:44 2016 
Copyright (c) 1982, 2013, Oracle. All rights reserved. 
SQL> SQL> SQL> ERROR: 
    ORA-12154: TNS:could not resolve the connect identifier specified 
/ju $ echo $? 
50 

而且相關:Connect to sqlplus in a shell script and run SQL scripts

1

這裏是另一個解決方案,您可以使用:WHENEVER SQLERROR sql.sqlcode作品對我來說(上的Oracle 11g):

# try a simple SELECT FROM DUAL on previously defined database in var MY_DB 
sqlplus -s /@${MY_DB} << EOF 
    whenever sqlerror exit sql.sqlcode; 
    select 1 from dual; 
    exit; 
EOF 
ERR_CODE=$? # then $? is loaded with error received 
if [[ 0 != "${ERR_CODE}" ]] ; then 
    echo could not connect :\(
else 
    echo connection succeeded 
fi