1. 程式人生 > 其它 >listener.ora,tnsnames.ora中一個空格的威力

listener.ora,tnsnames.ora中一個空格的威力

最近幾天被網路監聽配置搞得焦頭爛額,有時候配置沒問題,有時候就出莫名其妙的問題,今天專門花時間總結了一下,希望對大家有所幫助。

listener.ora,tnsnames.ora有時候沒有netca,netmgr這樣的圖形工具來建立的時候,只能手工來做,手工做的時候會有一些格式的問題,多加一個空格,或者少一個空格,就會有不同的結果。

案例一

下面是一個監聽的基本配置,我故意在前面多加了一個空格(黃色標記所示)。

 LISTE1=
  (DESCRIPTION=
    (ADDRESS_LIST=
      (ADDRESS=(PROTOCOL=tcp)(HOST=oel1.oracle.com)(PORT=1521)
 )
 )
)
SID_LIST_LISTE1=
(SID_LIST=
    (SID_DESC=
      (GLOBAL_DBNAME=PROD)
      (ORACLE_HOME=/u01/app/oracle/product/10.2.0/db_1)
      (SID_NAME=PROD)
 )
)

啟動的時候非常緩慢,然後報出了沒有監聽liste1的資訊。這種情況跟沒有listener.ora的情況下直接起監聽的結果一樣,說明解析Listener.ora的時候,沒有找到相關的listener資訊。

LSNRCTL> start liste1
Starting /u01/app/oracle/product/10.2.0/db_1/bin/tnslsnr: please wait...
TNSLSNR for Linux: Version 10.2.0.1.0 - Production
System parameter file is /u01/app/oracle/product/10.2.0/db_1/network/admin/listener.ora
Log messages written to /u01/app/oracle/product/10.2.0/db_1/network/log/liste1.log
TNS-01151: Missing listener name, liste1, in LISTENER.ORA
Listener failed to start. See the error message(s) above...

然後刪除那個空格後,監聽啟動就沒有問題。

案例二

在倒數第2行的右括號,一個是頂格的,一個前面有一個空格。

LISTE1=
  (DESCRIPTION=
    (ADDRESS_LIST=
      (ADDRESS=(PROTOCOL=tcp)(HOST=oel1.oracle.com)(PORT=1521))
 )
)
SID_LIST_LISTE1=
  (SID_LIST=
    (SID_DESC=
      (GLOBAL_DBNAME=PROD)
      (ORACLE_HOME=/u01/app/oracle/product/10.2.0/db_1)
      (SID_NAME=PROD)
)
)

啟動監聽的時候,報出了另外的錯誤,說sid_list_liste1的地方有問題。錯誤資訊如下:

LSNRCTL> start liste1
Starting /u01/app/oracle/product/10.2.0/db_1/bin/tnslsnr: please wait...
TNSLSNR for Linux: Version 10.2.0.1.0 - Production
System parameter file is /u01/app/oracle/product/10.2.0/db_1/network/admin/listener.ora
Log messages written to /u01/app/oracle/product/10.2.0/db_1/network/log/liste1.log
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=oel1.oracle.com)(PORT=1521)))
TNS-01155: Incorrectly specified SID_LIST_liste1 parameter in LISTENER.ORA
 NL-00303: syntax error in NV string
Listener failed to start. See the error message(s) above...

如果改成如下的形式,多加了一個空格,監聽啟動就沒有問題了。

LISTE1=
  (DESCRIPTION=
    (ADDRESS_LIST=
      (ADDRESS=(PROTOCOL=tcp)(HOST=oel1.oracle.com)(PORT=1521))
 )
)
SID_LIST_LISTE1=
  (SID_LIST=
    (SID_DESC=
      (GLOBAL_DBNAME=PROD)
      (ORACLE_HOME=/u01/app/oracle/product/10.2.0/db_1)
      (SID_NAME=PROD)
 )
)

案例三

有的朋友可能說你這個鑽牛角尖了,如果是倒數第三行,第四行的話行不行?

