今天,DBA突然跟我说,有一台测试机的sqlplus用不了,让我帮忙看看什么问题。

问题现象就是,执行sqlplus命令后直接报错,登录不了ORACLE数据库:

[oracle@epay-test ~]$ sqlplus

Segmentation fault

 

错误信息只有"Segmentation fault",没有其它的信息。由于以前自学过一点操作系统原理,知道"Segmentation fault"表示分段错误,而Segmentation是内存方面的术语,意思就是说,可能是内存方面出错了。但是,这也看不出什么。程序报错信息是开发程序的人自己写的,谁知道这程序在什么情况下会报"Segmentation fault"这个错误。

 

所以,我尝试使用starce来追踪sqlplus的系统调用情况:

[oracle@epay-test ~]$ strace -o sqlplus_hang.log sqlplus

Segmentation fault

strace命令执行完成后,会在当前目录下生成包含sqlplus的系统调用情况信息的日志文件sqlplus_hang.log。查看日志文件内容最后面,发现:

使用strace排查Segmentation fault错误_第1张图片

说明程序尝试打开 /u01/app/oracle/product/11.2.0/dbhome_1/lib/libsqlplusic.so,但没有找到这个文件(返回值为-1)。然后程序又尝试打开 /u01/app/oracle/product/11.2.0/dbhome_1/lib/libociicus.so,还是没有找到这个文件(返回值为-1)。所以,程序最终异常终止了,并报出"Segmentation fault"的错误信息。

 

万幸的是,我在同一台机的其它地方找到了libsqlplusic.so这个库文件,看起来版本也是一样的:

然后做了个快捷链接:

[root@epay-test ~]# su - oracle

[oracle@epay-test ~]$ cd /u01/app/oracle/product/11.2.0/dbhome_1/lib/

[oracle@epay-test lib]$ ln -s /u01/app/oracle/product/11.2.0/dbhome_1/instantclient/libsqlplusic.so libsqlplusic.so

sqlplus就可以正常使用了:

使用strace排查Segmentation fault错误_第2张图片

 

虽然这只是一个小故障,但是,当初我花了几个月的时间去学习C语言,我一直在想,花这么多时间,去学习跟运维工作不太搭边的C语言是不是值得的。直到今天,我第一次将学到的C语言知识派上用场。如果我不懂C语言,我想我可能会看不懂strace命令的输出,不懂C程序内部的函数调用及程序逻辑,今天这个故障就不会排查地这么顺利了。当然,我的C语言也仅限于<>,只是C语言基础知识而已,但目前来说够了。鉴于第一次在实际工作中用上C语言知识,特地写了这边文章,以作纪念。