设置LD_BIND_NOW变量以解决TNS Linux错误:29:非法搜索错误

时间:2013-04-04 09:15:54

标签: sql linux oracle bash

我在使用bash shell在我的Linux机器上为我的Oracle XE DB启动TNS Listener时遇到了问题:

LSNRCTL> start
Starting /oracle/product/11.2.0/xe/bin/tnslsnr: please wait...

TNS-12537: TNS:connection closed
 TNS-12560: TNS:protocol adapter error
  TNS-00507: Connection closed
   Linux Error: 29: Illegal seek
LSNRCTL> exit

我尝试了很多在互联网上给出的不同解决方案,最后在提到帖子后问题得到了解决 - https://dba.stackexchange.com/questions/23308/linux-error-29-illegal-seek-in-lsnrctl-for-linux-version-11-2

我案例的解决方案是:

export LD_BIND_NOW=1

我已经在多个Linux机器中安装了Oracle XE DB,但我只用了一个盒子就遇到了这个问题。这个变量是什么以及它如何解决非法寻求问题?

我的Linux机箱详情如下:

bash-4.1$ uname -a
Linux <hostname> 2.6.39-100.5.1.el6uek.x86_64 #1 SMP Tue Mar 6 20:26:00 EST 2012 x86_64 x86_64 x86_64 GNU/Linux

3 个答案:

答案 0 :(得分:1)

  

控制动态加载程序的操作

     

动态加载器有一系列环境变量   会回应。其中大部分都比ldd更有用   普通用户,可以通过运行ldd来最方便地设置   各种开关。它们包括

     

LD_BIND_NOW ---通常,函数不会在库中“查找”   直到他们被召唤设置此标志会导致所有查找   加载库时发生,启动时间较慢。它的   当你想测试程序以确保一切都是有用的时候很有用   联的。

简单来说 - 如果LD_BIND_NOW变量设置为1,在C,C ++中会导致延迟加载,库(即需要时加载库)或使用时 - 而不是在启动时加载

如果软件在混合模式下运行,也会设置。

可能在您的情况下,它是一个启动问题,这个库从未使用过......!

答案 1 :(得分:1)

今天我遇到了同样的问题。问题似乎是二进制tnslsnr可执行文件中的错误。

我的解决方案是将主机名更改为位于/oracle/product/11.2.0/xe/network/admin/listener.ora的listener.ora中的IP地址

# listener.ora Network Configuration File:

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = PLSExtProc)
      (ORACLE_HOME = /oracle/product/11.2.0/xe)
      (PROGRAM = extproc)
    )
  )

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC_FOR_XE))
      (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))
    )
  )

DEFAULT_SERVICE_LISTENER = (XE)

调整文件/etc/hosts并覆盖localhost语句(如其他答案中所述)不起作用。

我不知道是否建议使用IP地址而不是主机名,但对我来说,它可以解决问题。

答案 2 :(得分:0)

/etc/hosts文件中包含以下行:

127.0.0.1 localhost.localdomain localhost