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 状态对比
| 维度 | 动态注册 | 静态注册 |
|---|---|---|
| 状态 | READY | UNKNOWN |
| 实例未启动 | 不显示 | 显示 |
| 实例异常终止 | 自动注销 | 仍显示 |
| 维护 | 自动 | 手动 |
| 灵活性 | 高 | 低 |
| 推荐 | ✓ | 特殊场景 |
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. 最佳实践
- 生产优先动态注册:自动维护
- 特殊场景静态注册兜底:Data Guard、RMAN
- LOCAL_LISTENER 显式配置:非默认端口
- REMOTE_LISTENER 用于 RAC:SCAN
- 定期 ALTER SYSTEM REGISTER:强制注册
- 监控监听器服务:lsnrctl services
- 静态注册 ORACLE_HOME 准确:避免错误
- 混合注册:保证可用性
- 服务名规范:清晰标识
- 生产用 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/