psql: symbol lookup error: psql: undefined symbol: PQsetErrorContextVisibility

psql: symbol lookup error: psql: undefined symbol: PQsetErrorContextVisibility

我将我的 postgres 版本从 9.2.24 切换到 9.6,因为我需要 jsonb 兼容性以及其他最新功能。我是 运行 centos 7 上的虚拟机。

我决定擦除所有现有的 postgres 实例(因为它正在暂存,所以几乎是空的)然后安装 9.6。但是,一旦我输入 postgres shell,我在输入 psql:

时收到以下错误

psql: symbol lookup error: psql: undefined symbol: PQsetErrorContextVisibility

我假设我需要更改 psql 正在寻找的路径,以便它正确连接,但我不确定指向哪里。

注意:ls 显示 postgres 中的 2 个目录和 1 个文件 bash 9.6 data and initdb.log.

psql: symbol lookup error: psql: undefined symbol: PQsetErrorContextVisibility

这意味着您的 psql 副本正在 libpq.so 中寻找动态符号,而您的路径中的版本没有。

你有psql的自定义编译版本吗?而且,如果是这样,您将必须针对 9.6 提供的更新的 libpq 构建它。

因为 red hat SCL 才遇到这个问题。 我逃脱了以下。

ln -s /opt/rh/rh-postgresql96/root/usr/lib64/libpq.so.rh-postgresql96-5.9 /opt/rh/rh-postgresql96/root/usr/lib64/libpq.so.5

ln -s /opt/rh/rh-postgresql96/root/usr/lib64/libpq.so.5 /usr/lib/libpq.so.5

In 不会建议我最大的敌人使用来自 SCL 存储库的软件代替外部存储库(请参阅 centos 7 上的 postgresql 96)。

尝试

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:<your postgres lib directory>

例如

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib64/ 

(将@vaotsun 的评论转化为答案)

同意@interestedparty333。 您可以找到确切缺少的库并将文件夹添加到 LD_LIBRARY_PATH.

示例:

find ~+ -name libpq.so.5

它可以给出如下结果(~+ 给出绝对路径作为 find 的结果):

/home/myuser/postgresql-12.9/src/interfaces/libpq/libpq.so.5

所以你可以添加一个文件夹(绝对路径)到LD_LIBRARY_PATH像:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/myuser/postgresql-12.9/src/interfaces/libpq/

现在 psql 应该可以正常工作了。 如果您需要额外的库,请像上面那样为每个缺失的库找到并添加。