我在 GCP 上运行的 PostreSQL 实例遇到错误。
它表示“此实例上的事务 ID 利用率接近 100%,之后 PostgreSQL 将停止接受写入查询。”
我不可以进行任何操作。
GCP 然而轻松地向我指出了本指南:
https://cloud.google.com/sql/docs/postgres/txid-wraparound
我跟着它直到接近开头的那一点,它告诉我从 pg_temp_* 模式中删除我的表:
当我尝试使用此查询时:
SET cloudsql.enable_maintenance_mode = 'on'; /* 获取额外的交易 ID */ 删除表 pg_temp_151.tmp_map_match;
我收到以下错误:
错误:架构 pg_temp_151 的权限被拒绝 SQL 状态:42501
因此我一直没有解决问题。我也完成了其余的提示和技巧,但没有解决任何问题。所以我认为这仍然是问题所在。
有什么想法吗?非常感谢您的帮助
pg_temp
,以便 vacuum
拾取并擦除它们。或者,假设您对客户端代码有控制权或影响力,那么一旦不再需要它们,他们就需要开始显式地删除它们的 temp
资源。在这种情况下,您还可以考虑使用自己的常规模式,并将 unlogged
对象放入其中,这将允许超级用户更轻松地检查和擦除它们 - 相同的性能,更多的控制,但代价是方便。
客户端代码可能依赖于以下事实:创建为
temporary
的资源将在会话结束时“自动”删除,同时仍然使用重复使用会话的池,而无需定期关闭和重新打开它们。
错误消息和手册都提到进入单用户模式,这意味着强制断开除您之外的所有正在进行的会话。一旦这些会话消失,它们的所有 pg_temp
都可以通过手动启动或自动触发
vacuum
进行清理,而不是手动删除。要操纵某人的 pg_temp
,您必须插入拥有特定
pg_temp
模式的会话 - PostgreSQL 的设计甚至不允许超级用户这样做。接管会话并不意味着以同一用户的身份进行连接,而是意味着劫持特定的现有连接。