245

每当我尝试删除数据库时,我都会得到:

ERROR:  database "pilot" is being accessed by other users
DETAIL:  There is 1 other session using the database.

当我使用:

SELECT pg_terminate_backend(pg_stat_activity.pid)
FROM pg_stat_activity
WHERE pg_stat_activity.datname = 'TARGET_DB';

我终止了与该数据库的连接,但如果我在此之后尝试删除数据库,则有人会自动连接到该数据库并给出此错误。可以做什么?没有人使用这个数据库,除了我。

4

23 回答 23

285

您可以阻止未来的连接:

REVOKE CONNECT ON DATABASE thedb FROM public;

(可能还有其他用户/角色;\l+参见psql

然后,您可以终止与此数据库的所有连接,但您自己的除外:

SELECT pid, pg_terminate_backend(pid) 
FROM pg_stat_activity 
WHERE datname = current_database() AND pid <> pg_backend_pid();

在旧版本pid上被调用procpid,所以你必须处理它。

由于您已经撤销CONNECT了权利,任何试图自动连接的东西都不能再这样做了。

您现在可以删除数据库。

如果您使用超级用户连接进行正常操作,这将不起作用,但如果您这样做,则需要先解决该问题。


删除数据库后,如果再次创建数据库,可以执行以下命令来恢复访问权限

GRANT CONNECT ON DATABASE thedb TO public;
于 2013-07-04T04:03:28.947 回答
214

每当我尝试删除数据库时,我都会得到:

ERROR:  database "pilot" is being accessed by other users
DETAIL:  There is 1 other session using the database.

首先你需要撤销

REVOKE CONNECT ON DATABASE TARGET_DB FROM public;

然后使用:

SELECT pg_terminate_backend(pg_stat_activity.pid)
FROM pg_stat_activity
WHERE pg_stat_activity.datname = 'TARGET_DB';

它肯定会奏效。

于 2014-07-17T05:46:03.783 回答
49

我找到了解决此问题的方法尝试在终端中运行此命令

ps -ef | grep postgres

通过此命令杀死进程

sudo kill -9 PID
于 2017-10-17T11:05:42.730 回答
40

Simply check what is the connection, where it's coming from. You can see all this in:

SELECT * FROM pg_stat_activity WHERE datname = 'TARGET_DB';

Perhaps it is your connection?

于 2013-07-03T13:35:46.043 回答
40

这意味着另一个用户正在访问数据库。只需重新启动 PostgreSQL。这个命令可以解决问题

root@kalilinux:~#sudo service postgresql restart

然后尝试删除数据库:

postgres=# drop database test_database;

这会成功的。

于 2018-03-12T09:34:51.083 回答
22

使用pgAdmin 4的 GUI 解决方案

如果您还没有,请先在仪表板上启用显示活动:

File > Preferences > Dashboards > Display > Show Activity > true

现在使用 db 禁用所有进程:

  1. 单击数据库名称
  2. 单击仪表板 > 会话
  3. 单击刷新图标
  4. 单击每个进程旁边的删除 (x) 图标以结束它们

您现在应该可以删除数据库了。

于 2018-07-16T14:00:43.560 回答
19

Postgresql 13 中的更新

您可以使用此命令强制删除数据库,从而断开连接到它的每个用户/应用程序。

DROP DATABASE db_name WITH (FORCE)

您可以查看手册了解更多信息。

FORCE - 尝试终止与目标数据库的所有现有连接。如果目标数据库中存在准备好的事务、活动的逻辑复制槽或订阅,它不会终止。

于 2021-08-30T10:07:46.877 回答
13

如果对您机器上的其他服务没有潜在影响,只需service postgresql restart

于 2017-05-15T10:54:12.403 回答
12

解决方法:
1. 关闭 Pg 服务器 2. 它将断开所有活动连接 3. 重新启动 Pg 服务器 4. 试试你的命令
在此处输入图像描述



于 2018-12-04T07:29:07.757 回答
10

在 macOS 中,尝试使用以下命令通过控制台重新启动 postgresql 数据库:

brew services restart postgresql
于 2020-07-16T04:21:44.570 回答
10

就那么简单

sudo service postgresql restart
于 2018-10-15T22:57:20.327 回答
5

REVOKE CONNECT不会阻止来自数据库所有者或超级用户的连接。因此,如果您不希望任何人连接数据库,follow 命令可能会很有用。

alter database pilot allow_connections = off;

然后使用:

SELECT pg_terminate_backend(pid)
FROM pg_stat_activity
WHERE datname = 'pilot';
于 2020-05-12T08:13:37.687 回答
3

在我看来,后台运行着一些空闲查询。

  1. 尝试先显示正在运行的查询
SELECT pid, age(clock_timestamp(), query_start), usename, query 
FROM pg_stat_activity 
WHERE query != '<IDLE>' AND query NOT ILIKE '%pg_stat_activity%' 
ORDER BY query_start desc;
  1. 杀死空闲查询(检查他们是否引用了有问题的数据库,或者您可以杀死所有这些或使用选择结果中的 pid 杀死特定的)

选择 pg_terminate_backend(procpid);

注意:杀死选择查询不会产生任何不良影响

于 2019-10-25T16:19:14.203 回答
3

就我而言,我使用的是 AWS Redshift(基于 Postgres)。似乎没有与数据库的其他连接,但我遇到了同样的错误。

ERROR:  database "XYZ" is being accessed by other users

就我而言,似乎数据库集群仍在对数据库进行一些处理,虽然没有其他外部/用户连接,但数据库仍在内部使用。我通过运行以下命令发现了这一点:

SELECT * FROM stv_sessions;

所以我的技巧是在我的代码中编写一个循环,查找其中包含我的数据库名称的行。(当然循环不是无限的,而是一个昏昏欲睡的循环等)

SELECT * FROM stv_sessions where db_name = 'XYZ';

如果找到行,则继续逐个删除每个 PID。

SELECT pg_terminate_backend(PUT_PID_HERE);

如果未找到任何行,则继续删除数据库

DROP DATABASE XYZ;

注意:就我而言,我正在编写 Java 单元/系统测试,这可以被认为是可以接受的。这对于生产代码是不可接受的。


这是 Java 中的完整 hack(忽略我的测试/实用程序类)。

  int i = 0;
  while (i < 10) {
    try {
      i++;
      logStandardOut("First try to delete session PIDs, before dropping the DB");
      String getSessionPIDs = String.format("SELECT stv_sessions.process, stv_sessions.* FROM stv_sessions where db_name = '%s'", dbNameToReset);
      ResultSet resultSet = databaseConnection.execQuery(getSessionPIDs);
      while (resultSet.next()) {
        int sessionPID = resultSet.getInt(1);
        logStandardOut("killPID: %s", sessionPID);
        String killSessionPID = String.format("select pg_terminate_backend(%s)", sessionPID);
        try {
          databaseConnection.execQuery(killSessionPID);
        } catch (DatabaseException dbEx) {
          //This is most commonly when a session PID is transient, where it ended between my query and kill lines
          logStandardOut("Ignore it, you did your best: %s, %s", dbEx.getMessage(), dbEx.getCause());
        }
      }

      //Drop the DB now
      String dropDbSQL = String.format("DROP DATABASE %s", dbNameToReset);
      logStandardOut(dropDbSQL);
      databaseConnection.execStatement(dropDbSQL);
      break;
    } catch (MissingDatabaseException ex) {
      //ignore, if the DB was not there (to be dropped)
      logStandardOut(ex.getMessage());
      break;
    } catch (Exception ex) {
      logStandardOut("Something went wrong, sleeping for a bit: %s, %s", ex.getMessage(), ex.getCause());
      sleepMilliSec(1000);
    }
  }
于 2018-09-19T19:56:22.607 回答
2

第一的:

sudo systemctl restart postgresql

然后:

drop database DATABASE_NAME;
于 2022-01-04T09:32:41.843 回答
1

虽然我发现这两个最高投票的答案在其他场合很有用,但今天,解决这个问题的最简单方法是意识到 PyCharm 可能会保持会话打开,如果我点击StopPyCharm,这可能会有所帮助。在浏览器中打开 pgAdmin4 后,我这样做了,并且几乎立即看到数据库会话统计信息下降到 0,此时我能够删除数据库。

于 2018-12-24T06:44:04.923 回答
1

如果您在 IntelliJ 中遇到此错误,请确保通过单击下面显示的按钮关闭所有窗口中的连接在此处输入图像描述

于 2021-04-26T08:22:27.577 回答
1

就我而言,即使在使用以下命令后,我仍然会收到错误 - 因为在执行后立即创建了另一个用户连接。

REVOKE CONNECT ON DATABASE <db_name> FROM public;

为我解决的问题是在上面(也在下面)使用 inferno 的解决方案来防止连接。

ALTER DATABASE <db_name> allow_connections = off

这使我可以在不立即重新创建该过程的情况下终止该过程。

SELECT pg_terminate_backend(pg_stat_activity.pid) FROM pg_stat_activity WHERE pg_stat_activity.datname = 'TARGET_DB' -- ← change this to your DB AND pid <> pg_backend_pid();

于 2021-06-19T20:06:34.767 回答
0

如果您使用 docker 运行 postgresql 服务器,请重新启动容器。

于 2022-01-26T11:40:34.703 回答
0

对我来说,我只是重新启动 postgresql。

systemctl restart postgresql
于 2021-10-30T01:45:25.597 回答
-1

停止正在运行的应用程序。(在 Eclipse 中)重试后。

于 2020-10-07T11:09:14.133 回答
-1

在终端尝试这个命令:

ps -ef | grep postgres

你会看到:

501 1445 3645 0 12:05AM 0:00.03 postgres: sasha dbname [本地] 空闲

第三个数字 (3645) 是 PID。

你可以删除这个

sudo kill -9 3645

然后开始你的 PostgreSQL 连接。

手动启动:

pg_ctl -D /usr/local/var/postgres start
于 2018-08-24T21:20:48.347 回答
-1

您需要确定的是使用数据库的服务没有运行。

遇到同样的问题,运行一些 Java 应用程序,上述选项均无效,甚至无法重新启动。

使用数据库运行ps aux终止主要服务。

  • kill -9 'PID'申请的
  • 或者如果应用程序作为服务运行,请确保service stop为您的操作系统运行 cmd。

之后,删除表的默认方法将完美无缺。

在我的例子中,有问题

于 2020-11-07T02:50:55.730 回答