今天某客户现场反馈数据库没法链接,web服务没法正常访问,初步判断是数据库出现问题,远程登陆oracle服务器准备进行检查。html
根据经验,通常这种状况多是监听有问题,准备查看下监听状态:c++
[oracle@sysu opt]$ lsnrctl status Segmentation fault
一脸懵逼,“Segmentation fault”传说中的段错误,一种不祥的预感涌上心头,接下来看看数据库服务web
[oracle@sysu opt]$ sqlplus /nolog Segmentation fault
what fu*k?!这下麻烦了,sqlplus无法用,好多事情就无法作了。。sql
第一反应查看/opt/oracle/admin/orcl/bdump/alert_orcl.log日志文件,看了半天没发现什么重要的错误信息,这下只能借助搜索引擎看看了。数据库
搜索出来的结果主要是这两种:bash
1.该报错信息是由于在/usr/bin目录下的gcc/g++ compilers是一个文件,引发了在link的时候错误编译服务器
解决办法:oracle
1. cd /usr/bin (as root)ssh
2. mv gcc gcc.script测试
3. mv g++ g++.script
4. ln -s gcc32 gcc
5. ln -s g++32 g++
6. login as oracle software owner (make sure environment is correct)
7. cd $ORACLE_HOME/bin
8. relink all
根据以上命令敲完以后,sqlplus仍是不行,仍然是segmentation fault错误,后来又./relink all了下,shutdown -Fr now系统,系统起来以后,oracle已经启动了。
来源:http://blog.itpub.net/3090/viewspace-669836/
2.从新编译生成sqlplus
参考来源:http://www.askmaclean.com/archives/%E8%A7%A3%E5%86%B3sqlplus-segmentation-fault%E6%88%96hang%E9%97%AE%E9%A2%98.html
由于了解到服务器在出问题前升级过zlib,openssl-fips,openssh,怀疑是相关的软件更新致使该错误,隐约记得stackoverflow上有个相似问题是说过一些环境的update会致使这个错误。
因而尝试使用方法1解决,实际上是替换了gcc的版本,操做时发现未安装gcc32,因而经过yum进行安装,在yum源里查看实际上是gcc34,记得切换root帐户进行安装
yum install compat-gcc-34-3.4.6-19.el6.x86_64.rpm yum install compat-gcc-34-c++-3.4.6-19.el6.x86_64.rpm
安装完成后,relink all 发现问题依旧,重启服务器,问题仍未解决。
无奈,采用方法2,发现根本没法成功生成,由于这个文件根本没找到
多方尝试未果,忽然在一个帖子里看到一样问题的同窗,最先几个回复都是提示环境变量是否正常,虽然该同窗最终解决问题是经过重启服务器解决,不过也提供了思路,是否重启服务器后重置了环境变量而后恢复呢。
查看LD_LIBRARY_PATH环境变量,正常状况下这个应该是空值的,不过在这里发现是有值的:
[oracle@sysu ~]$ echo $LD_LIBRARY_PATH /usr/local/lib:/usr/lib/oracle/12.1/client64/lib
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实在是磨人,异常的莫名其妙,连出错缘由都很难查找。
在此记下该问题解决过程,也给其余同窗带来一点借鉴!