我試了一下,故意把address後面的右括號放到了下一行,然後頂格。

LISTE1=
  (DESCRIPTION=
    (ADDRESS_LIST=
      (ADDRESS=(PROTOCOL=tcp)(HOST=oel1.oracle.com)(PORT=1521)
)
 )
)

啟動監聽的時候還是報錯,這次貌似指向的錯誤資訊更明確了。

LSNRCTL> start liste1
Starting /u01/app/oracle/product/10.2.0/db_1/bin/tnslsnr: please wait...
TNSLSNR for Linux: Version 10.2.0.1.0 - Production
System parameter file is /u01/app/oracle/product/10.2.0/db_1/network/admin/listener.ora
Log messages written to /u01/app/oracle/product/10.2.0/db_1/network/log/liste1.log
TNS-01150: The address of the specified listener name is incorrect
Listener failed to start. See the error message(s) above...

改成如下的形式,監聽馬上好了。

LISTE1=
  (DESCRIPTION=
    (ADDRESS_LIST=
      (ADDRESS=(PROTOCOL=tcp)(HOST=oel1.oracle.com)(PORT=1521)
 )
 )
)

案例四

Listener.ora的情況在tnsnames.ora裡也是一樣的情況,不過報錯是ORA的錯誤,有一個好處是都是ORA-12154錯誤。

PROD=
(DESCRIPTION= 
 (ADDRESS=(PROTOCOL=tcp)(HOST=oel1.oracle.com)(PORT=1521))
 (ADDRESS=(PROTOCOL=tcp)(HOST=oel1.oracle.com)(PORT=1525))
 (CONNECT_DATA=(SERVICE_NAME=PROD)
)
)
[oracle@oel1 admin]$ sqlplus system/oracle@PROD
SQL*Plus: Release 10.2.0.1.0 - Production on Sun Dec 1 16:55:03 2013
Copyright (c) 1982, 2005, Oracle.  All rights reserved.
ERROR:
ORA-12154: TNS:could not resolve the connect identifier specified

案例五

多加一個空格,報錯也是ora-12154

 PROD=
(DESCRIPTION= 
 (ADDRESS=(PROTOCOL=tcp)(HOST=oel1.oracle.com)(PORT=1521))
 (ADDRESS=(PROTOCOL=tcp)(HOST=oel1.oracle.com)(PORT=1525))
 (CONNECT_DATA=(SERVICE_NAME=PROD))
)
[oracle@oel1 admin]$ sqlplus system/oracle@PROD
SQL*Plus: Release 10.2.0.1.0 - Production on Sun Dec 1 17:28:47 2013
Copyright (c) 1982, 2005, Oracle.  All rights reserved.
ERROR:
ORA-12154: TNS:could not resolve the connect identifier specified

成功例子

最後貼出能夠正確識別的Listener.ora和tnsnames.ora (格式當然不是很好)

listener.ora
LISTE1=
  (DESCRIPTION=
    (ADDRESS_LIST=
      (ADDRESS=(PROTOCOL=tcp)(HOST=oel1.oracle.com)(PORT=1521)
 )
 )
)
SID_LIST_LISTE1=
(SID_LIST=
    (SID_DESC=
      (GLOBAL_DBNAME=PROD)
      (ORACLE_HOME=/u01/app/oracle/product/10.2.0/db_1)
      (SID_NAME=PROD)
 )
)
tnsnames.ora
PROD=
(DESCRIPTION= 
 (ADDRESS=(PROTOCOL=tcp)(HOST=oel1.oracle.com)(PORT=1521))
 (ADDRESS=(PROTOCOL=tcp)(HOST=oel1.oracle.com)(PORT=1525))
 (CONNECT_DATA=(SERVICE_NAME=PROD))
)

來一個成功連線的例子收尾:

[oracle@oel1 admin]$ sqlplus system/oracle@PROD
SQL*Plus: Release 10.2.0.1.0 - Production on Sun Dec 1 17:00:46 2013
Copyright (c) 1982, 2005, Oracle.  All rights reserved.
Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options