oracle segmentation fault错误
问题描述
今天某客户现场反馈数据库无法连接,web服务无法正常访问,初步判断是数据库出现问题,远程登录oracle服务器准备进行检查。
根据经验,一般这种情况可能是监听有问题,准备查看下监听状态:
一脸懵逼,“Segmentation fault”传说中的段错误,一种不祥的预感涌上心头,接下来看看数据库服务
what fu*k?!这下麻烦了,sqlplus没法用,好多事情就没法做了。。
问题分析:
第一反应查看/opt/oracle/admin/orcl/bdump/alert_orcl.log日志文件,看了半天没发现什么重要的错误信息,这下只能借助搜索引擎看看了。
搜索出来的结果主要是这两种:
1.该报错信息是因为在/usr/bin目录下的gcc/g++ compilers是一个文件,引起了在link的时候错误编译
解决办法:
根据以上命令敲完之后,sqlplus还是不行,仍然是segmentation fault错误,后来又./relink all了下,shutdown -Fr now系统,系统起来之后,oracle已经启动了。
来源:http://blog.itpub.net/3090/viewspace-669836/
2.重新编译生成sqlplus
因为了解到服务器在出问题前升级过zlib,openssl-fips,openssh,怀疑是相关的软件更新导致该错误,隐约记得stackoverflow上有个类似问题是说过一些环境的update会导致这个错误。
问题解决:
于是尝试使用方法1解决,其实是替换了gcc的版本,操作时发现未安装gcc32,于是通过yum进行安装,在yum源里查看其实是gcc34,记得切换root账户进行安装
安装完成后,relink all 发现问题依旧,重启服务器,问题仍未解决。
无奈,采用方法2,发现根本无法成功生成,因为这个文件根本没找到
多方尝试未果,突然在一个帖子里看到同样问题的同学,最早几个回复都是提示环境变量是否正常,虽然该同学最终解决问题是通过重启服务器解决,不过也提供了思路,是否重启服务器后重置了环境变量然后恢复呢。
查看LD_LIBRARY_PATH环境变量,正常情况下这个应该是空值的,不过在这里发现是有值的:
LD_LIBRARY_PATH环境变量主要是用于指定动态链接器(ld)查找ELF可执行文件运行时所依赖的动态库(so)的路径,其内容是以冒号分隔的路径列表。ld链接器将优先在该变量设置的路径中查找,若未找到则在标准库路径/lib和/usr/lib中继续搜索
于是尝试清空该变量中与oracle相关部分进行测试:
[oracle@sysu ~]$ export LD_LIBRARY_PATH=/usr/local/lib
[oracle@sysu ~]$ sqlplus
SQL*Plus: Release 10.2.0.1.0 - Production on Mon Feb 20 12:40:36 2017
Copyright (c) 1982, 2005, Oracle. All rights reserved.
Enter user-name:
确认问题原因就是$LD_LIBRARY_PATH环境变量问题,鉴于/usr/lib/oracle/12.1/client64/lib被移除后正常,于是将其mv到tmp下,以免再次影响。
顺利重启监听和数据库服务后,一切恢复正常!!
再次查看下$LD_LIBRARY_PATH环境变量,发现又重新生成了/usr/lib/oracle/12.1/client64/lib,不过这次数据库就已经正常了,猜测应该是oracle运行过程中自动生成,可能在升级软件过程中重新lib库里相关文件更新导致oracle无法正常运行,总之这个segmentation fault实在是磨人,异常的莫名其妙,连出错原因都很难查找。
在此记下该问题解决过程,也给其他同学带来一点借鉴!