【问题标题】:Unable to drop database postgres RDS instance无法删除数据库 postgres RDS 实例
【发布时间】:2021-02-12 20:37:04
【问题描述】:

我有点困惑为什么我不能删除我的数据库,所以在连接到我的 rds postgres 实例之后

psql --host=mu_user.amazonaws.com --port=5432 --username=my_user --password --dbname=postgres

我已撤销与要删除的数据库的新连接

REVOKE CONNECT ON DATABASE mydb FROM public;

那么我已经终止了与

的所有连接
SELECT pid, pg_terminate_backend(pid) 
FROM pg_stat_activity 
WHERE datname = 'mydb' AND pid <> pg_backend_pid();

之后,当我想删除数据库时,我仍然不能,因为它会说

ERROR:  database "mydb" is being accessed by other users
DETAIL:  There are 10 other sessions using the database.

如果我检查实时连接

SELECT 
    pid
    ,datname
    ,usename
    ,application_name
    ,client_hostname
    ,client_port
    ,backend_start
    ,query_start
    ,query
    ,state
FROM pg_stat_activity
WHERE state = 'active';

不会有,但是如果我将活动更改为空闲,我可以看到一堆,并且在尝试使用 pg_terminate_backend(pid) 杀死它们之后,我再次无法删除数据库并且我再次遇到相同的错误,所以有人可以请帮助我理解我在这里做错了什么?

那些空闲且始终出现的连接由my_user 提供,他也是超级用户。

【问题讨论】:

  • 数据库的权限是什么?连接的用户是超级用户吗?
  • @LaurenzAlbe 是的,我的用户是超级用户。
  • @iLuvLogix 好吧,我正在尝试这样做,但发现我自己处于一个循环中,现在可以删除它,总是有空闲连接需要终止
  • 我想知道阻止 DROP DATABASE 的其他连接 - 它们是由超级用户创建的吗?

标签: postgresql


【解决方案1】:

问题是这些其他连接是由超级用户完成的,并且超级用户免于权限检查,因此撤销数据库上的CONNECT 权限不会阻止这些人。

您可以通过pg_hba.conf 阻止连接,也可以立即运行两个语句:

SELECT pg_terminate_backend(pid) FROM pg_stat_activity; DROP DATABASE mydb;

希望用户在DROP DATABASE 命中之前没有时间重新连接。

【讨论】:

  • 感谢您的澄清,我最终发现是这种情况,我以不同的方式解决了这个问题,连接到数据库的应用程序是 elixir(phoenix) 和 ecto 有 mix ecto.rollback --step 1 我没有当时没意识到。
猜你喜欢
  • 2019-07-21
  • 1970-01-01
  • 2019-06-02
  • 2020-04-11
  • 2019-07-05
  • 1970-01-01
  • 2018-09-01
  • 2017-05-22
  • 1970-01-01
相关资源
最近更新 更多