Oracle 监听器配置详解

Oracle 监听器配置详解

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


1. 概述

监听器是客户端与数据库的桥梁[1]:

作用

  • 接收连接
  • 注册服务
  • 转发请求
  • 负载均衡

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


2. listener.ora

2.1 基本

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = oradb1)(PORT = 1521))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
  )

ADR_BASE_LISTENER = /u01/app/oracle

2.2 多端口

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = oradb1)(PORT = 1521))
    )
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = oradb1)(PORT = 1522))
    )
  )

2.3 静态注册

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

2.4 多监听器

LISTENER1 =
  (DESCRIPTION_LIST =
    (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = oradb1)(PORT = 1521)))
  )

LISTENER2 =
  (DESCRIPTION_LIST =
    (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = oradb1)(PORT = 1522)))
  )

3. tnsnames.ora

3.1 基本

ORCL =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = oradb1)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl)
    )
  )

3.2 RAC

ORCL =
  (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 =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl)
      (FAILOVER_MODE =
        (TYPE = SELECT)
        (METHOD = BASIC)
        (RETRIES = 180)
        (DELAY = 5)
      )
    )
  )

3.3 SCAN

ORCL =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = rac-scan)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl)
    )
  )

3.4 Data Guard

ORCL_PRI =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = pri-db)(PORT = 1521))
    (CONNECT_DATA = (SERVER = DEDICATED)(SERVICE_NAME = orcl_pri))
  )

ORCL_STD =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = std-db)(PORT = 1521))
    (CONNECT_DATA = (SERVER = DEDICATED)(SERVICE_NAME = orcl_std))
  )

4. sqlnet.ora

4.1 命名方法

NAMES.DIRECTORY_PATH = (TNSNAMES, EZCONNECT, LDAP)

4.2 超时

SQLNET.INBOUND_CONNECT_TIMEOUT = 60
SQLNET.OUTBOUND_CONNECT_TIMEOUT = 60
SQLNET.EXPIRE_TIME = 10

4.3 认证

SQLNET.AUTHENTICATION_SERVICES = (NTS)
# 或
SQLNET.AUTHENTICATION_SERVICES = (ALL)

4.4 加密

SQLNET.ENCRYPTION_SERVER = REQUIRED
SQLNET.ENCRYPTION_TYPES_SERVER = (AES256, AES192, AES128)
SQLNET.CRYPTO_CHECKSUM_SERVER = REQUIRED
SQLNET.CRYPTO_CHECKSUM_TYPES_SERVER = (SHA256, SHA1)

详细见:Oracle 网络加密详解


5. 动态注册

5.1 LOCAL_LISTENER

ALTER SYSTEM SET local_listener = 'LISTENER' SCOPE=SPFILE;
-- 或
ALTER SYSTEM SET local_listener = '(ADDRESS=(PROTOCOL=TCP)(HOST=oradb1)(PORT=1521))' SCOPE=SPFILE;

5.2 强制注册

ALTER SYSTEM REGISTER;

5.3 验证

lsnrctl status
lsnrctl services

6. 监听器管理

6.1 启停

lsnrctl start
lsnrctl stop
lsnrctl status
lsnrctl reload
lsnrctl services

6.2 日志

# listener.ora
LOGGING_LISTENER = ON
LOG_DIRECTORY_LISTENER = /u01/app/oracle/diag/tnslsnr/oradb1/listener
LOG_FILE_LISTENER = listener.log

# 轮转
lsnrctl set log_status off
mv listener.log listener.old.log
lsnrctl set log_status on

7. 服务注册

7.1 静态 vs 动态

静态动态
配置listener.ora自动
状态UNKNOWNREADY
启动启动前可连启动后注册

7.2 服务

-- 添加服务
EXEC DBMS_SERVICE.CREATE_SERVICE('oltp', 'oltp');

-- 启动
EXEC DBMS_SERVICE.START_SERVICE('oltp');

-- 停止
EXEC DBMS_SERVICE.STOP_SERVICE('oltp');

-- 删除
EXEC DBMS_SERVICE.DELETE_SERVICE('oltp');

7.3 RAC

srvctl add service -db orcl -service oltp -preferred orcl1 -available orcl2
srvctl start service -db orcl -service oltp

8. 连接类型

8.1 Dedicated

- 每连接一进程
- OLTP
- 内存独占

8.2 Shared

- 共享进程
- 大量连接
- Dispatcher + Shared Server

8.3 DRCP

- Database Resident Connection Pooling
- 池化
- PHP/Web

8.4 配置

-- Shared
ALTER SYSTEM SET shared_servers = 5;
ALTER SYSTEM SET dispatchers = '(PROTOCOL=TCP)(SERVICE=orclXDB)';

9. 故障转移

9.1 TAF(客户端)

# tnsnames.ora
FAILOVER_MODE =
  (TYPE = SELECT)
  (METHOD = BASIC)
  (RETRIES = 180)
  (DELAY = 5)

9.2 TAC(服务端)

EXEC DBMS_SERVICE.MODIFY_SERVICE(
  service_name => 'oltp',
  failover_method => 'BASIC',
  failover_type => 'SELECT,SESSION',
  failover_retries => 180,
  failover_delay => 5
);

详细见:Oracle TAF 与 TAC 配置


10. 测试

10.1 tnsping

tnsping orcl
tnsping orcl 5

10.2 sqlplus

sqlplus system/pwd@orcl
sqlplus system/pwd@//oradb1:1521/orcl

10.3 lsnrctl

lsnrctl status
lsnrctl services
lsnrctl ping

11. 监控

11.1 视图

SELECT * FROM v$listener_network;
SELECT service_name, status, instance_name FROM v$services;

11.2 日志

tail -f $ORACLE_BASE/diag/tnslsnr/oradb1/listener/alert/log.xml

12. 常见坑与排错

12.1 ORA-12541

- 监听器未启动
- lsnrctl start
- 端口

12.2 ORA-12154

- tnsnames.ora
- TNS_ADMIN
- 拼写

12.3 ORA-12514

- 服务未注册
- ALTER SYSTEM REGISTER
- 静态注册

12.4 ORA-12516

- 进程数满
- processes

12.5 ORA-12520

- 共享服务器
- shared_servers

13. 最佳实践

  1. SCAN:RAC
  2. 动态注册:现代
  3. 静态:备份
  4. 多监听器:负载
  5. 加密:安全
  6. 超时:防护
  7. TAF/TAC:高可用
  8. 日志轮转:空间
  9. 监控:及时
  10. 文档化:配置

14. 参考资料

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