【问题标题】:PostgreSQL Commands Providing No Result不提供结果的 PostgreSQL 命令
【发布时间】:2020-04-23 02:01:03
【问题描述】:

在我的数据库中,每当我通过命令行发出查询时,都有一个表不提供任何结果。

例如,如果我输入:

select * from <table>

什么都没有发生。终端停止响应,直到我按^C 取消请求。

所有其他表工作正常,我不确定是什么导致了这个错误。它刚刚开始突然发生。

【问题讨论】:

  • select * from &lt;table&gt; limit 1; - limit 1 和分号会发生什么?
  • 终端只是坐在那里没有响应。
  • 那么请添加您的 Postgres 和 psql 版本,表的确切名称和定义以及SELECT pg_size_pretty(pg_relation_size('&lt;table&gt;')); 的结果,还有任何并发​​活动吗?可能有锁...看:SELECT * FROM pg_stat_activity;SELECT * FROM pg_locks;
  • 我已经发布了一个我认为可以解决问题的解决方案。如果我犯了任何错误,请告诉我。
  • 只是为了确定:您是否使用尾随 ; 来结束语句?

标签: sql postgresql psql


【解决方案1】:

好的,我找到了解决方法。

第一次运行:

select * from pg_locks where not granted;

然后,从该表中找到关系 ID。它应该在关系下的列中。

然后运行这个命令:

select * from pg_locks where relation = <relationid>;

然后,确定已授予等于 true 的关系的 pid。应该有一个带有布尔 t 和 f 值的授权列。确定该关系的 pid。

最后,运行:

select pg_terminate_backend(<pid>);

然后,您现在应该可以访问该表了。

【讨论】:

  • select * from pg_locks where relation = '&lt;table&gt;'::regclass; 开头。并查看pg_stat_activity 以检查与pid = X 的会话在您终止之前实际上做了什么......如果它是“事务中的空闲”,则某人/某事开始了一个事务并将其留在没有提交/回滚的边缘.可能需要调查。
  • A select 只能被表上的排他锁阻塞。持有该锁的连接很可能发出了未提交的 DDL 语句。
猜你喜欢
  • 2012-01-03
  • 2014-02-03
  • 2021-12-31
  • 2013-12-30
  • 2016-10-22
  • 1970-01-01
  • 2020-12-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多