首页 > 数据库 > MySQL > ORA-12516|数据库连接问题遇到的坑

作者 | JiekeXu
来源 | JiekeXu DBA之路(ID: JiekeXu_IT)
大家好,我是 JiekeXu,很高兴又和大家见面了,今天和大家一起看看 ORA-12516|数据库连接问题,欢迎点击上方蓝字关注我,标星或置顶,更多干货第一时间到达!
事情是这样的,听我慢慢道来,在一个夜黑风高的周五晚上,出现了……哦,不对,剧本不是这样的哈,回归正题,有两套 Oracle 11g 的单机环境通过搭建 DG switchover 的方式进行迁移,当迁移切换后,数据库状态正常,但应用无法连接,报错 ora-12516 错误,如下图所示:

[66000][12516] Listener refused the connection with the following error: ORA-12516, TNS:listener could not find available handler with matching protocol stackoracle.net.ns.NetException: Listener refused the connection with the following error:ORA-12516, TNS:listener could not find available handler with matching protocol stack.
但是自己通过轻松连接的方式测试发现,只有通过主 service_names 可以连接,其他的 service_names 均不能连接。这里的主 service_names 指的就是创建实例时生成的第一个。如下指的就是“jiekexu”。
show parameter nameNAME TYPE VALUE----------- ------------------------------cell_offloadgroup_name stringdb_file_name_convert stringdb_name string jiekexudb_unique_name string jiekexuglobal_names boolean FALSEinstance_name string jiekexulock_name_space stringlog_file_name_convert stringoptimizer_dynamic_sampling integer 2processor_group_name stringservice_names string jiekexu,test,orcl,scott

service_names 有多个服务名
查看监听状态正常,端口为 1523 .但是就是无法通过例如 test,scott 等的服务名连接,报错均为 ORA-12516,重启监听,注册监听等等,被坑了好久好久。

多番检查没有问题,于是寻求网络,强大的百度对于 ' ORA-12516: TNS: 监听程序找不到符合协议堆栈要求的可用处理程'错误,无一例外的都是让我修改最大连接数,翻了两页的内容均是一样的结果。
SQL> alter system set processes=300 scope=spfile;
无果,还是放弃百度,寻求 MOS 的帮助,但也没有太大的帮助,重启监听,修改监听参数的等等均没有进展,真可谓是山穷水尽疑无路呐。
柳暗花明又一村
20:30、21:30、22:00 时间花花的就过去了,偶然间看到“local_listener”的作用的一篇文章,【pmon只会动态注册port等于1521的监听,否则pmon不能动态注册listener,要想让pmon动态注册listener,需要设置local_listener参数。】
show parameter listenerNAME TYPE VALUE----------- ------------------------------listener_networks stringlocal_listener stringremote_listener string

查看后发现,local_listener 确实为空,没有值,但发现原主库现今的备库中此参数有值不为空。
ALTER SYSTEM SET local_listener='TEST' SCOPE=BOTH;
但奇怪的是 $ORACLE_HOME/network/admin/tnsnames.ora 文件中并没有 local_listener 参数的任何设置,猜测可能什么时候被删除了而没有注意到,故在 tnsnames.ora 此文件中添加
TESTIP = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST =10.0.X.X )(PORT = 1523)) )
然后在数据库中注册 local_listener 然后注册监听
ALTER SYSTEM SET local_listener='TESTIP' SCOPE=BOTH;
ALTER SYSTEM REGISTER;
查看监听,其他的服务名也已经注册上了,当然,有问题之前也是注册上的,这点就比较好奇,不知所以,希望有朋友不吝赐教。但使用轻松连接的方式均可以连接了。由于是事后本文,没有当时的截图,就只能到这里了。非 1521 默认端口,这个坑有点大,稍微不注意就中招了,今天有点时间,先记录一下吧,免得以后再犯同样的问题。
SQL> conn sys/REoracle@10.0.X.X:1523/test as sysdba Connected.SQL> SQL> conn sys/REoracle@10.0.X.X:1523/scott as sysdba Connected.SQL> SQL> conn sys/REoracle@10.0.X.X:1523/orcl as sysdba Connected.
备注:轻松连接方式指的是:sqlplus user/passwd@db_ip:port/server_names
前面在 tnsnames.ora 此文件中添加的 TESTIP 算是别名,代指等号后面的内容,如果不指定别名,当然也可以直接在注册是写明全部内容,就是有点长。RAC 的 local_listener 一般就是一长串地址,并没有指定别名。

ALTER SYSTEM SET local_listener='(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST =10.0.X.X )(PORT = 1523)))' SCOPE=BOTH;

那么,今天就到这里结尾了,先记录下来,以后有问题在继续跟进吧。如果此文对您有帮助,欢迎点赞、在看与转发,写作不易,坚持写作更不易,您的点赞、转发,举手之劳,便是对作者最大的支持,也能让更多的人受益,感谢!
———————————————————————————
公众号:JiekeXu DBA之路
墨天轮:https://www.modb.pro/u/4347
CSDN :https://blog.csdn.net/JiekeXu
腾讯云:https://cloud.tencent.com/developer/user/5645107
———————————————————————————


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69968215/viewspace-3010412/ ,如需转载,请注明出处,否则将追究法律责任。