【问题标题】:Greenplum: Not able to drop/truncate tablesGreenplum:无法删除/截断表
【发布时间】:2016-03-10 07:32:34
【问题描述】:

我在 Greenplum(4.3.5.1) 中有一个表,我想删除最初使用主键约束创建的约束。我尝试这样做,但查询运行了 2-3 个小时,我已取消它,因为没有其他选项了,

然后我进行了备份并尝试删除表,但查询运行了 2-3 小时,最后我再次取消了查询 (执行drop table查询时,在表pg_depend、pg_class和pg_type上显示RowExclusiveLock)

我也试过截断但同样的问题

任何人都可以帮助解决这个问题,可能是什么原因?解决这个问题的最佳方法是什么?

问候

【问题讨论】:

  • select procpid, substring(current_query, 1,20), now() - query_start from pg_stat_activity order by 3;找到阻止您工作的 procpid,然后使用 select pg_cancel_backend(); 将其杀死

标签: postgresql greenplum


【解决方案1】:

您很可能遇到了锁定问题。首先要检查的是pg_locks - 它会显示当前桌子上的锁。我敢打赌你的桌子被某个进程锁定了,这就是为什么truncatedrop table 挂起的原因。找到阻塞查询并终止它,然后您就可以轻松地删除/截断目标表。

下面是对您有帮助的查询:

select * from pg_locks where relation = 'mytablename'::regclass::oid;

【讨论】:

  • 感谢回复,我检查了锁,但是pg_locks表中没有这样的行
  • 您可能连接到了错误的数据库。当你对 tableX 有一个挂起的查询并查询 pg_locks 时,你至少会看到这个挂起的查询的锁,输出不能为空
  • 当我尝试删除或截断表时,它会显示在 pg_lock 中,但没有其他查询锁定此表,我的环境中只有 1 个数据库
  • 再次,如果表被锁定或 pg_class 被锁定,截断会挂起。只需找到会话 ID 并检查 pg_locks 以获取与此会话 ID 相关的所有锁。其中一些不会被授予,然后找到阻止您需要的对象的其他进程
【解决方案2】:

你应该使用截断:

TRUNCATE TABLE  table_name;

http://www.postgresql.org/docs/9.1/static/sql-truncate.html

【讨论】:

  • Istvan,感谢您的回复,我在最初的评论中还写道,我尝试截断表,但同样的问题在 30-35 分钟之前没有响应
猜你喜欢
  • 2015-06-03
  • 1970-01-01
  • 2016-10-25
  • 1970-01-01
  • 2015-07-11
  • 1970-01-01
  • 1970-01-01
  • 2014-05-15
  • 2015-01-26
相关资源
最近更新 更多