windows监听无法启动的案例
作者简介:王旭,在数据库管理方面拥有10多年经验。精通主流数据库系统,在企业数据库管理、性能优化、架构设计和高可用性能解决方案方面拥有丰富得实践经验。目前拥有(ORACLE ACE、MYSQL OCP、PG ACE、PGCA、PGCE、PGCM)等数据库认证。
背景
朋友运维的服务器在昨天晚上突然出现了监听问题,导致业务无法使用,监听无法启动也无法关闭。
环境:windows2008+oracle 11.2.0.4
他在过程中尝试过重建监听、重启服务器,甚至寻求其他人的帮助都未解决该问题。


他在尝试重建监听遇到了如下错误:

排查及处理
我远程过去后,进行了如下排查:
1、检查操作系统环境变量是否设置错误 2、检查时候安装了多个oracle环境 3、查看目前服务的启动状态 4、检查监听配置文件 5、检查服务器网卡和网络配置
在第1-2步骤中,没有问题。当我检查到第3步时候发现,系统服务中只启动了oracle数据库服务,没有启动监听,为什么监听就是起不来。我通过操作系统命令看到有如下的外部地址在访问:

我再次检查了防火墙和windows任务计划中的tcp链接信息,发现根本没有这两个外部ip,问用户他们说根本没这个ip。既然知道了端口,那么能不能通过端口找到进程占用的pid,然后kill呢?

我通过查看明明是有pid为3000的进程占用了1521端口,但是通过taskkill去杀进程却提示找不到。
于是进一步排查将操作系统中多余的进程全部关闭(包含防火墙、其它软件),发现还是如此。
进一步排查第4步,发现监听配置的是主机名。
进一步排查第5步,发现服务器中存在多个网卡,一个是使用的169.xxx.xxx.xxx,而另外一个网卡才是真实的业务ip地址。我尝试将oracle关闭,然后再通过netstat -ano的方式发现1521会随着oracle服务的启动而启动,也会随着它的关闭而关闭。过程中一直在用netstat 命令看,发现除了ipv4还要ipv6的地址占用了1521端口,这种情况不处理好,监听起来的到个蹬。
最后,我将数据库进行了关闭,修改了监听配置文件里面的host为真实业务ip地址。然后禁用了非业务的网卡,关闭了业务网卡上的ipv6选项,通过一波下来,反复启停测试,发现1521不会随着oracle服务的启停而启停。问题到这里就得到了解决。
总结
这个案例还是比较简单,之前没有遇到过这类奇葩问题,通过上面的描述,我们可以知道,监听和环境变量、oracle的配置文件及网卡有关。 当我们无从下手时,操作系统中netstat、tasklist、taskkill等命令可以帮助我们诊断出问题。




