概念:Oracle网络服务在服务端是通过监听器的进程来实现的,在oracle中,最常见的连接方式是专用连接
服务器进程与用户进程为一一对应的关系,一旦用户进程中断,其对应的服务器进程也被终止。
监听:用户连接监听,监听知道数据库在什么位置,他们之间没有长连接,监听和数据库之间没有必然联系,但是相互之间可以找到,他们之间没有长连接,监听只做一件事情就是在建立连接的时候起作用,负责转发。

1、客户端发起连接:通过在客户端提供用户名、密码、以及连接字符串等信息,建立与监听器的连接。连接字符串位于客户端的文件里面,文件名字是tnsnames.ora,根据安装的客户端不同,放置在不同的目录里面。
监听把用户的连接请求转发给instance,实例会为这个连接启动一个Server Process, 同时会把Server Process的地址告诉监听,监听告诉客户端,然后客户端直接发起对Server Process的请求,同时把用户名和密码给Server Process,Server Process会验证,Server Process通过客户端输入的连接字符串,去到tnsnames.ora 里去找到host和端口,判断输入的端口和ip是否正确,如果正确则和监听建立连接。
2、客户端一旦与监听器建立连接,则在客户端生成用户进程,同时监听器会判断客户端所请求的服务名是否是自己所管理的服务名。
判断SERVICE_NAME是否正确:监听知道数据库在什么位置,监听会根据客户端输入的连接字符串信息找到tnsnames.ora文件里的SERVICE_NAME,检查SERVICE_NAME是否根自己所管理的服务名匹配(show parameter service),一旦匹配。建立成功连接,此时和监听没有任何关系。
例:如果客户端传过来的连接字符串不包含服务名,报错
如果请求的服务名不是自己管理的,报错并中断
如果请求的服务名是自己管理的,监听器就在数据库服务器上创建服务器进程
3、监听器在创建服务器进程以后,会将用户进程与服务器进程建立连接,之后,监听器退出与客户端的连接
4、服务器进程根据用户进程提供的用户名和密码到数据字典里判断是否正确
5、如果用户名和密码不匹配,报错,如果匹配,则分配PGA,并生成session








我们前面在配置listener的时候,并没有涉及到服务名的问题,客户端将服务名传给监听器以后,监听器的服务名来自何处?
1、动态注册
数据库实例里的PMON进程,将当前实例的服务名注册到同一台服务器上的,默认的,并在1521端口上监听的监听器(就是名为LISTENER的监听器),当前实例的服务名由初始化参数service_name决定。
SQL> show parameter service
NAME TYPE
------------------------------------ --------------------------------
VALUE
------------------------------
service_names string
jfdb
手工启用动态注册:
show parameter local_listener;
SQL> show parameter servrice_name;
SQL> show parameter service
NAME TYPE
------------------------------------ --------------------------------
VALUE
------------------------------
service_names string
jfdb
SQL> show parameter local_listener;
NAME TYPE
------------------------------------ --------------------------------
VALUE
------------------------------
local_listener string
(ADDRESS = (PROTOCOL =TCP)(HOS
T =jfdb)(PORT = 1523))
SQL> alter system set local_listener= '(ADDRESS = (PROTOCOL =TCP)(HOS
T =jfdb)(PORT = 1523))'; 2
System altered.
修改了这个参数以后 很快服务名就注册过来了
[oracle@jfdb admin]$ lsnrctl status
LSNRCTL for Linux: Version 11.2.0.4.0 - Production on 08-AUG-2022 14:56:19
Copyright (c) 1991, 2013, Oracle. All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=jfdb)(PORT=1523)))
STATUS of the LISTENER
------------------------
Alias LISTENER
Version TNSLSNR for Linux: Version 11.2.0.4.0 - Production
Start Date 08-AUG-2022 14:05:41
Uptime 0 days 0 hr. 50 min. 37 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /u01/app/oracle/product/11.2.0/network/admin/listener.ora
Listener Log File /u01/app/oracle/diag/tnslsnr/jfdb/listener/alert/log.xml
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=jfdb)(PORT=1523)))
Services Summary...
Service "jfdb" has 1 instance(s).
Instance "jfdb", status READY, has 1 handler(s) for this service...
The command completed successfully
静态注册:静态注册在监听启动的时候,立刻就将服务名注册到监听里去。
vim listener.ora
SID_LIST_LISTENER=
(SID_LIST=
(SID_DESC=
(GLOBAL_DBNAME=jfdb)
(ORACLE_HOME=/u01/app/oracle/product/11.2.0)
(SID_NAME=jfdb)
)
)
重启监听
lnsrctl stop
lnsrctl start
查看监听状态: status UNKNOWN是正常的 因为是手动注册的,所以数据库不知道有服务有没有注册到监听里去。
lnsrctl status
[oracle@jfdb admin]$ lsnrctl status
LSNRCTL for Linux: Version 11.2.0.4.0 - Production on 08-AUG-2022 16:48:00
Copyright (c) 1991, 2013, Oracle. All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=jfdb)(PORT=1523)))
STATUS of the LISTENER
------------------------
Alias LISTENER
Version TNSLSNR for Linux: Version 11.2.0.4.0 - Production
Start Date 08-AUG-2022 16:47:42
Uptime 0 days 0 hr. 0 min. 18 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /u01/app/oracle/product/11.2.0/network/admin/listener.ora
Listener Log File /u01/app/oracle/diag/tnslsnr/jfdb/listener/alert/log.xml
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=jfdb)(PORT=1523)))
Services Summary...
Service "jfdb" has 1 instance(s).
Instance "jfdb", status UNKNOWN, has 1 handler(s) for this service...
The command completed successfully
配置tnsnames.ora
vim tnsnames.ora
JFDB =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.13.129)(PORT = 1523))
)
(CONNECT_DATA =
(SERVICE_NAME = jfdb)
)
)
通过sqlplus连接
创建用户测试
SQL> create user test identified by test;
User created.
SQL> alter user test identified by 123456;
User altered.
SQL> grant connect, resource to test;
Grant succeeded.
SQL> commit;
Commit complete.
[oracle@jfdb admin]$ sqlplus test/123456@jfdb
SQL*Plus: Release 11.2.0.4.0 Production on Mon Aug 8 18:14:07 2022
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>
监听的所有文件的位于$ORACLE_HOME/network/admin/下
listener.ora: 服务端文件、配置监听 位置
tnsname.ora:配置文件是一个用于解析名称的客户端文件,客户端通过连接字符串解析主机名+端口+服务吗是否正确。
sqlnet.ora: 配置访问白名单、黑名单。
服务名(service_name)是可以更改的,例:从其它环境克隆过来的数据,服务名不相等的需要更改,然后重启服务,以及监听。
修改pdb名字
sqlplus / as sysdba
alter pluggable database SZPROD close;
alter pluggable database SZPROD open restricted;
SQL> select name, open_mode, restricted from v$pdbs;
NAME OPEN_MODE RES
-------------------- ---------- ---
PDB$SEED READ ONLY NO
SZPROD READ WRITE YES
alter session set container=SZPROD;
alter pluggable database rename global_name to SZUAT;
alter pluggable database close immediate;
alter pluggable database open;
alter pluggable database SZUAT save state;
alter session set container=SZUAT;
exec dbms_service.create_service('ebs_SZUAT','ebs_SZUAT');
exec dbms_service.delete_service('ebs_SZPROD');
exec dbms_service.start_service('ebs_SZUAT');
查看数据库的名字:
数据库名:show parameter name
实例名:show parameter instance
服务名:show parameter service,其中服务名可以修改