Postgres 错误“删除待处理,将被阻止”不正确但无法清除

问题描述 投票:0回答:1

我不确定我是如何陷入这种情况的,但最近我们的应用程序无法从一个特定表中删除任何行。我检查过,我们甚至无法从 psql shell 中删除它。这是错误:

vnms=# delete from alarm_action where id = 12345678;
ERROR:  Delete is pending, will be blocked

(12345678是一个无效的、不存在的ID。错误立即返回,没有停顿)

在我看来,有某种与alarm_action表关联的“删除待处理”标记,因为我可以很好地从其他表中删除行。但我不确定那个标记在哪里。我试图在互联网上搜索错误消息,但没有成功。然后我尝试从 github 下载 postgresql 源代码,但也找不到该错误消息。

我也:

  • 重启postgres,没有变化。
  • 将数据库重命名为其他名称,没有变化。
  • 进行备份,然后删除数据库,然后创建一个新数据库并将备份恢复到其中。这会刷新所有 oid,但错误消息仍然存在。
  • 同时,如果我从旧数据库(但已重命名)和新数据库的 Alarm_action 表中删除,我会看到相同的错误消息。由于它们具有不同的 oid,因此持久性似乎不是由于 oid 造成的。
  • 我检查了pg_stat_activity,它是空的
  • 我检查pg_locks,所有的锁都被占了。我什至用 pg_terminate_backend() 强制删除所有锁。这会刷新锁的所有 pid 和 oid,但仍然保留相同的错误消息。这告诉我这个错误与 pg_locks 没有任何关系。

“删除待处理”错误也很奇怪,因为它专门与某些删除有关。如果它只是一个锁,它要么会挂起一段时间(在等待锁时),要么返回类似“无法获取锁”的信息。

我也确信这是 Postgres 的内部工作,而不是因为我们数据库中的另一个表保持了这种持久状态。即使我们愿意,我们也不知道该怎么做!

有人知道这条消息“删除正在等待,将被阻止”是什么意思吗?它是如何被追踪以及如何解锁的?谢谢。

postgresql locking
1个回答
0
投票

我现在找到原因了。有人在某个时候添加了一个触发器进行测试,该触发器错误地阻止了该表上的所有删除。 因为它是一个触发器,所以它在所有操作中都保留在数据库中:重命名、备份、恢复。

© www.soinside.com 2019 - 2024. All rights reserved.