PG_TERMINATE_BACKEND 不结束特定会话

Posted

技术标签:

【中文标题】PG_TERMINATE_BACKEND 不结束特定会话【英文标题】:PG_TERMINATE_BACKEND does not end a specific session 【发布时间】:2015-01-27 06:49:34 【问题描述】:

由于连接,我无法删除 redshift 数据库:

Couldn't drop my_db : #<ActiveRecord::StatementInvalid: PG::ObjectInUse: ERROR:  database "my_db" is being accessed by other users

我(通过 psql)连接到同一集群的另一个数据库,并检查了我的待处理会话的 pid:

my_other_db=# select procpid from pg_stat_activity where datname='my_db';
  procpid 
 ---------
    20457
(1 row)

所以我尝试调用 PG_TERMINATE_BACKEND:

my_other_db=# select pg_terminate_backend(20457);
 pg_terminate_backend
----------------------
                    1
(1 row)

但是当我检查我的 pg_stat_activity 时,我的阻塞会话仍然在这里:

my_other_db=# select procpid from pg_stat_activity where datname='my_db';
  procpid 
 ---------
    20457
(1 row)

我仍然无法删除我的数据库。

有什么想法吗? (我不得不重启集群才能摆脱它,这不是一个令人满意的解决方案)

(当然,我尝试了另一个会话,但我设法终止了)

【问题讨论】:

【参考方案1】:

当您取消查询或终止会话时,Redshift 必须通过还原已进行的任何更改来将数据库恢复到安全状态。这可能需要不同的时间,具体取决于会话正在做什么以及影响相同表的任何其他查询正在进行。

【讨论】:

【参考方案2】:

我相信您可以通过在终止连接后立即发出查询来强制删除。

select pg_terminate_backend(20457); drop my_db;

【讨论】:

【参考方案3】:

您可以执行以下操作之一

    选择 pg_terminate_backend([pid]) 取消 [pid] 通过 Redshift 控制台终止查询

在极少数情况下,幽灵 pid 会继续运行。在这些情况下,您可以重新启动集群。

【讨论】:

以上是关于PG_TERMINATE_BACKEND 不结束特定会话的主要内容,如果未能解决你的问题,请参考以下文章

postgres如何删除会话

sql 断开数据库pg_stat_activity pg_terminate_backend

pg数据库杀掉连接

寒假特训题解

MySQL 5.7.4 安装结束时出错,提示我密码过期

postgresql学习笔记连接管理