0

我已经为 postgreSql 安装了 oracle_fdw 插件,并且已经到了可以创建外部表的地步。但是当我尝试查询此表时,我收到以下错误:

ERROR: error connecting to Oracle: OCIEnvCreate failed to create environment handle

我通过以下线程讨论了这个确切的问题:

OCIEnvCreate 未能创建环境句柄。#133

问题是我无法为ORACLE_HOME设置环境变量。下面是检查环境的命令和正在运行的 postgres 进程的相应输出:

:$ sudo cat /proc/4885/environ | xargs -0 -n 1 echo | sort
LANG=en_IN
PGDATA=/var/lib/postgresql/9.6/main
PG_GRANDPARENT_PID=4880
PGLOCALEDIR=/usr/share/locale
PG_OOM_ADJUST_FILE=/proc/self/oom_score_adj
PGSYSCONFDIR=/etc/postgresql-common
PWD=/

我试图在所有可能的地方导出这个变量,但无济于事。我提到了以下线程:

https://unix.stackexchange.com/questions/117467/how-to-permanently-set-environmental-variables/117470

http://www.linuxtopia.org/online_books/database_guides/Practical_PostgreSQL_database/PostgreSQL_x486_007.htm

因此,我在以下文件中添加了环境变量:(使用sudo su postgres作为 postgres 登录后)

~/.bashrc
~/.bash_profile
~/.bash_login
~/.login
~/.profile
/etc/profile

在所有这些文件中,我都有以下行:

export ORACLE_HOME=/u01/app/oracle/product/11.2.0/xe/

我在这里错过了什么吗?

PS:我在 Ubuntu 17.10 上使用 Postgres 9.6

4

1 回答 1

1

您添加变量的所有位置仅由 shell 使用,因此仅当您从命令行启动 PostgreSQL 时它才会起作用。

这取决于您的启动过程,最好的地方是什么:使用 System V 初始化脚本,您可以编辑脚本,使用 systemd 在服务文件中有一个特殊的关键字。某些 Linux 发行版可能还有其他方法。

要解决您的真正问题,您只需要ORACLE_HOME使用 Instant Client 时才需要,所以我不确定这是您的问题。

不幸的是,如果 Oracle 初始化有问题,这是一般错误消息,因此很难诊断。它可能是一个糟糕的 Oracle 环境变量,但如果在一台机器上混合安装了多个 Oracle 产品,我也见过它,所以尽量避免这种情况。

跟踪后端进程可能是个好主意,strace这样您就可以查看 Oracle 尝试访问的文件。

如果您有 Oracle 的源代码,调试器可以提供帮助(只是开玩笑)。

于 2017-10-27T10:51:47.020 回答