问题描述

今天某客户现场反馈数据库无法连接,web服务无法正常访问,初步判断是数据库出现问题,远程登录oracle服务器准备进行检查。

根据经验,一般这种情况可能是监听有问题,准备查看下监听状态:

1
2
[oracle@sysu opt]$ lsnrctl status
Segmentation fault

一脸懵逼,“Segmentation fault”传说中的段错误,一种不祥的预感涌上心头,接下来看看数据库服务

1
2
3
[oracle@sysu opt]$ sqlplus /nolog
Segmentation fault

what fu*k?!这下麻烦了,sqlplus没法用,好多事情就没法做了。。

问题分析:

第一反应查看/opt/oracle/admin/orcl/bdump/alert_orcl.log日志文件,看了半天没发现什么重要的错误信息,这下只能借助搜索引擎看看了。

搜索出来的结果主要是这两种:

1.该报错信息是因为在/usr/bin目录下的gcc/g++ compilers是一个文件,引起了在link的时候错误编译

解决办法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
  1. cd /usr/bin (as root)
  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账户进行安装

1
2
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,发现根本无法成功生成,因为这个文件根本没找到

图 1

多方尝试未果,突然在一个帖子里看到同样问题的同学,最早几个回复都是提示环境变量是否正常,虽然该同学最终解决问题是通过重启服务器解决,不过也提供了思路,是否重启服务器后重置了环境变量然后恢复呢。

图 2

查看LD_LIBRARY_PATH环境变量,正常情况下这个应该是空值的,不过在这里发现是有值的:

1
2
[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实在是磨人,异常的莫名其妙,连出错原因都很难查找。

在此记下该问题解决过程,也给其他同学带来一点借鉴!