postgresql 无法删除postgres中的实体化视图

rbl8hiat  于 2023-11-18  发布在  PostgreSQL
关注(0)|答案(2)|浏览(206)

我有一个在AWS RDS示例上运行的postgres数据库。它包含一个有点复杂的物化视图(由四个左连接创建)。我想删除它,但查询从未完成(没有错误消息,它似乎挂起)。我正在使用Postico执行SQL查询。
我不需要这个mv了,所以我真的只需要想办法把它扔掉。
有什么建议吗?谢谢!

niwlg2el

niwlg2el1#

系统视图pg_stat_activity可以告诉你每个人都在做什么,以及pg_locks谁拿着什么。
1.设置场景A:

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()

select pg_cancel_backend(pid) from pg_stat_activity 
where pid<>pg_backend_pid() and query ilike 'daughter';


如果除了如此重要和无情之外,你还很匆忙或Liam Neeson,你可以继续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不存在。而且,每个人都可以利用所有的等待时间来冷静他们的脾气。

ni65a41a

ni65a41a2#

可能有正在运行的查询阻止删除对象。
尝试先重命名它。
ALTER吸收视图名称RENAME TO new_name
这样,新的查询将失败。
或尝试禁用新连接,如此处所述
PostgreSQL: Temporarily disable connections

相关问题