最近几天实在忙得厉害,处理了各种数据需求,有种顾及不来,而其中有一部分问题是和数据访问相关的,问题的原因很简单,但是分析问题的过程就需要很多的经验,推导,比如下面的两个案例。
第一个是开发同学反馈,连接数据库的时候报出了下面的错误。
第一个错误是:
ORA-12154: TNS:could not resolve the connect identifier specified
第二个错误是:
ORA-12170: TNS:Connect timeout occurred连接10.129.xx..51
如果直接看这个错误,可能没有思路,第一个错误明显是网络配置的问题,但是我查看了网络的配置,本机的网络服务都是正常的,另外需要说明一下,这是一套迁移的环境。
第二个问题看起来是网络超时,可能是网络情况不好,或者访问网络的权限限制。
同时我查看了防火墙的配置,该有的IP信息都有了。
到底是哪里出了问题呢,和开发的同学聊,他的回答让我有些诧异,
访问数据的时候就报这个
这个连接串没问题
查询请求可以执行
但是insert 的时候就报错了
看到这里,我脑海里就有了大概的思路了,这很可能是DB link的问题,而上面的两个错误很可能就是访问的两个DB link,是访问失败的两个问题,一个是目标环境的监听服务有问题,另外一个是防火墙的权限问题。明白了问题修复起来分分钟就能搞定,但是分析排查还是花了些时间。
第二个是一个数据访问报错,业务同学反馈,一台搬迁的服务器修改了IP之后,他们连接应用的时候抛出了下面的错误,
[show] java.sql.SQLException: ORA-01034: ORACLE not available
ORA-27101: shared memory realm does not exist
Linux-x86_64 Error: 2: No such file or directory
看到这个错误,很明显是数据库实例出了问题,要么就是连接的数据库信息有误。
和业务同学反馈确认,他们的反馈是IP信息没有问题,我这边的权限信息也没有问题,经过了多方排查,还是没有进展,这时候我们就换一个角度来看,因为涉及到的系统是一个整体,可能包含很多子系统,所以不能完全依赖于已得到的信息,但是他们稍后反馈另一个业务出现了问题,带着疑问查看了他们的数据服务,发现这台数据库已经宕机了,错误日志如下:
PMON (ospid: 4354): terminating the instance due to error 471
System state dump requested by (instance=1, osid=4354 (PMON)), summary=[abnormal instance termination].
System State dumped to trace file /U01/app/oracle/diag/rdbms/csdb/csdb/trace/csdb_diag_4364.trc
Instance terminated by PMON, pid = 4354
可以看到是pmon终止了实例,而00471的错误是DBWR终止,
$ oerr ora 00471
00471, 00000, "DBWR process terminated with error"
// *Cause: The database writer process died
到了这里,可以基本得到一个结论,这是一个异常宕机,而不是计划中的维护。我没有着急把数据库先启动,而是启动到了nomount状态,尝试看看有什么信息,错误的原因其实很简单,就是系统资源设置不足导致,比如memlock,可以通过启动的错误日志看出。
Starting ORACLE instance (normal)
Memlock limit too small: 65536 to accommodate segment size: 402653184
明白了问题之后,调整起来修很轻松了,这方面的信息也可以通过/proc/xxx/limits来查看
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/23718752/viewspace-2142418/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/23718752/viewspace-2142418/