PostgreSQL:暂时禁用连接

Kon*_*rus 24 postgresql

我在PostgreSQL中有一个脚本,每晚都会从转储中恢复测试数据库.应用程序服务器和具有连接池的进程可以访问数据库,从而始终保持一些连接处于活动状态.

所以脚本恢复转储my_temp_database.那么它应该改名my_databasemy_old_database,my_temp_databasemy_database,并最终下降my_old_database.

如何断开所有客户端,超级用户与否my_database,以便可以重命名?我怎么能暂时阻止他们重新连接?

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

ara*_*nid 30

To mark database 'applogs' as not accepting new connections:

update pg_database set datallowconn = false where datname = 'applogs';
Run Code Online (Sandbox Code Playgroud)

Another possibility would be to revoke 'connect' access on the database for the client role(s).

Disconnect users from database = kill backend. So to disconnect all other users from "applogs" database, for example:

select pg_terminate_backend(procpid)
from pg_stat_activity
where datname = 'applogs' and procpid <> pg_backend_pid();
Run Code Online (Sandbox Code Playgroud)

Once you've done both of those, you are the only user connected to 'applogs'. Although there might actually be a delay before the backends actually finish disconnecting?

  • 在 8.3 中你可以尝试`select pg_terminate_backend(pid) from pg_stat_activity;` (2认同)

Kub*_*aun 9

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

ALTER DATABASE your_db CONNECTION LIMIT 0;
Run Code Online (Sandbox Code Playgroud)


Zor*_*org 9

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

ALTER DATABASE db WITH ALLOW_CONNECTIONS false;
Run Code Online (Sandbox Code Playgroud)