对Oracle数据库的访问是CS结构,数据库服务器作为server端,在客户端需要和server端建立连接,在网络底层通信都是通过TCP/IP协议,当在客户端的应用程序去访问数据库服务器的时候,通过TCP/IP连接到listener,listener作用是监听客户端发送雇来的连接请求,并且接收到连接请求之后,会派生server进程和客户端进程建立会话,在server端需要配置listener,在客户端可以配置多种方式去连接oracle服务器,如easyconnect,tnsname本地命名服务。
在建立数据库会建立一个默认的listener,这个默认的listener就可以保证数据库正常访问了,但是在业务比较繁忙的时候可能会配置非默认listener。
默认监听名字叫listener,可以看到默认监听的信息,日志文件配置文件和端口号的信息。
可以看到实例被动态注册到监听之后的状态是ready,要想实现实例的动态注册就要将实例启动到mount状态之后。
SQL> startup force nomount;
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=Database2)(PORT=1521)))
Services Summary...
Service "oradba" has 1 instance(s).
Instance "oradb", status BLOCKED, has 1 handler(s) for this service...
The command completed successfully
可以看到是blocked的状态,代表实例现在是nomount状态,nomount状态的实例是不允许被访问的。
服务端和server端通过监听具体建立连接过程如下图
[oracle@Database2 ~]$ sqlplus /nolog --远程使用用户建立连接
SQL*Plus: Release 11.2.0.4.0 Production on Thu Dec 12 05:47:46 2019
Copyright (c) 1982, 2013, Oracle. All rights reserved.
SQL> connect scott/123456@172.25.254.135:1521/oradba
Connected.
SQL> select username,sid,program,server from v$session where username='SCOTT'; --可以查询到用户连接信息
USERNAME SID PROGRAM SERVER
------------------------------ ---------- ------------------------------ ---------
SCOTT 28 sqlplus@Database2 (TNS V1-V3) DEDICATED
[oracle@Database2 ~]$ lsnrctl stop --将监听关闭
SQL> select username,sid,program,server from v$session where username='SCOTT';
USERNAME SID PROGRAM SERVER
------------------------------ ---------- ------------------------------ ---------
SCOTT 28 sqlplus@Database2 (TNS V1-V3) DEDICATED
现在将监听关闭
SQL> !lsnrctl stop
LSNRCTL for Linux: Version 11.2.0.4.0 - Production on 12-DEC-2019 05:57:17
Copyright (c) 1991, 2013, Oracle. All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521)))
The command completed successfully
SQL> / --但是还是可以看到之前用户建立的连接并未断开
USERNAME SID PROGRAM SERVER
------------------------------ ---------- ------------------------------ ---------
SCOTT 28 sqlplus@Database2 (TNS V1-V3) DEDICATED
SQL> connect scott/123456@172.25.254.135:1521/oradba --但是新来的连接是建立失败的因为监听已经关闭了
ERROR:
ORA-12541: TNS:no listener
Warning: You are no longer connected to ORACLE.
最后看一下默认监听的配置文件,注意这里的localhost对应的是/etc/hosts下面localhost转换Ip。
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
)
)