我的电视网是这样的:
App (many connections) pg_bouncer (few sessions) PostgreSql
nodes ----------------------- nodes ----------------- nodes因此,pg_bouncer多路复用连接使应用程序节点产生一种错觉,即它们都是直接连接的。
这个问题出现在我启动pg_dump时:转储完成几毫秒后,所有的应用程序节点都会失败,出现错误,上面写着"relation不存在“,尽管表或序列实际上就在那里。我很确定原因是pg_bouncer操纵了"search_path“变量,这样应用程序节点就不会再在我的模式中找到表了。即使没有导入或执行转储文件,转储时间也会发生这种情况。
注意,我已经搜索过了,google和我看到生成的文件中有很多关于search_path的线程,但是并不是我想要的。我对生成的文件没有任何问题,我的问题是其他客户端正在使用的pg_bouncer会话,而且我没有发现任何关于此的内容。
最明显的解决办法可能是在应用程序中手动设置search_path,但请注意,不要陷入这种谬误:应用程序一开始就这样做是没有用的,因为在下一个事务中可能会给它分配一个不同的pg_bouncer会话。我不可能一直都在设置它。
下一个最明显的解决方法是在启动pg_dump后立即将其设置为预期的值,但是这里存在竞争条件,其他节点速度足够快,我担心它们仍然会失败。
有没有办法避免让pg_dump操作这个变量,或者确保它在退出之前重置它?
(而且,我认为pg_dump和search_path是造成这种情况的原因,你能建议一种方法来证实这一点吗?所有的证据都是几毫秒后的错误,以及在生成的文件中设置search_path指令,如果执行它会产生相同的错误。)
谢谢
发布于 2020-09-25 17:06:24
不要通过pgb强将pg_dump与事务池连接起来。只需更改端口号,就可以直接连接到数据库。pg_dump与事务池不兼容。
通过设置server_reset_query_always = 1,您可能无论如何都可以让它工作。
https://stackoverflow.com/questions/64066007
复制相似问题