PostgreSQL:暂时禁用连接

PostgreSQL: Temporarily disable connections

我在PostgreSQL中有一个脚本,它每晚从dump中恢复测试数据库。该数据库由应用服务器和带有连接池的进程访问,连接池始终保持少数连接活动。

所以脚本将dump恢复到EDOCX1中(0)。然后将my_database重命名为my_old_databasemy_temp_database重命名为my_database,最后删除my_old_database

如何断开所有客户机(超级用户或非超级用户)与my_database的连接,以便对其进行重命名?如何临时阻止它们重新连接?

有没有更好的方法来做我需要的?


要将数据库"applogs"标记为不接受新连接,请执行以下操作:

1
UPDATE pg_database SET datallowconn = FALSE WHERE datname = 'applogs';

另一种可能是撤销客户机角色对数据库的"连接"访问。

断开用户与数据库的连接=终止后端。因此,要断开所有其他用户与"applogs"数据库的连接,例如:

1
2
3
SELECT pg_terminate_backend(procpid)
FROM pg_stat_activity
WHERE datname = 'applogs' AND procpid <> pg_backend_pid();

一旦你完成了这两项工作,你就是唯一一个连接到"applogs"的用户。尽管在后端实际完成断开之前可能会有延迟?


终止当前活动连接后,还可以发出此命令,只允许超级用户登录。这假设您对所有超级用户仍然具有访问权限是正常的。希望你不会只向任何人分发超级用户权限。

1
ALTER DATABASE your_db CONNECTION LIMIT 0;


从PostgreSQL 9.5开始,我们最终可以:

1
ALTER DATABASE db WITH ALLOW_CONNECTIONS FALSE;


我有一个不同的使用场景,在这个场景中,我想为每个人(包括超级用户)永远禁用一个数据库,但还没有明确地删除它,以便能够在需要时快速重新激活它。

这对一个老的8.3 Postgres很有效:

1
UPDATE pg_database SET datallowconn=FALSE WHERE datname='my_db_name';