微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在pg_bouncer之后使用pg_dump之后,search_path似乎已更改,其他客户端也受到影响

如何解决在pg_bouncer之后使用pg_dump之后,search_path似乎已更改,其他客户端也受到影响

我的网络看起来像这样:

App       (many connections)   pg_bouncer  (few sessions)   Postgresql
nodes  -----------------------   nodes   -----------------    nodes

因此pg_bouncer复用了连接,给应用程序节点以幻想它们都直接连接。

问题在我启动pg_dump时出现:转储完成几毫秒后,尽管表或序列实际上存在,但所有应用程序节点均失败,并显示错误消息“关系xxxx不存在”。我很确定原因是pg_bouncer操纵了“ search_path”变量,以便应用程序节点不再在我的模式中找到表。 即使未导入也不执行转储文件,也会在转储时发生。

注意,我已经搜索过SO和Google,并且看到有很多线程在询问生成文件中的 ,但是这不是我要的。我生成文件没有问题,我的问题是其他客户端正在使用的 pg_bouncer会话,而我对此一无所获。

最明显的解决方法可能是在应用程序中手动设置search_path,但请注意,不要陷入这种谬误:对于应用程序,一开始就没有用,因为它可能被分配了另一个pg_bouncer会话在下一笔交易中。而且我不能一直都设置它。

一个最明显的解决方法是在启动pg_dump之后立即将其设置为预期值,但是这里存在竞争条件,并且其他节点足够快,以至于我担心它们仍然会失败。

有没有一种方法可以避免让pg_dump操作此变量,或者确保它在退出前将其重置?

(另外,我认为pg_dump和search_path是造成这种情况的原因,您能建议一种方法来确认这一点吗?我所有的证据是几毫秒后的错误以及所生成文件中的set search_path指令如果执行则会产生相同的错误。)

谢谢

解决方法

不要通过pgbouncer和事务池连接pg_dump。只需更改端口号,使其直接连接到数据库即可。 pg_dump与事务池不兼容。

通过设置server_reset_query_always = 1

,您仍然可以使它正常运行

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。