我的网络如下所示:
App (many connections) pg_bouncer (few sessions) PostgreSql
nodes ----------------------- nodes ----------------- nodes
Run Code Online (Sandbox Code Playgroud)
因此 pg_bouncer 多路复用连接,让应用程序节点产生它们都是直接连接的错觉。
当我启动 pg_dump 时,问题就出现了:转储完成后几毫秒,所有应用程序节点都会失败,并显示错误“关系 xxxx 不存在”,尽管表或序列实际上存在。我很确定原因是 pg_bouncer 操纵“search_path”变量,以便应用程序节点不再在我的架构中找到表。即使未导入或未执行转储文件,也会在转储时发生这种情况。
请注意,我已经搜索过 SO 和 google,并且看到有很多线程询问生成文件中的search_path ,但这不是我要问的。我对生成的文件没有任何问题,我的问题是pg_bouncer 会话,我还没有找到任何与此相关的信息。
最明显的解决方法可能是在应用程序中手动设置 search_path ,但请注意,不要陷入这种谬论:应用程序在开始时执行此操作是没有用的,因为它可能会在下一次分配不同的 pg_bouncer 会话交易。而且我不能一直设置它。
下一个最明显的解决方法是在启动 pg_dump 后立即将其设置回预期值,但这里存在竞争条件,并且其他节点足够快,因此我担心它们仍然会失败。
有没有办法避免让 pg_dump 操纵这个变量,或者确保它在退出之前重置它?
(另外,我理所当然地认为 pg_dump 和 search_path 是造成这种情况的原因,你能建议一种方法来确认这一点吗?我拥有的所有证据都是几毫秒后的错误以及生成文件中的 set search_path 指令,该指令产生如果执行的话也会出现同样的错误。)
谢谢