發現乙個很有趣的bug,tnsnames.ora中缺少空格導致ora-12154錯誤。
還是看乙個具體的例子:
test08 =
(description =
(address = (protocol = tcp)(host = 172.25.13.229)(port = 1521))
(connect_data =
(server = dedicated)
(service_name = test08)))
由於網頁顯示的時候,會自動吞掉所有的前導空格,下面將上面真正的配置中的前導空格用下劃線來代替:
test08 =
__(description =
____(address = (protocol = tcp)(host = 172.25.13.229)(port = 1521))
____(connect_data =
______(server = dedicated)
______(service_name = test08)
____)
__)這是乙個普通到不能再普通的tns配置了。
下面通過這個配置來連線資料庫:
sql*plus: release 10.2.0.1.0 - production on 星期一 7月 13 21:02:36 2009
sql> conn test/test@test08已連線。
顯然可以連線到目標資料庫。
下面將配置裡面的前導空格完全刪除:
test08 =
(description =
(address = (protocol = tcp)(host = 172.25.13.229)(port = 1521))
(connect_data =
(server = dedicated)
(service_name = test08)))
這次沒有必要用下劃線替換前導空格了,因為二者的格式完全一樣。
再次連線資料庫:
sql> conn test/test@test08
error:
ora-12154: tns: 無法解析指定的連線識別符號
警告: 您不再連線到 oracle。
很奇怪,只是刪除了一些無關緊要的空格,就導致了tnsnames解析錯誤。
於是逐漸的還原空格,尋找到底是**的空格被刪除後,導致了這個錯誤的產生:
test08 =
(description =
(address = (protocol = tcp)(host = 172.25.13.229)(port = 1521))
(connect_data =
(server = dedicated)
(service_name = test08)))
最終發現其他的空格都無所謂,只是service_name下一行的前導空格會影響tnsnames的解析。
替換下劃線的版本為:
test08 =
__(description =
____(address = (protocol = tcp)(host = 172.25.13.229)(port = 1521))
____(connect_data =
______(server = dedicated)
______(service_name = test08)
)__)
這時連線就會報錯:
sql> conn test/test@test08
error:
ora-12154: tns: 無法解析指定的連線識別符號
而只要在這一行前面加上乙個空格,或者刪除掉service_name這一行的回車換行符,使得這個括號回到service_name的同一行,都可以順利的連線到目標資料庫。
使用tnsping命令監測,發現這種情況下,tnsname在解析的時候丟失了最後兩個右括號資訊,造成ora-12533錯誤:
e:>tnsping test08
tns ping utility for 32-bit windows: version 10.2.0.1.0 - production on 13-7月 -
2009 21:27:10
已使用的引數檔案:
e:oracleoracle1020networkadminsqlnet.ora
已使用 tnsnames 介面卡來解析別名
attempting to contact (description = (address = (protocol = tcp)(host = 172.25.1
3.229)(port = 1521)) (connect_data = (server = dedicated) (service_name = test08
)tns-12533: tns: 非法的 address 引數
而正常的tnsnames解析如下:
e:>tnsping test08
tns ping utility for 32-bit windows: version 10.2.0.1.0 - production on 13-7月 -
2009 21:29:00
已使用的引數檔案:
e:oracleoracle1020networkadminsqlnet.ora
已使用 tnsnames 介面卡來解析別名
attempting to contact (description = (address = (protocol = tcp)(host = 172.25.1
3.229)(port = 1521)) (connect_data = (server = dedicated) (service_name = test08
)))ok (270 毫秒)
上面的測試是在10.2.0.1的windows版本上進行的。
在9i上測試發現同樣的問題,不過錯誤資訊略有區別:
sql*plus: release 9.2.0.4.0 - production on 星期一 7月 13 21:32:34 2009
sql> conn test/test@test08
error:
ora-12154: tns: 無法處理服務名
最後看看11g的情況:
e:>sqlplus /nolog
sql*plus: release 11.1.0.6.0 - production on 星期一 7月 13 21:36:38 2009
sql> conn test/test@test08
error:
ora-12154: tns: 無法解析指定的連線識別符號
11g中的錯誤和10g一致,不知道是否oracle根本沒有發現這個問題。這麼簡單的錯誤居然在3個大版本中都存在。
html中空格顯示
html提供了5種空格實體 space entity 它們擁有不同的寬度,非斷行空格 是常規空格的寬度,可執行於所有主流瀏覽器。其他幾種空格 在不同瀏覽器中寬度各異。它叫不換行空格,全稱no break space,它是最常見和我們使用最多的空格,大多數的人可能只接觸了 它是按下space鍵產生的空...
properties配置檔案中空格引發的血案
今天翻起以前空閒時候做的專案,剛起服務的時候就遇到了問題,直接報連不到資料庫,error querying database.cause org.springframework.jdbc.cannotgetjdbcconnectionexception could not get jdbc conn...
程式設計中空格的使用
空行 l 空行起著分隔程式段落的作用。空行得體 不過多也不過少 將使程式的布局更加清晰。空行不會浪費 記憶體,雖然列印含有空行的程式是會多消耗一些紙張,但是值得。所以不要捨不得用空行。l 在每個類宣告之後 每個函式定義結束之後都要加空行。l 在乙個函式體內,邏揖上密切相關的語句之間不加空行。行 l ...