The-listener-supports-no-services

问题描述 实例没有注册到监听里面

The listener supports no services

什么是注册

注册就是将数据库作为一个服务注册到监听程序。
客户端不需要知道数据库名和实例名,只需要知道该数据库对外提供的服务名就可以申请连接到数据库。

这个服务名可能与实例名一样,也有可能不一样。

在数据库服务器启动过程中,数据库服务器会向监听程序注册相应的服务(无论何时启动一个数据库,默认地都有两条信息注册到监听器中:数据库服务器对应的实例和服务)

监听程序所处位置及作用

在数据库服务器和客户端之间有一监听程序(Listener),在监听程序中,会记录相应数据库对应的服务名(一个数据库可能对应有多个服务名),当客户端需要连接数据库时,只需要提供服务名,就可以建立客户端和服务器之间的连接.
Listener监听

没有监听程序会怎样

能不能连接数据库?

如果在ORACLE服务器是在本机安装的,可以通过sqlplus username/passwd 连接

1
2
3
4
5
6
7
8
9
10
11
12
[oracle@oracle11g ~]$ sqlplus system/123456
SQL*Plus: Release 11.2.0.4.0 Production on Tue Aug 23 08:44:01 2016
Copyright (c) 1982, 2013, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL>

无法通过监听连接服务器

1
sqlplus username/passwd@listener

1
2
3
4
5
6
7
8
9
10
11
[oracle@oracle11g ~]$ sqlplus system/123456@orcl
SQL*Plus: Release 11.2.0.4.0 Production on Tue Aug 23 08:44:56 2016
Copyright (c) 1982, 2013, Oracle. All rights reserved.
ERROR:
ORA-12541: TNS:no listener
Enter user-name:

监听服务名和实例名

listener.ora
配置的是监听服务

1
2
3
4
5
6
7
8
9
10
11
12
# listener.ora Network Configuration File: /u01/app/oracle/product/11.2.0/dbhome_1/network/admin/listener.ora
# Generated by Oracle configuration tools.
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.56.2)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)
ADR_BASE_LISTENER = /u01/app/oracle

tnsnames.ora
里面配置的是监听服务名与实例名的对应关系

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
find /u01 -name tnsnames.ora
/u01/app/oracle/product/11.2.0/dbhome_1/network/admin/samples/tnsnames.ora
/u01/app/oracle/product/11.2.0/dbhome_1/network/admin/tnsnames.ora
# tnsnames.ora Network Configuration File: /u01/app/oracle/product/11.2.0/dbhome_1/network/admin/tnsnames.ora
# Generated by Oracle configuration tools.
ORCL =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.56.2)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = oracle11g))
)
)
#ORCL是服务名,oracle11g是实例名

主动监听和被动监听

可以使用命令lsnrctl status来查看某服务是静态注册还是动态注册。
实例状态为UNKNOWN值时表明此服务是静态注册的设置。
这时监听器用来表明它不知道关于该实例的任何信息,只有当客户发出连接请求时,它才检查该实例是否存在。
动态监听的状态是READY。

解决办法1

在listener.ora上面添加一行

1
2
3
4
5
6
7
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = oracle11g)
(SID_NAME = oracle11g)
)
)

解决方法2

先启动监听程序,后启动实例

解决方法3

启动实例后,手动注册
手动注册

参考链接

ORACLE监听之动态监听与静态监听特点