错误提示:
Warning: oci_connect(): OCIEnvNlsCreate() failed. There is something wrong with your system - please check that LD_LIBRARY_PATH includes the directory with Oracle Instant Client libraries in ......
Warning: oci_connect(): Error while trying to retrieve text for error ORA-01804 in ......
connection failed提示说是Oracle客户端依赖库路劲有问题。网上的解决方法大多都说是没有配置环境变量,配置完oracle环境变量基本上能解决。确实,一般情况下配置完oracle环境变量可以解决问题。但在非一般情况下就难说了。
0x00、问题来源
zabbix服务器迁移完,打开zabbix web,连接不上oracle,没有具体错误提示。
【zabbix 连接oracle数据库问题】
文章图片
创建一个测试文件把zabbix连接oracle数据库的代码copy过来,然后通过浏览器访问该测试文件,可以看到错误信息了。如下:
Warning: oci_connect(): OCIEnvNlsCreate() failed. There is something wrong with your system - please check that LD_LIBRARY_PATH includes the directory with Oracle Instant Client libraries in ......
Warning: oci_connect(): Error while trying to retrieve text for error ORA-01804 in ......
connection failed
该错误信息表示连接oracle失败,可能是系统oracle动态库路径的问题。
但仔细检查oracle动态库路径,系统上的环境变量没有问题,用sqlplus连接oracle,可以连接上。
折腾了很久,一直没找到解决方法。
最后用strace命令调试apache进程,找到了问题所在,成功解决问题。
0x02、解决方法与过程
httpd是Apache超文本传输协议(HTTP)服务器的主程序,可以使用:-X 参数启动以调试模式运行httpd。
在命令终端启动调试apache的httpd:
httpd -X -k start
打开另一个终端:strace -p http进程pid
ps -ef | grep httpd
strace -p 7270在浏览器访问zabbix测试文件(上面说的自己编写的php)
接下来在执行strace命令的终端可以看到调试信息。
文章图片
在调试过程中发现其需要的文件
oracore/
rdbms/
nls/
这三个目录是不存在的。
最后解决方法就是从其他服务器把这些需要的文件copy过来。
0x03、后记
最后问题解决了,但其中有些疑问:
连接oracle数据库,问什么有些不需要上述的文件,有些需要呢?