今天遇到了一个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.问题处理
使用neca工具创建监听皆可,亦可通过手工创建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文件可以正常使用
处理方法:若暂时无法找到原因,可以考虑使用neca工具对监听重新配置。
Good luck.
secooler
11.03.24
-- The End --
分享好友
分享这个小栈给你的朋友们,一起进步吧。
订阅须知
• 所有用户可根据关注领域订阅专区或所有专区
• 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询
• 专区发布评论属默认订阅所评论专区(除付费小栈外)