前幾天在RedHat AS 4.1上安裝Oracle 10G ,在建立資料庫的過程中始終報告:
ORA-12154: TNS:could not resolve service name。 不知道為什麼這樣,然後就到網上到處搜尋解決辦法。每一種可能想到的原因試了,Oracle 10G裝了不下10詞,那天晚上我忙活到淩晨2點。所有可能想到的原因都試了一遍。昨天晚上又作最後的掙紮,那個痛苦真的無法形容。有時候解決問題的辦法,是瞬間的事情,你說是從石頭縫裡蹦出來的也可以。總之那也是無法形容的幸福。好說了半天沒有把事情的本質告訴大家。
那就是Oracle使用者的密碼千萬不要含有"@"字元。雖然這個世界上絕大部分Oracle資料庫工具包括第三方的軟體都不會拒絕密碼含有"@"字元的使用者串連,但是SQLPLUS卻拒絕了。後來我想想原因可能是SQLPLUS錯誤地解析了串連串中的TNSName.
例如:你有一個TNSName是SZVW1047, 設定System的密碼為I@SUZHOU
現用SQLPLUS 串連:
SQL> conn system@szvw1047
Enter password:
ERROR:
ORA-12154: TNS:could not resolve service name
Warning: You are no longer connected to ORACLE.
他是怎麼錯誤的解析了,我的猜想是SQLPLUS將使用者密碼和system@szvw1047 串連在一起:system/I@SUZHOU@szvw1047 然後執行conn system/I@SUZHOU@szvw1047,結果sqlplus分析出的tnsname為"SUZHOU@szvw1047",密碼為"I",這時候當然報告could not resolve service name。 下面是我重新更改system密碼為"hello"後的串連情況:
SQL> conn system@szvw1047
Enter password:
ERROR:
ORA-12154: TNS:could not resolve service name
SQL> conn /@szvw1047 as sysdba
Connected.
SQL> alter user system identified by "hello"
2 /
User altered.
SQL> conn system@szvw1047
Enter password:
Connected.
SQL>
那事實又是怎樣的呢,為了探清事實的真相,我在SQLNET.ORA添加了兩行,以便跟蹤用戶端的串連:
TRACE_LEVEL_CLIENT = ADMIN
TRACE_DIRECTORY_CLIENT = /Client
這兩行的含義是開啟客戶的跟蹤,並將跟蹤資訊寫到/Client,接著作了下面的動作:
SQL> conn system@szvw1047
Enter password:
ERROR:
ORA-12154: TNS:could not resolve service name
查看追蹤檔案,截取一段如下:
nnfgrne: Going though read path adapters
nnfgrne: Switching to DCE adapter
nnfgrne: Original name: SUZHOU
nnfgrne: Name did not qualify, skipping to next adapter
nnfgrne: Switching to CDS adapter
nnfgrne: Original name: SUZHOU
nnfgrne: Name did not qualify, skipping to next adapter
nnfgrne: Switching to TNSNAMES adapter
nnfgrne: Original name: SUZHOU
nnftqnm: entry
nnfcagmd: entry
nnfcagmd: Attribute name a.smd is a predefined meta type, syntax is 4.
nnfcagmd: exit
nnfgrne: Query unsuccessful, skipping to next adapter
nnfgrne: Switching to ONAMES adapter
nnfgrne: Original name: SUZHOU
nngtnms_new_msg: new message, ID 26752, type 100
nngtnms_new_msg: initial message pool block, size 2
nngtrms_release_msg: entry
nngtrms_release_msg: exit
nnfgrne: Query unsuccessful, skipping to next adapter
nnfgrne: Switching to ONRS adapter
nnfgrne: Original name: SUZHOU
nngtnms_new_msg: new message, ID 26753, type 100
nngtrms_release_msg: entry
nngtrms_release_msg: exit
nnfgrne: Query unsuccessful, skipping to next adapter
nnfgrne: Switching to HOSTNAME adapter
nnfgrne: Original name: SUZHOU
nnfhqnm: entry
nnfcagmd: entry
nnfcagmd: Attribute name a.smd is a predefined meta type, syntax is 4.
nnfcagmd: exit
從這個檔案可以看出與我的想象差別不大,只不過分析出來的名稱不是SUZHOU@szvw1047,而是SUZHOU.
真的讓人意想不到,Oracle竟然犯這種低級錯誤。