ORA-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务,这是一个经常遇到的问题,可以按照以下步骤一步步解决
1.使用tnsping检测
tnsping可判断出以下两点
(1)判断网络是否连通
(2)判断服务器端的监听服务是否开启
使用tnsping可以ping通,说明以上两点都是没问题的
本地打开cmd命令行窗口,输入以下命令
tnsping 服务名
或
tnsping ip地址:端口号/数据库服务名
若ping不通,可检查以下两点
1.检查服务器端的防火墙是否开启了数据库的端口(默认端口:1521)
2.使用命令lsnrctl status
检查服务器端监听是否开启
2.检查服务器端的监听配置文件listener.ora
linux中listener.ora默认位置
/data/oracle/product/11.2.0/db_1/network/admin/listener.ora
原始内容:
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
)
)
ADR_BASE_LISTENER = /data/oracle
修改为:
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = orcl)
(ORACLE_HOME = /data/oracle/product/11.2.0/db_1)
(SID_NAME = orcl)
)
)
LISTENER = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.78.130)(PORT = 1521)))
ADR_BASE_LISTENER = /data/oracle
注意其中的GLOBAL_DBNAME
为全局数据库名,SID_NAME
服务端数据库实例名,HOST
这个填写服务端ip地址
2.检查服务配置文件tnsnames.ora
可能出现问题:
1.服务端中tnsnames.ora配置的HOST
值默认为localhost,应改成服务端ip地址或主机名
2.本地与服务端tnsnames.ora配置的SERVICE_NAME
名称不一致
3.本地与服务端tnsnames.ora配置的连接方式不一致,一个使用SID
(实例名),一个使用SERVICE_NAME
(服务名)
linux中tnsnames.ora默认位置
/data/oracle/product/11.2.0/db_1/network/admin/tnsnames.ora
以下为问题2,3的例子
问题2:
本地的tnsnames.ora
testOrcl =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 服务端ip地址)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME= orcl)
(SERVER = DEDICATED)
)
)
服务端上的tnsnames.ora
orcl =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 服务端ip地址)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = orcldb)
(SERVER = DEDICATED)
)
)
问题:SERVICE_NAME
服务名不一致
解决办法:改成一致
问题3:
本地的tnsnames.ora
testOrcl =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 服务端ip地址)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME= orcl)
(SERVER = DEDICATED)
)
)
服务端上的tnsnames.ora
orcl =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 服务端ip地址)(PORT = 1521))
)
(CONNECT_DATA =
(SID = orcl)
(SERVER = DEDICATED)
)
)
问题:服务器上的服务配置的是SID
解决办法:则本地应改成SID = orcl
或将服务器上的改成SERVICE_NAME= orcl
3.重启服务端数据库监听
//停止监听服务
lsnrctl stop
//打开监听服务
lsnrctl start
//查看监听服务状态
lsnrctl status