Oracle 网络配置文件
Oracle 的网络配置主要涉及三个关键的文件:listener.ora
、tnsnames.ora
和 sqlnet.ora
。这些文件通常位于 $ORACLE_HOME/network/admin/
目录下,$ORACLE_HOME
是 Oracle 安装目录的环境变量,通常为 /u01/app/oracle/product/xx.x.x/dbhome_1
。
1. listener.ora
文件
listener.ora
文件用于配置数据库监听器(Listener)。监听器是 Oracle 网络架构中的一个重要组件,负责客户端与数据库实例之间的连接请求。监听器可以是静态或动态的。
静态监听配置
静态监听配置依赖于 listener.ora
文件的手动设置。即使数据库实例未启动,监听器也会启动并等待客户端请求。
示例配置:
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))
)
)
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = orcl) -- 数据库实例名
(ORACLE_HOME = /u01/app/oracle/product/19c/dbhome_1) -- Oracle 安装路径
(PROGRAM = extproc) -- 可选,外部过程处理
)
)
配置说明:
-
SID_NAME
:数据库实例的 SID 名称。 -
ORACLE_HOME
:Oracle 软件的安装路径。 -
PROGRAM
:指定运行的程序,如extproc
(外部过程处理)。 -
ADDRESS
:监听器的网络地址,包括协议、主机地址和端口号。
动态监听配置
动态监听依赖于数据库实例自动向监听器注册自身信息。Oracle 12c 及以后版本使用 LREG
(Listener Registration Process)进程实现动态注册,注册时数据库实例会根据 init.ora
文件中的 instance_name
和 service_names
自动注册。
工作流程:
1.实例启动时
LREG
读取 init.ora
文件中的INSTANCE_NAME
和 SERVICE_NAMES
等参数,并通过 LOCAL_LISTENER
或默认地址(localhost:1521
)与监听器通信。
2.动态注册
LREG
将实例和服务信息发送给监听器,包括:
- 实例名称(
INSTANCE_NAME
)。 - 服务名称(SERVICE_NAMES
)。 - 数据库负载和状态(如READY
或NOT READY
)。
3.状态更新
在实例运行期间,LREG
监控服务状态的变化(如实例变为不可用时),并及时通知监听器更新服务信息。
4.重新注册
当监听器重启时,LREG
会自动重新注册实例和服务信息。
无论是静态监听还是动态监听,最终的结果都是创建了监听器,最终都会有一个监听器在运行,负责接收和处理客户端或服务端的连接请求。两者的区别主要在于创建和管理监听器的时机及方式。
2. tnsnames.ora
文件
tnsnames.ora
文件用于为 Oracle 客户端提供数据库连接的简化信息。它允许客户端通过简单的 TNS 名称(如 ORCL
)来访问数据库,而无需每次输入复杂的连接信息(如主机名、端口号等)。
示例配置:
ORCL =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521)) -- 数据库连接信息
)
(CONNECT_DATA =
(SERVICE_NAME = orcl) -- 数据库服务名
)
)
配置说明:
-
ORCL
:TNS 名称,客户端通过此名称连接数据库。 -
ADDRESS
:连接的协议、主机地址和端口。 -
SERVICE_NAME
:数据库的服务名。
使用时,客户端可以通过以下命令连接:
sqlplus user/password@ORCL
而无需每次都指定完整的连接字符串。
如果不配置tnsname.ora
文件,连接需要
sqlplus user/password@//hostname:port/service_name
3. sqlnet.ora
文件
sqlnet.ora
文件用于定义客户端与数据库之间的连接参数,控制数据库的网络行为,如身份验证协议、连接超时等。
示例配置:
SQLNET.ALLOWED_LOGON_VERSION_CLIENT = 12
SQLNET.ALLOWED_LOGON_VERSION_SERVER = 12
TCP.INVITED_NODES = (192.168.1.0/24, 10.0.0.0/8)
TCP.EXCLUDED_NODES = (192.168.2.0/24)
SQLNET.EXPIRE_TIME = 10
配置说明:
-
SQLNET.ALLOWED_LOGON_VERSION_CLIENT
:客户端允许的最低身份验证协议版本。 -
SQLNET.ALLOWED_LOGON_VERSION_SERVER
:服务器允许的最低身份验证协议版本。 -
TCP.INVITED_NODES
:允许连接数据库的 IP 地址范围。 -
TCP.EXCLUDED_NODES
:拒绝连接数据库的 IP 地址范围。 -
SQLNET.EXPIRE_TIME
:设置客户端与服务器之间连接的超时检查时间(以分钟为单位)。
4. 连接方式:共享连接与专有连接
在 Oracle 数据库中,客户端连接的方式有两种:专有连接 和共享连接。
专有连接(Dedicated Server)
每个客户端请求都会由一个独立的服务器进程(Dedicated Server Process)处理。每当客户端请求连接时,Oracle 会为该客户端分配一个专门的服务器进程。
共享连接(Shared Server)
多个客户端共享同一个服务器进程。Oracle 使用一个"共享进程池"来处理多个用户的请求,这种机制类似于连接池。
5.Oracle 数据库的连接建立过程
或者说 监听器与客户端的连接过程。
1.客户端请求连接:
- 客户端(比如 SQL*Plus 或应用程序)通过网络向 Oracle 数据库发起连接请求,通常包括要连接的服务名、主机名、端口等信息。 - 这个请求首先会发送到 Listener。
2.**Listener (监听)**接收请求:
- Listener 会查看请求中的服务名或其他参数,找到对应的 Oracle 数据库实例。
3.Listener 分配 Service Handler:
- Listener 根据请求信息找到对应的数据库实例(如
ORCL
),并为客户端创建一个 service handler 。 - 这个 handler 通常是一个独立的后台进程(例如 Oracle 的 服务器进程),负责处理客户端的请求。
4.客户端与 Handler 直接连接:
- 一旦 Listener 为客户端分配了一个可用的 handler,客户端就会直接与这个 handler 进行连接。此时,Listener 不再参与后续的通信。 - 客户端与 handler 之间的通信是通过网络协议进行的,处理查询、事务等操作。
5.Listener 可以停止而不影响连接:
- 因为 Listener 仅负责处理连接请求,一旦连接建立,客户端与 handler 之间的交互就独立于 Listener。即使 Listener 停止,已经建立的连接仍然能够继续运行。 - 这种机制确保了即使在 Listener 停止或重启的情况下,已经与数据库建立的连接仍然保持有效。
过程总结图:
- 客户端请求 → 2. Listener 接收请求 → 3. Listener 分配 Service Handler → 4. 客户端与 Handler 连接 → 5. Listener 停止对后续连接不影响