用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.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无法联通。
(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启动后,无法检测实例状态,即便是成功侦听。
(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启动后,无法检测实例状态,即便是成功侦听。
本文转自 dannyy1026 51CTO博客,原文链接:http://blog.51cto.com/dannyyuan/70760