TNSNAMES配置中空格導致的bug

2021-06-13 16:12:54 字數 3344 閱讀 2494

發現乙個很有趣的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 ...