Oracle 静态注册与动态注册

Oracle 静态注册与动态注册

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


1. 概述

Oracle 监听器服务注册分两种方式[1]:

方式实现者维护推荐度
动态注册PMON 进程自动⭐⭐⭐⭐⭐
静态注册手动配置手动⭐⭐

2. 动态注册

2.1 工作原理

1. PMON 进程定期(60 秒)向监听器注册
2. 提供实例信息:SID、服务名、状态
3. 监听器维护服务列表
4. 客户端连接时查找服务列表

2.2 默认注册

-- 默认注册到本地 1521 端口
-- PMON 自动将实例注册到 listener.ora 中配置的监听器

-- 强制注册
ALTER SYSTEM REGISTER;

2.3 LOCAL_LISTENER

-- 非 1521 端口需配置 LOCAL_LISTENER
ALTER SYSTEM SET local_listener='(ADDRESS=(PROTOCOL=TCP)(HOST=dbhost)(PORT=1522))' SCOPE=BOTH;

-- 强制注册
ALTER SYSTEM REGISTER;

2.4 多个监听器

-- 注册到多个监听器
ALTER SYSTEM SET local_listener='(
  ADDRESS_LIST=
    (ADDRESS=(PROTOCOL=TCP)(HOST=dbhost)(PORT=1521))
    (ADDRESS=(PROTOCOL=TCP)(HOST=dbhost)(PORT=1522))
)' SCOPE=BOTH;

ALTER SYSTEM REGISTER;

2.5 REMOTE_LISTENER(RAC)

-- RAC 中注册到 SCAN 监听器
ALTER SYSTEM SET remote_listener='rac-scan:1521' SCOPE=BOTH;

ALTER SYSTEM REGISTER;

2.6 验证

# 查看监听器服务
lsnrctl services

# 输出:
# Service "orcl" has 1 instance(s).
#   Instance "orcl", status READY, has 1 handler(s) for this service...
#     Handler(s):
#       "DEDICATED" established:0 refused:0 state:ready
#          LOCAL SERVER

3. 静态注册

3.1 工作原理

1. 在 listener.ora 中手动配置 SID_LIST_LISTENER
2. 监听器启动时读取配置
3. 不依赖 PMON 注册

3.2 配置

# listener.ora
SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = orcl)
      (ORACLE_HOME = /u01/app/oracle/product/19.3.0/dbhome_1)
      (SID_NAME = orcl)
    )
  )

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

3.3 多实例静态注册

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

3.4 重新加载

# 修改 listener.ora 后重载
lsnrctl reload

3.5 验证

# 查看监听器服务
lsnrctl services

# 输出:
# Service "orcl" has 1 instance(s).
#   Instance "orcl", status UNKNOWN, has 1 handler(s) for this service...
# status = UNKNOWN 表示静态注册

4. 动态 vs 静态对比

4.1 状态对比

维度动态注册静态注册
状态READYUNKNOWN
实例未启动不显示显示
实例异常终止自动注销仍显示
维护自动手动
灵活性
推荐特殊场景

4.2 静态注册的应用场景

  • 实例未启动时连接:如 STARTUP
  • Data Guard 备库:MOUNT 状态
  • RMAN 恢复:NOMOUNT 状态
  • EM 代理监控:连接未启动的实例
  • 特殊情况兜底

4.3 动态注册的优势

  • 自动维护服务列表
  • 实例状态实时反映
  • 支持负载均衡(RAC)
  • 支持故障切换
  • 配置简单

5. 动态注册场景

5.1 普通连接

-- 客户端连接
sqlplus scott/tiger@orcl

-- 必须实例已启动且 PMON 已注册

5.2 RAC 负载均衡

-- 多实例动态注册到 SCAN
ALTER SYSTEM SET remote_listener='rac-scan:1521' SCOPE=BOTH;
ALTER SYSTEM REGISTER;

-- SCAN 监听器转发到负载较轻的节点

5.3 服务切换

-- 启动服务
EXEC DBMS_SERVICE.START_SERVICE('sales');

-- 自动注册到监听器
ALTER SYSTEM REGISTER;

-- 客户端可连接 sales 服务

6. 静态注册场景

6.1 远程启动数据库

# 静态注册允许连接未启动的实例
sqlplus sys/pwd@orcl as sysdba
# 即使实例未启动也可连接

