如何解决在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 举报,一经查实,本站将立刻删除。