PostgreSQL:暂时禁用连接

时间:2010-07-06 10:06:30

标签: postgresql

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

因此脚本将转储恢复为my_temp_database。然后,它应将my_database重命名为my_old_database,将my_temp_database重命名为my_database,最后删除my_old_database

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

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

5 个答案:

答案 0 :(得分:28)

将数据库'applogs'标记为不接受新连接:

update pg_database set datallowconn = false where datname = 'applogs';

另一种可能性是撤销数据库中对客户端角色的“连接”访问。

断开用户与database = kill后端的连接。因此,要将所有其他用户与“applogs”数据库断开连接,例如:

select pg_terminate_backend(procpid)
from pg_stat_activity
where datname = 'applogs' and procpid <> pg_backend_pid();

完成这两项操作后,您就是唯一连接到“applogs”的用户。虽然在后端实际完成断开连接之前可能会有延迟?

答案 1 :(得分:9)

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

ALTER DATABASE your_db CONNECTION LIMIT 0;

答案 2 :(得分:4)

启动PostgreSQL 9.5我们终于可以:

ALTER DATABASE db WITH ALLOW_CONNECTIONS false;

答案 3 :(得分:0)

我有不同的使用场景,其中我想禁用每个人(包括超级用户),永远一个数据库,而不是明明白白放弃它只是还没有,如果需要能够快速地重新激活它。

这在旧的8.3 Postgres上运行良好:

UPDATE pg_database SET datallowconn=false WHERE datname='my_db_name';

答案 4 :(得分:0)

如果您正在与要禁止连接的数据库建立会话连接,并且在禁止连接后仍保持在同一会话中的连接,请使用以下方法:

UPDATE pg_database SET datallowconn = false WHERE datname = '_db_name_' ;

...这使您可以在不进行任何其他连接的情况下进行操作,直到重新启用

但是,如果使用它,它必须来自另一个DB的会话中:

ALTER DATABASE _db_name_ WITH ALLOW_CONNECTIONS false ;

(((我意识到这几乎是上述答案的摘要))