外观
Oracle 网络配置
网络架构
Oracle 网络组件
- Oracle Net Listener:监听客户端连接请求的服务
- Oracle Net Services:管理客户端与数据库服务器之间的通信
- Oracle Connection Manager:可选组件,提供连接集中和网络协议转换
网络协议支持
- TCP/IP:最常用的网络协议
- TCP/IP with SSL:加密的 TCP/IP 连接
- Named Pipes:Windows 平台专用
- IPC:本地连接使用的协议
网络拓扑
- 客户端-服务器:最基本的网络拓扑
- 多层架构:客户端 → 应用服务器 → 数据库服务器
- RAC 集群:多节点共享存储的架构
- Data Guard:主备数据库架构
监听器配置
监听器文件
- listener.ora:监听器的主要配置文件
- 位置:
- Linux/Unix:
$ORACLE_HOME/network/admin/listener.ora - Windows:
%ORACLE_HOME%\network\admin\listener.ora
- Linux/Unix:
基本配置
text
# listener.ora 配置示例
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = hostname)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)
ADR_BASE_LISTENER = /u01/app/oracle高级配置
多端口配置
text
# 多端口配置示例
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = hostname)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = hostname)(PORT = 1522))
)
)多监听器配置
text
# 多监听器配置示例
LISTENER1 =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = hostname)(PORT = 1521))
)
)
LISTENER2 =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = hostname)(PORT = 1522))
)
)服务注册配置
text
# 服务注册配置示例
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = hostname)(PORT = 1521))
)
)
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = ORCL)
(ORACLE_HOME = /u01/app/oracle/product/19.0.0/dbhome_1)
(GLOBAL_DBNAME = ORCL.example.com)
)
)监听器管理
启动监听器
bash
# Linux/Unix
lsnrctl start [listener_name]
# Windows
lsnrctl start [listener_name]停止监听器
bash
# Linux/Unix
lsnrctl stop [listener_name]
# Windows
lsnrctl stop [listener_name]查看监听器状态
bash
# Linux/Unix
lsnrctl status [listener_name]
# Windows
lsnrctl status [listener_name]重新加载监听器配置
bash
# Linux/Unix
lsnrctl reload [listener_name]
# Windows
lsnrctl reload [listener_name]查看监听器日志
bash
# Linux/Unix
lsnrctl status [listener_name] | grep LOG_FILE
# Windows
lsnrctl status [listener_name] | findstr LOG_FILE客户端配置
tnsnames.ora 文件
- 作用:定义数据库连接描述符
- 位置:
- Linux/Unix:
$ORACLE_HOME/network/admin/tnsnames.ora - Windows:
%ORACLE_HOME%\network\admin\tnsnames.ora - 也可以放在
TNS_ADMIN环境变量指定的位置
- Linux/Unix:
基本配置
text
# tnsnames.ora 配置示例
ORCL =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = hostname)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = ORCL.example.com)
# 或使用 SID
# (SID = ORCL)
)
)高级配置
负载均衡配置
text
# 负载均衡配置示例
ORCL_RAC =
(DESCRIPTION =
(LOAD_BALANCE = YES)
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = node1)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = node2)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = ORCL.example.com)
)
)故障转移配置
text
# 故障转移配置示例
ORCL_DG =
(DESCRIPTION =
(FAILOVER = ON)
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = primary_host)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = standby_host)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = ORCL.example.com)
(FAILOVER_MODE =
(TYPE = SELECT)
(METHOD = BASIC)
(RETRIES = 180)
(DELAY = 5)
)
)
)连接超时配置
text
# 连接超时配置示例
ORCL =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = hostname)(PORT = 1521)(CONNECT_TIMEOUT = 10))
)
(CONNECT_DATA =
(SERVICE_NAME = ORCL.example.com)
)
)客户端连接测试
使用 sqlplus 测试连接
bash
# 测试连接
sqlplus username/password@ORCL
# 使用连接字符串测试
sqlplus username/password@//hostname:1521/ORCL.example.com使用 tnsping 测试网络连接
bash
# 测试 TNS 连接
tnsping ORCL
# 测试连接超时
tnsping ORCL 10网络服务配置
服务名配置
动态服务注册
- 作用:数据库实例自动向监听器注册服务
- 配置参数:
local_listener:指定监听器地址remote_listener:指定远程监听器地址service_names:指定服务名
静态服务注册
- 作用:在 listener.ora 中手动配置服务信息
- 配置方法:在 SID_LIST_LISTENER 中添加服务信息
网络参数配置
SQL*Net 参数
- sqlnet.ora:配置 SQL*Net 客户端和服务器端的网络参数
- 位置:
- Linux/Unix:
$ORACLE_HOME/network/admin/sqlnet.ora - Windows:
%ORACLE_HOME%\network\admin\sqlnet.ora
- Linux/Unix:
常用参数
text
# sqlnet.ora 配置示例
SQLNET.AUTHENTICATION_SERVICES = (ALL)
NAMES.DIRECTORY_PATH = (TNSNAMES, EZCONNECT)
SQLNET.INBOUND_CONNECT_TIMEOUT = 60
SQLNET.OUTBOUND_CONNECT_TIMEOUT = 60
TCP.VALIDNODE_CHECKING = YES
TCP.INVITED_NODES = (192.168.1.0/24, 10.0.0.0/24)网络安全配置
IP 访问控制
- TCP.VALIDNODE_CHECKING:启用 IP 验证
- TCP.INVITED_NODES:允许访问的 IP 地址列表
- TCP.EXCLUDED_NODES:拒绝访问的 IP 地址列表
加密配置
text
# 加密配置示例
SQLNET.ENCRYPTION_SERVER = REQUIRED
SQLNET.ENCRYPTION_TYPES_SERVER = (AES256, AES192, AES128)
SQLNET.ENCRYPTION_CLIENT = REQUIRED
SQLNET.ENCRYPTION_TYPES_CLIENT = (AES256, AES192, AES128)校验配置
text
# 校验配置示例
SQLNET.CRYPTO_CHECKSUM_SERVER = REQUIRED
SQLNET.CRYPTO_CHECKSUM_TYPES_SERVER = (SHA256, SHA1)
SQLNET.CRYPTO_CHECKSUM_CLIENT = REQUIRED
SQLNET.CRYPTO_CHECKSUM_TYPES_CLIENT = (SHA256, SHA1)RAC 网络配置
网络要求
- 公共网络:用于客户端连接
- 私有网络:用于节点间通信和缓存融合
- 网络带宽:私有网络至少 10 Gbps,推荐 25 Gbps
- 网络延迟:私有网络延迟应低于 1 ms
配置示例
监听器配置
text
# RAC 监听器配置示例
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = node1-vip)(PORT = 1521))
)
)
LISTENER_NODE1 =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = node1)(PORT = 1522))
)
)tnsnames.ora 配置
text
# RAC tnsnames.ora 配置示例
ORCL_RAC =
(DESCRIPTION =
(LOAD_BALANCE = YES)
(FAILOVER = ON)
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = node1-vip)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = node2-vip)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = ORCL.example.com)
(FAILOVER_MODE =
(TYPE = SELECT)
(METHOD = BASIC)
(RETRIES = 180)
(DELAY = 5)
)
)
)网络故障排查
常见问题
监听器无法启动
- 检查:
- 端口是否被占用:
netstat -tuln | grep 1521 - 配置文件语法是否正确
- 主机名解析是否正确:
ping hostname
- 端口是否被占用:
- 解决方法:
- 释放占用的端口
- 修正配置文件
- 配置正确的主机名解析
客户端无法连接
- 检查:
- 监听器是否运行:
lsnrctl status - 网络连接是否正常:
ping hostname - 端口是否可访问:
telnet hostname 1521 - tnsnames.ora 配置是否正确
- 监听器是否运行:
- 解决方法:
- 启动监听器
- 修复网络连接
- 修正 tnsnames.ora 配置
连接超时
- 检查:
- 网络延迟是否过高
- 监听器负载是否过大
- 数据库实例是否正常
- 解决方法:
- 优化网络性能
- 增加监听器进程
- 修复数据库实例问题
诊断工具
lsnrctl
- 功能:监听器管理和状态查看
- 常用命令:
status,start,stop,reload,trace
tnsping
- 功能:测试网络连接和 TNS 解析
- 用法:
tnsping service_name [count]
netstat
- 功能:查看网络连接和端口状态
- 用法:
netstat -tuln(Linux),netstat -ano(Windows)
tcpdump
- 功能:网络数据包捕获和分析
- 用法:
tcpdump -i eth0 port 1521
Oracle Net Manager
- 功能:图形化网络配置工具
- 位置:
$ORACLE_HOME/bin/netmgr(Linux),%ORACLE_HOME%\bin\netmgr.exe(Windows)
网络性能优化
监听器优化
- 增加监听器进程:在高负载环境中增加监听器进程
- 调整队列大小:增加监听器的连接队列大小
- 使用多个监听器:分散连接负载到多个监听器
网络参数优化
- 调整 TCP 参数:
tcp_keepalive_time:减少空闲连接的保持时间tcp_max_syn_backlog:增加连接队列大小tcp_slow_start_after_idle:禁用空闲后的慢启动
- 调整 SQL*Net 参数:
SQLNET.INBOUND_CONNECT_TIMEOUT:适当调整连接超时时间SQLNET.RECV_TIMEOUT:适当调整接收超时时间
连接池优化
- 使用连接池:减少连接建立的开销
- 调整连接池大小:根据并发用户数调整
- 设置适当的超时参数:避免连接泄漏
防火墙配置
- 优化防火墙规则:减少防火墙对网络性能的影响
- 配置连接跟踪:调整防火墙的连接跟踪参数
- 使用硬件防火墙:在高负载环境中使用硬件防火墙
常见问题(FAQ)
Q1: 如何配置 Oracle 监听器使用多个端口?
A1: 配置 Oracle 监听器使用多个端口的方法:
- 编辑 listener.ora 文件,在 ADDRESS 部分添加多个端口配置
- 重新加载监听器配置:
lsnrctl reload - 验证监听器状态:
lsnrctl status,确认多个端口都已注册
Q2: 如何解决 Oracle 客户端连接超时问题?
A2: 解决 Oracle 客户端连接超时问题的方法:
- 网络层面:
- 检查网络连接和延迟
- 确保网络带宽足够
- 优化网络路由
- Oracle 配置层面:
- 调整 SQLNET.INBOUND_CONNECT_TIMEOUT 参数
- 调整监听器的 QUEUESIZE 参数
- 确保监听器有足够的资源处理连接
- 数据库层面:
- 确保数据库实例正常运行
- 检查数据库是否有大量等待事件
- 优化数据库性能
Q3: 如何配置 Oracle RAC 的网络负载均衡?
A3: 配置 Oracle RAC 网络负载均衡的方法:
- 在 tnsnames.ora 文件中配置 LOAD_BALANCE=YES
- 添加所有节点的 VIP 地址到 ADDRESS_LIST
- 配置 SERVICE_NAME 指向 RAC 服务
- 可选:配置 FAILOVER=ON 实现故障转移
Q4: 如何启用 Oracle 网络加密?
A4: 启用 Oracle 网络加密的方法:
- 编辑 sqlnet.ora 文件,添加以下参数:
SQLNET.ENCRYPTION_SERVER = REQUIRED SQLNET.ENCRYPTION_TYPES_SERVER = (AES256, AES192, AES128) SQLNET.ENCRYPTION_CLIENT = REQUIRED SQLNET.ENCRYPTION_TYPES_CLIENT = (AES256, AES192, AES128) - 重启监听器和数据库实例
- 验证加密是否启用:使用网络跟踪或 Oracle Network Manager
Q5: 如何配置 Oracle 数据库的服务名?
A5: 配置 Oracle 数据库服务名的方法:
- 动态服务注册:
- 登录数据库实例
- 执行以下 SQL 语句:sql
ALTER SYSTEM SET service_names = 'ORCL.example.com' SCOPE=BOTH; - 监听器会自动注册该服务名
- 静态服务注册:
- 编辑 listener.ora 文件,在 SID_LIST_LISTENER 部分添加服务信息
- 重新加载监听器配置:
lsnrctl reload - 验证服务是否已注册:
lsnrctl status
