用Oracle有一段时间了,总是会出现一些奇怪的问题。最近在配置LISTENER.ORA和TNSNAMES.ORA文件时,竟然也出现了无法联通的问题,TNSPING能通过,但SQLPLUS无法成功。报出连接的常见的12514错误。
我的开始配置文件listener.ora是这样的:
LISTNER.ORA
 SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = PLSExtProc)
      (ORACLE_HOME = /u00/app/oracle/product/10.2.0/db)
      (PROGRAM = extproc)
    )
  )
LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.200)(PORT = 1521))
    )
  )
 
  mydb =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.200)(PORT = 1521))
    )
  )
同样的配置在开发环境中TNSLISTEN没有什么问题,能侦听mydb实例,在生产环境中就发现不行,出现TNSPING没问题,SQLPLUS无法联通。
后来把mydb段删除,在SID_LIST_LISTENER里加如下SID_DESC后才能侦听我的数据库实例。
     (SID_DESC =
      (SID_NAME = mydb)       
      (ORACLE_HOME = /u00/app/oracle/product/10.2.0/db)
      (GLOBAL_DBNAME=mydb.domain.com)  
    )
其中SID_NAME,GLOBAL_DBNAME可以全带,也可以只带其中一项。针对LISTENER的配置,TNSNAMES.ORA的配置会有所变化。如果带SID,则TNS可用用SID
来实现联接,如果LISTENER带GLOBAL_DBNAME,则可以用SERVICE_NAME来实现联接
如SERVICE_NAME
mydbname =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.200)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = mydb.domain.com)
    )
  )
 
 或SID
 mydbname =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.200)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SID = mydb)
    )
  )
 如LISTENER两者都带,则TNSNAMES两种方法均可。
 开发环境中,这种配置可以自动支持两种方法的,域名为机器所在域名即可。
 问题1、在于产品环境不为什么不支持这种配置方法?
 问题2、用开发环境配置时,服务器端SQLPLUS无法成功后报12514错误,接着输入用户名/密码能联通,估计用SID直接联?在SQLPLUS带会强制TNSNAMES解析?
 问题3、LSNCTL启动后,无法检测实例状态,即便是成功侦听。