问题描述
第一天安装好oracle11g和plsql,并测试一切正常,可以连接和访问,愉快关掉电脑,第二天到公司用plsql连接oracle的时候提示ORA-12514: TNS:监听程序当前无法识别连接描述符中请求的服务解决方案,what?昨天还好好的,今天就不行了,郁闷至极。。
问题排查测试;
用sqlplus连接,发现 通过 conn sys/orcl as sysdba;是可以连接的,只是通过127.0.0.1:1521/orcl连接的时候不可以,于是猜测是因为监听服务的原因导致的。熟练的打开百度,搜索问题,网上有很多资料,大多是说需要配置listener.org文件,按照网上的提示配置listener.org文件,配置内容如下,并重启监听服务,又去尝试连接,结果还是提示监听程序当前无法识别连接描述符中请求的服务解决方案,很郁闷,调试了一上午也没解决,包括重启电脑,重启服务,均未果。
# listener.ora Network Configuration File: E:\app\EDZ\product\11.2.0\dbhome_1\NETWORK\ADMIN\listener.ora
# Generated by Oracle configuration tools.
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = CLRExtProc)
(ORACLE_HOME = E:\app\EDZ\product\11.2.0\dbhome_1)
(PROGRAM = extproc)
(ENVS = "EXTPROC_DLLS=ONLY:E:\app\EDZ\product\11.2.0\dbhome_1\bin\oraclr11.dll")
)
(SID_DESC =
(GLOBAL_DBNAME = orcl)
(ORACLE_HOME = E:\app\EDZ\product\11.2.0\dbhome_1)
(SID_NAME = orcl)
)
)
LISTENER =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = WINDOWS-LGSV51L)(PORT = 1521))
)
ADR_BASE_LISTENER = E:\app\EDZ
第二天来到公司,猜想着可能是oracle数据库出问题了,狠心卸载掉oracle11g数据库,并重新安装,又满怀信心的去用plsql连接,发现还是和之前一样的提示,当场去世,安装过程和之前一样,应该不会又问题的啊。后来又准备去检查listener.org文件,发现在oracle的安装目录E:\app\EDZ\product\11.2.0\dbhome_1\NETWORK\ADMIN路径下竟然没有listener.org文件。再次打开百度查询资料,终于找见问题所在,原来是在使用plsql的时候配置了一个TNS_ADMIN的环境变量,这里的地址引用的是plsql的一个安装目录,将这个参数的目录修改为oracle11g的安装目录E:\app\EDZ\product\11.2.0\dbhome_1\NETWORK\ADMIN,并通过Oracle - OraDb11g_home1-->配置和移植工具-->Net Manager/Net Configuration Assistant重新配置监听就会重新生成listener.org和tnsnames.org文件,这里说明下listener.org和tnsnames.org两个配置文件的作用
listener.ora是服务器端用的,oracle监听程序,就是读的这个文件,里面有oracle服务器端的socket监听地址和端口(
如果要想局域网中的其他人,能够访问我本地的oracle,要把我本机的地址写进去,如10.11.19.19
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.11.19.19)(PORT = 1521))
)
)
tnsnames.ora是记录客户端访问数据库的本地配置:
客户端是通过tnsnames.ora来识别连接服务器的
如果你没有添加tnsnames.ora,那么你就连接不上服务器的。。
文件地址:\oracle\product\10.2.0\db_1\NETWORK\ADMIN
ORCL =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 主机地址)(PORT = 端口))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
)
(1)如果tnsnames中的service_name配置错误,配置成了instance_name了,这个时候会发生tnsping能通,但是sqlplus连接不上的奇怪情况。报错ORA-12514:listener could not resolve SERVICE_NAME given in connect descriptor。这个时候查错的时候,需要检查对应的service_name。
其中,每个部分的解释如下所示:
l PROTOCOL:客户端与服务器端通讯的协议,一般为TCP,该内容一般不用改。
2 HOST:数据库所在的机器的主机名或IP地址。不管用主机名还是IP地址,在客户端一定要用ping命令ping通数据库所在的机器,否则需要在hosts文件中加入数据库所在的机器的主机名和IP地址的对应关系。
3 PORT:数据库监听器的端口,可以查看服务器端的listener.ora文件或在数据库服务器中通过lsnrctl status [listener name]命令来查看。一般为1521端口。
4 SERVICE_NAME:在数据库中使用“SHOW PARAMETER SERVICE_NAME”命令查看,一般情况下和DBNAME相同
PLSQL客户端
理解了这两个文件的作用和用法,又接着了解了监听 静态注册和动态注册,对于静态监听和动态监听网上有很多资料,这里就不做赘述,这里贴一点对自己有启发的东西
oracle实例运行后,监听程序启动时,根据listener.ora的配置注册相应的服务。
其中global_dbname对应的是oracle对外的服务名,即初始化参数里的service_names
而sid_name对应的是oralce实例的名称,即初始化参数里的instance_name
1.监听器不是最早启动,oracle实例先启动
2.监听器重启
3.oracle实例没有open
可以使用命令lsnrctl status来查看某服务是静态注册还是动态注册。
实例状态为UNKNOWN值时表明此服务是静态注册的设置。这时监听器用来表明它不知道关于该实例的任何信息,只有当客户发出连接请求时,它才检查该实例是否存在。
动态注册的数据库通过状态信息中的状态READY或状态BLOCKED(对于一个备用数据库)来指明。不管关闭何时数据库,动态注册的数据库都会动态地从 监听器注销,而与之相关的信息将从状态列表中消失。这样,不管数据库是在运行还是已经关闭,监听器总是知道它的状态。该信息将被用于连接请求的回退(fallback)和负载平衡。
解决方案:
最后分析问题还是发生在listener.org和tnsnames.org配置文件上,重新研究分析后,按照如下配置,并重启oracle server和listener服务,问题解决,配置内容如下,大家可参考修改
在oracle安装目录下E:\app\EDZ\product\11.2.0\dbhome_1\NETWORK\ADMIN配置listener.org和tnsnames.org文件
# listener.ora Network Configuration File: E:\app\EDZ\product\11.2.0\dbhome_1\NETWORK\ADMIN\listener.ora
# Generated by Oracle configuration tools.
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = CLRExtProc)
(ORACLE_HOME = E:\app\EDZ\product\11.2.0\dbhome_1)
(PROGRAM = extproc)
(ENVS = "EXTPROC_DLLS=ONLY:E:\app\EDZ\product\11.2.0\dbhome_1\bin\oraclr11.dll")
)
(SID_DESC =
(GLOBAL_DBNAME = orcl)
(ORACLE_HOME = E:\app\EDZ\product\11.2.0\dbhome_1)
(SID_NAME = orcl)
)
)
LISTENER =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = WINDOWS-LGSV51L)(PORT = 1521))
)
ADR_BASE_LISTENER = E:\app\EDZ
# tnsnames.ora Network Configuration File: E:\app\EDZ\product\11.2.0\dbhome_1\NETWORK\ADMIN\tnsnames.ora
# Generated by Oracle configuration tools.
ORCL =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = orcl)
)
)
也可以通过Oracle - OraDb11g_home1-->配置和移植工具-->Net Manager进行配置监听程序和服务命名
参考博客:https://bbs.csdn.net/topics/390279484
https://blog.csdn.net/lvbang_lzt/article/details/53187647#commentBox
https://blog.csdn.net/tianlesoftware/article/details/5543166