Skip to content

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

基本配置

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 环境变量指定的位置

基本配置

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

常用参数

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 监听器使用多个端口的方法:

  1. 编辑 listener.ora 文件,在 ADDRESS 部分添加多个端口配置
  2. 重新加载监听器配置:lsnrctl reload
  3. 验证监听器状态:lsnrctl status,确认多个端口都已注册

Q2: 如何解决 Oracle 客户端连接超时问题?

A2: 解决 Oracle 客户端连接超时问题的方法:

  • 网络层面
    • 检查网络连接和延迟
    • 确保网络带宽足够
    • 优化网络路由
  • Oracle 配置层面
    • 调整 SQLNET.INBOUND_CONNECT_TIMEOUT 参数
    • 调整监听器的 QUEUESIZE 参数
    • 确保监听器有足够的资源处理连接
  • 数据库层面
    • 确保数据库实例正常运行
    • 检查数据库是否有大量等待事件
    • 优化数据库性能

Q3: 如何配置 Oracle RAC 的网络负载均衡?

A3: 配置 Oracle RAC 网络负载均衡的方法:

  1. 在 tnsnames.ora 文件中配置 LOAD_BALANCE=YES
  2. 添加所有节点的 VIP 地址到 ADDRESS_LIST
  3. 配置 SERVICE_NAME 指向 RAC 服务
  4. 可选:配置 FAILOVER=ON 实现故障转移

Q4: 如何启用 Oracle 网络加密?

A4: 启用 Oracle 网络加密的方法:

  1. 编辑 sqlnet.ora 文件,添加以下参数:
    SQLNET.ENCRYPTION_SERVER = REQUIRED
    SQLNET.ENCRYPTION_TYPES_SERVER = (AES256, AES192, AES128)
    SQLNET.ENCRYPTION_CLIENT = REQUIRED
    SQLNET.ENCRYPTION_TYPES_CLIENT = (AES256, AES192, AES128)
  2. 重启监听器和数据库实例
  3. 验证加密是否启用:使用网络跟踪或 Oracle Network Manager

Q5: 如何配置 Oracle 数据库的服务名?

A5: 配置 Oracle 数据库服务名的方法:

  • 动态服务注册
    1. 登录数据库实例
    2. 执行以下 SQL 语句:
      sql
      ALTER SYSTEM SET service_names = 'ORCL.example.com' SCOPE=BOTH;
    3. 监听器会自动注册该服务名
  • 静态服务注册
    1. 编辑 listener.ora 文件,在 SID_LIST_LISTENER 部分添加服务信息
    2. 重新加载监听器配置:lsnrctl reload
    3. 验证服务是否已注册:lsnrctl status