概念
概念: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
netca配置监听
动态注册与静态注册
我们前面在配置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
--