# 远程启动
SQL> startup

6.2 Data Guard

# 备库 MOUNT 状态下,PMON 可能未注册
# 静态注册确保主备同步

# listener.ora(备库)
SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = orcl_std)
      (ORACLE_HOME = /u01/app/oracle/product/19.3.0/dbhome_1)
      (SID_NAME = orcl)
    )
  )

6.3 RMAN 恢复

# NOMOUNT 状态下,PMON 可能未完全注册
# 静态注册确保 RMAN 可连接

# 启动到 NOMOUNT
sqlplus / as sysdba
STARTUP NOMOUNT;

# RMAN 远程连接
rman target sys/pwd@orcl

7. 混合注册

7.1 同时使用动态和静态

# listener.ora
SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = orcl)
      (ORACLE_HOME = /u01/app/oracle/product/19.3.0/dbhome_1)
      (SID_NAME = orcl)
    )
  )

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = dbhost)(PORT = 1521))
    )
  )
-- 同时启用动态注册
ALTER SYSTEM SET local_listener='(ADDRESS=(PROTOCOL=TCP)(HOST=dbhost)(PORT=1521))' SCOPE=BOTH;
ALTER SYSTEM REGISTER;

7.2 验证

lsnrctl services

# 输出:
# Service "orcl" has 2 instance(s).
#   Instance "orcl", status UNKNOWN, has 1 handler(s)...  # 静态
#   Instance "orcl", status READY, has 1 handler(s)...    # 动态

8. 监控与诊断

8.1 查看监听器状态

lsnrctl status

# 输出包含:
# Services Summary...
# Service "orcl" has 1 instance(s).
#   Instance "orcl", status READY, has 1 handler(s)...

8.2 查看服务列表

lsnrctl services

8.3 强制注册

ALTER SYSTEM REGISTER;

8.4 监听器日志

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

9. 常见坑与排错

9.1 ORA-12514: 监听器找不到服务

原因:动态注册未完成或未配置。

修复

-- 1. 检查监听器服务
! lsnrctl services

-- 2. 强制注册
ALTER SYSTEM REGISTER;

-- 3. 检查 LOCAL_LISTENER
SHOW PARAMETER local_listener;

-- 4. 或使用静态注册

9.2 ORA-12541: 无监听器

修复

# 1. 检查监听器状态
lsnrctl status

# 2. 启动监听器
lsnrctl start

# 3. 检查端口
netstat -tln | grep 1521

9.3 静态注册服务名错误

现象:连接 GLOBAL_DBNAME 不匹配。

修复

# 1. 检查 listener.ora 中的 GLOBAL_DBNAME
# 2. 检查 tnsnames.ora 中的 SERVICE_NAME
# 3. 两者应匹配

lsnrctl reload

9.4 PMON 未注册

修复

-- 1. 检查 PMON 进程
! ps -ef | grep pmon

-- 2. 检查 LOCAL_LISTENER
SHOW PARAMETER local_listener;

-- 3. 强制注册
ALTER SYSTEM REGISTER;

-- 4. 检查监听器日志
! lsnrctl status

9.5 静态注册 ORACLE_HOME 错误

现象:连接报 ORA-01034。

修复

# 1. 检查 ORACLE_HOME
echo $ORACLE_HOME

# 2. 检查 listener.ora 中的 ORACLE_HOME
# 3. 一致后 reload
lsnrctl reload

10. 最佳实践

  1. 生产优先动态注册:自动维护
  2. 特殊场景静态注册兜底:Data Guard、RMAN
  3. LOCAL_LISTENER 显式配置:非默认端口
  4. REMOTE_LISTENER 用于 RAC:SCAN
  5. 定期 ALTER SYSTEM REGISTER:强制注册
  6. 监控监听器服务:lsnrctl services
  7. 静态注册 ORACLE_HOME 准确:避免错误
  8. 混合注册:保证可用性
  9. 服务名规范:清晰标识
  10. 生产用 19c+:特性完善

11. 参考资料

[1] Oracle Database Net Services Administrator’s Guide 19c, “Dynamic Service Registration” https://docs.oracle.com/en/database/oracle/oracle-database/19/netag/configuring-and-administering-oracle-net-listener.html

[2] Oracle Database Net Services Administrator’s Guide 19c, “Static Service Registration” https://docs.oracle.com/en/database/oracle/oracle-database/19/netag/