【LISTENER】修改监听密码导致NL-00051错误的分析与总结

今天遇到了一个Case,在修改监听密码保存配置时抛出“NL-00051: internal error code, arguments: [302], [1], [], [], [], [], []”错误。
简单模拟再现一下这个问题,并对可能导致NL-00051错误的场景进行总结和分析。

1.问题现象
ora10g@secdb /home/oracle$ lsnrctl

LSNRCTL for Linux: Version 10.2.0.1.0 - Production on 24-MAR-2011 21:19:56

Copyright (c) 1991, 2005, Oracle.  All rights reserved.

Welcome to LSNRCTL, type "help" for information.

LSNRCTL> set current_listener listener
Current Listener is listener
LSNRCTL> change_password
Old password:
New password:
Reenter new password:
Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))
Password changed for listener
The command completed successfully
LSNRCTL> save_config
Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))
NL-00051: internal error code, arguments: [302], [1], [], [], [], [], []
LSNRCTL>

2.问题原因
原因是在创建完数据库后没有使用netca创建监听,导致在$ORACLE_HOME/network/admin/目录下不存在listener.ora文件,因此变化后的监听配置无法写入到listener.ora文件,因此抛出了NL-00051错误。
ora10g@secdb /home/oracle$ ls -l $ORACLE_HOME/network/admin/listener.ora
ls: /oracle/ora10gR2/product/10.2.0/db_2/network/admin/listener.ora: No such file or directory

3.问题处理
使用netca工具创建监听即可,亦可通过手工创建listener.ora文件的方法来解决这个问题。

4.NL-00051报错的另外一种表现形式
除由于listener.ora文件不存在导致NL-00051报错外,更常见的一种场景是listener.ora文件中包含乱码,导致监听变化信息无法写入。
针对这种问题现象,同样可以通过重建监听的方法来解决。

这里给出一种验证是否是由于listener.ora文件中包含乱码导致NL-00051报错的检验方法。

1)关闭监听
LSNRCTL> stop
Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))
The command completed successfully

2)将原有的listener.ora文件进行备份
ora10g@secdb /home/oracle$ mv $ORACLE_HOME/network/admin/listener.ora $ORACLE_HOME/network/admin/listener.ora_backup

3)创建一个不包含任何信息的listener.ora空文件
ora10g@secdb /home/oracle$ touch $ORACLE_HOME/network/admin/listener.ora

4)启动监听程序
LSNRCTL> start
Starting /oracle/ora10gR2/product/10.2.0/db_2/bin/tnslsnr: please wait...

TNSLSNR for Linux: Version 10.2.0.1.0 - Production
System parameter file is /oracle/ora10gR2/product/10.2.0/db_2/network/admin/listener.ora
Log messages written to /oracle/ora10gR2/product/10.2.0/db_2/network/log/listener.log
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=secdb)(PORT=1521)))

Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 10.2.0.1.0 - Production
Start Date                24-MAR-2011 17:59:04
Uptime                    0 days 0 hr. 0 min. 0 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /oracle/ora10gR2/product/10.2.0/db_2/network/admin/listener.ora
Listener Log File         /oracle/ora10gR2/product/10.2.0/db_2/network/log/listener.log
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=secdb)(PORT=1521)))
The listener supports no services
The command completed successfully


即使listener.ora文件为空,监听程序是依然可以顺利启动的。

5)为监听设置密码
LSNRCTL> change_password
Old password:
New password:
Reenter new password:
Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))
Password changed for LISTENER
The command completed successfully

6)将变化后的配置进行保存
LSNRCTL> save_config
Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))
Saved LISTENER configuration parameters.
Listener Parameter File   /oracle/ora10gR2/product/10.2.0/db_2/network/admin/listener.ora
Old Parameter File   /oracle/ora10gR2/product/10.2.0/db_2/network/admin/listener.bak
The command completed successfully

配置信息保存成功。
此时便会在listener.ora文件中增加有关密码设置的信息。

7)查看listener.ora文件中写入的信息
ora10g@secdb /home/oracle$ cat $ORACLE_HOME/network/admin/listener.ora

#----ADDED BY TNSLSNR 24-MAR-2011 21:30:05---
PASSWORDS_LISTENER = 1DF5C2FD0FE9CFA2
#--------------------------------------------

可见,监听密码的设置信息可以正确写入到listener.ora文件中。

通过以上的验证步骤说明在空listener.ora文件中可以完成监听密码的调整和保存操作,进而证明在listener.ora文件存在的前提下NL-00051错误是由于乱码导致的。

5.小结
导致NL-00051错误的根本原因是:监听配置的修改无法成功写入到listener.ora文件。
检查方法:确认listener.ora文件可以正常使用
处理方法:若暂时无法找到原因,可考虑使用netca工具重建监听来解决问题。

Good luck.

secooler
11.03.24

-- The End --

请使用浏览器的分享功能分享到微信等