我有一个在AWS RDS示例上运行的postgres数据库。它包含一个有点复杂的物化视图(由四个左连接创建)。我想删除它,但查询从未完成(没有错误消息,它似乎挂起)。我正在使用Postico执行SQL查询。我不需要这个mv了,所以我真的只需要想办法把它扔掉。有什么建议吗?谢谢!
niwlg2el1#
系统视图pg_stat_activity可以告诉你每个人都在做什么,以及pg_locks谁拿着什么。1.设置场景A:
pg_stat_activity
pg_locks
create schema my_neighbourhood; select set_config('search_path','my_neighbourhood',false); create group family_that_owns_neighbourhood superuser inherit; alter schema my_neighbourhood owner to family_that_owns_neighbourhood;
并介绍公主
create table good_values as select 'school' v1, 'hobbies' v2, 'sports' v3; create view daughter as select v1,v2,v3 from good_values;
1.并行打开另一个会话(B)并介绍反派
create user badboy420 in group family_that_owns_neighbourhood inherit superuser; start transaction;
1.情节是相当可预测的,但您继续看到它在会话B的事务中瓦解:
set role badboy420; select set_config('search_path','my_neighbourhood',true); insert into daughter values ('drugs','alcohol','tiktok');
第一个就足以让她被锁定。1.从会话A开始,试着drop view daughter;,假装这意味着你只是随便地想把女儿 * 送去学校 * -它会挂起来,你必须等她还在和会话B的那个小混混一起玩。幸运的是,在情况解决之前,如果有人试着alter view daughter rename to their_girlfriend;,它现在也会挂起来,所以,有一些银线。您可以在此处插入记录刮擦暂停。你分享的验尸报告证实了这一点。如果你非常重要,不考虑任何阻碍你的人,你可以pg_cancel_backend()
drop view daughter;
alter view daughter rename to their_girlfriend;
pg_cancel_backend()
select pg_cancel_backend(pid) from pg_stat_activity where pid<>pg_backend_pid() and query ilike 'daughter';
型如果除了如此重要和无情之外,你还很匆忙或Liam Neeson,你可以继续pg_terminate_backend()(你很残忍):
pg_terminate_backend()
select pg_terminate_backend(pid) from pg_stat_activity where pid<>pg_backend_pid() and query ilike 'daughter';
型第一个选择是找到和你聊天的人,让他挂断电话;第二个选择是找到他,然后狠狠地打他的脸,把他的手机和下巴都打坏,结束谈话。请注意,在上面的两种情况下,您实际上是在对任何有关daughter的任何操作执行此操作,而不仅仅是您的操作。但是,第一:您明白了这一点,第二:这实际上会发送一个好消息。如果你想对这手术,你可以参考lock monitoring at PostgreSQL wiki.此外,pg_stat_activity可以告诉你 * 确切 * 你谁,从何时起,使用什么应用程序,从什么ip试图做什么.所有这一切都指出,你很容易跟踪他们下来,可以起诉他们到遗忘,得到限制令,让他们的假释官参与.让你等待并告诉你等待的默认行为实际上是严格和礼貌之间合理的中间地带:它在等待每个人完成他们已经开始做的事情,同时已经阻止了新人。第三个会话试图访问将等待第一个会话完成,然后第二个会话将被允许完成掉落,然后第三个人会被告知daughter不存在。而且,每个人都可以利用所有的等待时间来冷静他们的脾气。
daughter
ni65a41a2#
可能有正在运行的查询阻止删除对象。尝试先重命名它。ALTER吸收视图名称RENAME TO new_name这样,新的查询将失败。或尝试禁用新连接,如此处所述PostgreSQL: Temporarily disable connections
2条答案
按热度按时间niwlg2el1#
系统视图
pg_stat_activity
可以告诉你每个人都在做什么,以及pg_locks
谁拿着什么。1.设置场景A:
并介绍公主
1.并行打开另一个会话(B)并介绍反派
1.情节是相当可预测的,但您继续看到它在会话B的事务中瓦解:
第一个就足以让她被锁定。
1.从会话A开始,试着
drop view daughter;
,假装这意味着你只是随便地想把女儿 * 送去学校 * -它会挂起来,你必须等她还在和会话B的那个小混混一起玩。幸运的是,在情况解决之前,如果有人试着alter view daughter rename to their_girlfriend;
,它现在也会挂起来,所以,有一些银线。您可以在此处插入记录刮擦暂停。
你分享的验尸报告证实了这一点。如果你非常重要,不考虑任何阻碍你的人,你可以
pg_cancel_backend()
型
如果除了如此重要和无情之外,你还很匆忙或Liam Neeson,你可以继续
pg_terminate_backend()
(你很残忍):型
第一个选择是找到和你聊天的人,让他挂断电话;第二个选择是找到他,然后狠狠地打他的脸,把他的手机和下巴都打坏,结束谈话。
请注意,在上面的两种情况下,您实际上是在对任何有关
daughter
的任何操作执行此操作,而不仅仅是您的操作。但是,第一:您明白了这一点,第二:这实际上会发送一个好消息。如果你想对这手术,你可以参考lock monitoring at PostgreSQL wiki.此外,
pg_stat_activity
可以告诉你 * 确切 * 你谁,从何时起,使用什么应用程序,从什么ip试图做什么.所有这一切都指出,你很容易跟踪他们下来,可以起诉他们到遗忘,得到限制令,让他们的假释官参与.让你等待并告诉你等待的默认行为实际上是严格和礼貌之间合理的中间地带:它在等待每个人完成他们已经开始做的事情,同时已经阻止了新人。第三个会话试图访问将等待第一个会话完成,然后第二个会话将被允许完成掉落,然后第三个人会被告知
daughter
不存在。而且,每个人都可以利用所有的等待时间来冷静他们的脾气。ni65a41a2#
可能有正在运行的查询阻止删除对象。
尝试先重命名它。
ALTER吸收视图名称RENAME TO new_name
这样,新的查询将失败。
或尝试禁用新连接,如此处所述
PostgreSQL: Temporarily disable connections