从前两章节的架构及原理介绍当中,我们得知Oracle net软件层包括两个部分:服务器端的监听器客户端的TNS。如下图
tns

在服务端

oracle NET包括一个活动的进程叫监听器lsnrctl(Listener Control Utility,监听器控制实用程序)。只是负责建立客户端和服务端的连接,它并不承担客户端和服务端的通信。

监听器启动后,会去读取监听器配置文件listener.ora

服务器端在前几章节已详细说明,不再重复!

在客户端

客户端若想连接到数据库,需要两方面信息:

① 数据库所在服务器的IP和端口;

② 数据库service_name。

这两部分称之“连接描述符”,也叫“本地网络服务名”,保存在客户端的tnsnames.ora文件,类似hosts文件,记录每个oracle net 别名对应的主机和oracle实例。

PS:默认情况下客户端工具(如sqlplus、PL/SQL Developer等)连接远程服务器的数据库时,不会直接使用数据库的SID,而是通过“网络服务名”。

连接过程说明

1)在服务端开启监听 :lsnectl>start

这个启动进程会在一个固定的IP和端口上监听用户请求

2)当客户端程序(用户进程sqlplus)发出请求串

语法:username/passwd@net_service_name

例如sqlplus sys/K17000205@192.168.2.31

① oracle NET 组件首先在本地查找sqlnet.ora文件确定解析方式

这里假设为local naming,则sqlnet.ora中内容如下:NAMES.DIRECTORY_PATH=(TNSNAMES)

② oracle NET读取tnsnames.ora文件,匹配net_service_name。

如果该net_service_name匹配失败,则提示错误;

如果成功,则根据connect descriptor中protocol,host,port信息发给正确的监听器

3)监听器再根据connect descritpor中的service_name与向它注册了的oracle services进行比对.

如果比对成功, 则建立连接, fork()一个服务进程,把用户请求转发给服务进程,不参与后续的任何工作,回去继续监听其他用户的请求。

如果比对失败,则提示错误。

4)服务进程和用户进程建立连接后,开始处理和返回用户的请求,直到用户进程结束连接。

常见错误代码

ORA-12154 :有可能TNSNAMES.ORA放在不正确的位置

ORA-12198和ORA-12203 :指出tnsnames.ora是列出的服务无法联系到。有可能指定的服务名称错误。

ORA-12533 :指出配置ADDRESS不正确

ORA-12541 :指出指定端口未找到相应监听器
文章来源:Oracle精读18_Oracle Net软件连接过程及原理

最后修改:2023 年 09 月 19 日
如果觉得我的文章对你有用,请随意赞赏