一 背景
今天遇到一个很简单的问题,同事通过sqlplus username/password@TNSNAME的方式,远程连接一个数据库的时候,发现一直报错用户名密码错误,无法登陆。

二 问题
最初以为就是简单的用户名密码输入错误了,但是根据tnsnames.ora的配置,发现配置是正确的,IP,服务名等配置均正确,同时到对应系统用相同用户名密码登陆,确实也可以正确登陆,但是就是远程无法登陆
三 问题发现并解决
通过ip:port/service_name进行登陆,发现也是可以的。那么基本上可以确定问题就在tnsnames.ora配置的问题上。但是经过仔细排查,tnsnames.ora中的配置又完全是正确的。于是想到使用另外一种方式strace调试的方式来登陆尝试,看看是否能分析出哪里出了错:
strace sqlplus username/password@tnsname
从输出中发现了以下内容:

在sin_addr=inet_addr中会输出一个ip,该ip则为我们通过tnsnames.ora解析出来要访问的ip,此时发现该ip不是我们想要的ip。
此时,我想验证下这里是不是连接到了不是我们想要的ip上,那么我想到了另一种方式进行验证,即netstat。
netstat -ntp|grep sqlplus

可以发现,确实从netstat上来看用sqlplus连接,此时也不是我们想要的ip。
那么问题更可以确定出现在tnsnames.ora的配置上了,于是对tnsnames.ora文件进行了全局搜索,果然发现在文件中配置了两个一样的tnsname,但是数据库ip以及信息均不一样,而默认连接到后配置的那个tnsname上去了。
四 问题排查方法总结
作为软件运维人员,就是需要在遇到问题时候,能够快速根据自己的只是发现并确认问题。针对这种问题,目前我使用了两种方法:
1.strace调试;
2.netstat -ntp方式进行访问端口状态查看;
两种方式我都认为还是可以快速定位到问题,那么对于这个问题各位朋友、大佬还有什么好的方法可以快速定位呢?欢迎老板们留言,供小弟参考。




