Oracle 网络配置与监听器

Oracle 网络配置与监听器

适用版本:Oracle Database 11g / 12c / 19c / 23ai 文档版本:v1.0 / 2026-07


1. 概述

Oracle 网络配置是连接基础[1]:

组件

  • Listener(监听器)
  • tnsnames.ora(客户端)
  • sqlnet.ora(全局)
  • 监听管理

详细见:Oracle 网络架构与监听器配置


2. listener.ora

2.1 位置

$ORACLE_HOME/network/admin/listener.ora

2.2 配置

LISTENER = 
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = tcp)(HOST = oradb.example.com)(PORT = 1521))
      (ADDRESS = (PROTOCOL = ipc)(KEY = EXTPROC1521))
    )
  )

SID_LIST_LISTENER = 
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = orcl.example.com)
      (ORACLE_HOME = /u01/app/oracle/product/19.0.0/dbhome_1)
      (SID_NAME = orcl)
    )
  )

ADR_BASE_LISTENER = /u01/app/oracle

2.3 多监听

LISTENER1 = (ADDRESS=(PROTOCOL=tcp)(HOST=...)(PORT=1521))
LISTENER2 = (ADDRESS=(PROTOCOL=tcp)(HOST=...)(PORT=1522))

3. 静态注册 vs 动态注册

3.1 静态注册

# listener.ora
SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (SID_NAME=orcl) ...))

3.2 动态注册

-- 自动注册到默认 1521 端口
ALTER SYSTEM SET LOCAL_LISTENER = '';
ALTER SYSTEM REGISTER;

-- 非默认端口
ALTER SYSTEM SET LOCAL_LISTENER = '(ADDRESS=(PROTOCOL=tcp)(HOST=...)(PORT=1522))';
ALTER SYSTEM REGISTER;

3.3 验证

lsnrctl services
lsnrctl status

4. tnsnames.ora

4.1 位置

$ORACLE_HOME/network/admin/tnsnames.ora

4.2 配置

ORCL = 
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = tcp)(HOST = oradb.example.com)(PORT = 1521))
    (CONNECT_DATA = 
      (SERVICE_NAME = orcl.example.com)
    )
  )

# RAC
ORCL_RAC = 
  (DESCRIPTION =
    (ADDRESS_LIST =
      (LOAD_BALANCE = ON)
      (FAILOVER = ON)
      (ADDRESS = (PROTOCOL = tcp)(HOST = rac1-vip)(PORT = 1521))
      (ADDRESS = (PROTOCOL = tcp)(HOST = rac2-vip)(PORT = 1521))
    )
    (CONNECT_DATA = 
      (SERVICE_NAME = orcl.example.com)
      (FAILOVER_MODE = (TYPE = SELECT)(METHOD = BASIC))
    )
  )

4.3 连接

sqlplus system/pwd@orcl
sqlplus system/pwd@//oradb:1521/orcl.example.com  # EZCONNECT

5. sqlnet.ora

5.1 位置

$ORACLE_HOME/network/admin/sqlnet.ora

5.2 配置

NAMES.DIRECTORY_PATH = (TNSNAMES, EZCONNECT, LDAP)
SQLNET.AUTHENTICATION_SERVICES = (NONE)
DEFAULT_SDU_SIZE = 32767
SQLNET.INBOUND_CONNECT_TIMEOUT = 60
SQLNET.EXPIRE_TIME = 10  # 死连接检测
DIAG_ADR_ENABLED = ON

6. 管理

6.1 启停

lsnrctl start
lsnrctl stop
lsnrctl status
lsnrctl services
lsnrctl reload

6.2 日志

$ORACLE_HOME/network/log/listener.log

7. 测试

7.1 tnsping

tnsping orcl
tnsping oradb:1521/orcl.example.com

7.2 sqlplus

sqlplus system/pwd@orcl

8. 高级配置

8.1 连接池(DRCP)

# tnsnames.ora
ORCL = (...)
  (CONNECT_DATA = (SERVER = POOLED) (SERVICE_NAME = orcl))

8.2 共享服务器

ORCL = (...)
  (CONNECT_DATA = (SERVER = SHARED) (SERVICE_NAME = orcl))

详细见:Oracle 数据库连接池优化

8.3 外部认证

# sqlnet.ora
SQLNET.AUTHENTICATION_SERVICES = (NTS)  # Windows

9. 网络加密

9.1 Native Encryption

# sqlnet.ora
SQLNET.ENCRYPTION_SERVER = REQUIRED
SQLNET.ENCRYPTION_TYPES_SERVER = (AES256)
SQLNET.CRYPTO_CHECKSUM_SERVER = REQUIRED
SQLNET.CRYPTO_CHECKSUM_TYPES_SERVER = (SHA256)

9.2 SSL/TLS

# sqlnet.ora
SQLNET.AUTHENTICATION_SERVICES = (TCPS, NTS)
SSL_CLIENT_AUTHENTICATION = TRUE
SSL_CERT_FILE = ...
SSL_CIPHER_SUITES = (SSL_RSA_WITH_AES_256_CBC_SHA)

详细见:Oracle 安全性能优化


10. 常见错误

10.1 ORA-12541: TNS:no listener

# 1. 检查 listener
lsnrctl status
# 2. 启动
lsnrctl start
# 3. 端口/防火墙

10.2 ORA-12154: TNS:could not resolve

# 1. tnsnames.ora
# 2. TNS_ADMIN
# 3. tnsping 测试

10.3 ORA-12514: TNS:listener does not know

# 1. 服务注册
lsnrctl services
# 2. ALTER SYSTEM REGISTER
# 3. LOCAL_LISTENER

10.4 ORA-12520: TNS:listener could not find handler

# 1. PROCESSES 不足
# 2. 共享服务器
# 3. 连接池

11. 监控

11.1 监听日志

tail -f $ORACLE_HOME/network/log/listener.log

11.2 连接数

SELECT 
  COUNT(*) AS total,
  SUM(CASE WHEN server = 'DEDICATED' THEN 1 ELSE 0 END) AS dedicated,
  SUM(CASE WHEN server = 'SHARED' THEN 1 ELSE 0 END) AS shared
FROM v$session
WHERE username IS NOT NULL;

详细见:Oracle 网络性能优化


12. 最佳实践

  1. 动态注册:自动
  2. 服务名:替代 SID
  3. SDU 32KB:性能
  4. 多监听:负载
  5. 连接超时:安全
  6. EXPIRE_TIME:死连接
  7. 加密:敏感
  8. 监控日志:问题
  9. tnsping 测试:连通
  10. 文档化:配置

13. 参考资料

[1] Oracle Database Net Services Administrator’s Guide 19c https://docs.oracle.com/en/database/oracle/oracle-database/19/netag/