问题场景:服务器修改了静态ip,并重启了几次机器,后来在实验室通过远程桌面访问oracle数据库,发现sql developer无法连接数据库,报错“TNS:监听程序无法分发客户机连接”。之后进入windows server 2008服务器的服务,查看oracle的服务除了实例没有启动外,其他都正常,试图启动OracleService***实例后报错“错误1053:服务并未及时响应启动或控制请求
”。试图用sqlplus开启数据库,却发现无法登陆,报错“协议适配器不匹配”,在Oracle Net Manager中测试服务仍然报错“TNS:监听程序无法分发客户机连接”。
考虑可能引起问题的地方有几点:1.服务器修改ip后导致监听失效。2.服务器实例无法启动导致报错。3.上述报错内容涉及到的细节问题。
解决方法:
1.查看listen.ora和tnsnames.ora文件内容(%ORACLE_HOME%/NETWORK/ADMIN目录下):
修改ip可能会引起监听出现问题,查看并修改这两个文件中涉及到的HOST内容,是否为主机名或正确ip地址。
2.查看“ORA-12518:TNS:监听程序无法分发客户机连接”(“ORA-12518:TNS listener could not hand off client connection”)错误原因:
产生这个错误的原因有很多,大多数问题来自于内存不够用。检查%ORACLE_BASE%/diag/tnslsnr/主机名/listener/alert 文件中的log日志,查看错误原因是什么(查看之前最好重现下错误,然后再查会比较方便)。例如我的问题是:
TNS-12518: TNS:listener could not hand off client connection
TNS-12560: TNS:protocol adapter error
TNS-00530: Protocol adapter error
32-bit Windows Error: 233: Unknown error
根据错误原因,查看这篇日志:http://blog.sina.com.cn/s/blog_53a1165e0100nisv.html 里面把错误原因在linux和windows出现的情况分别进行了列举,虽然是英文的吧,但是错误原因覆盖的很广,大家可以根据自己的问题出在哪儿来进行有针对的修改。12518这个错误产生的原因很多,网上搜到的一般只是针对特定问题的解决,可能没有那个全面。如果你查到是因为自己内存太小导致的问题,可以查看这篇日志:http://blog.sina.com.cn/s/blog_5904ea280100g614.html 的解决方案。
3. 查看“错误1053:服务并未及时响应启动或控制请求
”错误原因:
服务器只装了oracle,也没有开启任何软件,不可能出现内存太小的问题,上述内容并没有帮我解决问题,于是我对另一个问题进行了调查,看看是不是因为这个问题而导致的连锁反应。
首先是百度告知的一个简单方法:http://zhidao.baidu.com/question/118588548.html
试了仍然不成功,则查看第二个方法:http://topic.csdn.net/u/20070322/09/23e755dd-19b8-47b8-9418-b9384abf6311.html 第5、6楼qingdou的回复,尝试重建监听仍然失败。
又查到一个解决方法,即重建监听不成就重建实例,在cmd下调用oradim命令创建了一个新的实例,然后调用oradim命令中的方法启动服务和实例,然后奇迹就出现了,我发现sqlplus可以登录了。登录sqlplus之后使用startup命令启动了数据库后,windows server “服务”中的OracleService***实例也可以正常启动了,然后再用sql developer就能够连接到数据库而没有12518的错误了。
总结:总的来说还是数据库实例没能启动而导致的一系列错误,虽然绕了弯路花了两天才搞定,不过也算有收获。12518的错误可能出现的情况太多,网上给的方法基本上都不详细,这个错误还是需要按照上面我写的内容一步一步的自己去定位错误具体原因才能找到错误根源。即便出现了12518错误,也有可能是其他错误引起的,所以还是需要检查各种东东才能准确错误并及时修改啊。