环境说明:
OS:Redhat 7.5
DB:Oracle 11.2.0.4.0 单实例
问题:
测试环境数据库端口使用默认端口1521,尝试修改默认端口为8821,修改成功后进行验证。
发现通过8821可以登录到数据库了,搞定,收工?
sqlplus cjc/******@10.0.0.10:8821/cjcdb
在验证下1521是不是连接不上了,居然还能连接?
sqlplus cjc/******@10.0.0.10:1521/cjcdb
操作过程如下:
1.停止监听
lsnrctl stop
2.修改监听文件listener.ora
cd $ORACLE_HOME/network/admin
cp listener.ora listener.ora.bak
vi listener.ora
1 2 3 4 5 | LISTENER =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))
(ADDRESS = (PROTOCOL = TCP)(HOST = myhostname)(PORT = myport))
)
|
3.修改tnsnames.ora文件
cd $ORACLE_HOME/network/admin
cp tnsnames.ora tnsnames.ora.bak
vi tnsnames.ora
(1)修改对应端口号
(2)文件末尾添加如下内容
1 2 3 4 | MYLISTENER =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = myserver )(PORT = myport))
)
|
4.修改LOCAL_LISTENER参数
show parameter local
ALTER SYSTEM SET LOCAL_LISTENER='MYLISTENER' SCOPE=BOTH;
5.启动监听文件
lsnrctl start
6.验证
sqlplus cjc/******@10.0.0.10:8821/cjcdb
成功!
sqlplus cjc/******@10.0.0.10:1521/cjcdb
成功?
sqlplus cjc/******@10.0.0.10:61521/cjcdb
随便写一个端口号,失败
问题排查:
为什么改完端口了通过1521还能远程登录?
停止监听
lsnrctl stop
测试,通过1521还能远程登录
sqlplus cjc/******@10.0.0.10:1521/cjcdb
难道是配置了多个监听?
全盘搜索,只有一个listener.ora,而且配置没问题
#find / -name listener.ora
检查1521端口对应的进程
lsof -i:1521
找到1521对应进程pid
查看进程信息
ps -ef|grep pid
xxx/bin/tnslsnr listener -inherit
已经停了监听,为何还有监听进程
手动杀掉这个进程,重启监听恢复正常。
问题原因:
Metalink上没有找到对应版本的问题,
和Bug 4518443类似,但是版本对不上,这个bug描述如下:
The listener process can hang under load while spawning a process.
The last process the listener spawned will have a stack which
includes a mutex lock call in ons_atfork_prepare().
如何检查你的数据库是否有这个问题?
ps -ef|grep -i tnslsnr|grep -v grep
如果有2个进程,说明可能会有类似的问题。
解决方案:
临时解决方案:
杀掉多余的进程。
永久解决方案:
单实例下,将SUBSCRIBE_FOR_NODE_DOWN_EVENT_<listener_name>=OFF配置到监听文件汇总。
或者打补丁。
其他:如何修改RAC环境下默认监听端口号?
1.查看当前监听配置
srvctl config listener
2.修改ocr中记录的端口号
srvctl modify listener -l LISTENER -p "TCP:<new-listener-port>"
3.修改scan_listener端口号
srvctl modify scan_listener -p <new-scan-port>
4.修改LOCAL_LISTENER
alter system set local_listener='(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=<Host-name>)(PORT=<new-port-number>))))' scope=both sid='[<your-chosen-instance> | * ] '
5.修改REMOTE_LISTENER
6.重启监听
参考:
Changing Default Listener Port Number (Doc ID 359277.1)
Changing Listener Ports On RAC/EXADATA (Doc ID 1473035.1)
Bug 4518443 - Listener hang under load (Doc ID 4518443.8)