gpt4 book ai didi

ruby-on-rails - Capistrano 与 PostgreSQL,错误 : database is being accessed by other users

转载 作者:行者123 更新时间:2023-11-29 11:07:35 25 4
gpt4 key购买 nike

我有一个 Rails 应用程序,它使用 PostgreSQL 作为后端,带有一个试图模拟生产的证书环境,除了它需要定期重置数据库以进行 QA。

当我在部署期间尝试从 Capistrano 任务执行 db:reset 时,出现错误:

错误:其他用户正在访问数据库“database_name”

并且无法将数据库作为重置任务的一部分删除,从而导致部署失败。有没有办法可以从 Capistrano 重置数据库连接,以便成功删除表?将 SQL 从 Capistrano 任务通过管道传输到 psql 可能可行,但我想知道是否有更好的方法来解决这个问题。

最佳答案

使用 PostgreSQL,您可以发出以下语句来返回除此连接之外的所有打开连接的后端 pids:

SELECT pid FROM pg_stat_activity where pid <> pg_backend_pid();

然后您可以向每个后端发出终止请求

SELECT pg_terminate_backend($1);

将从第一个语句返回的 pid 绑定(bind)到每个 pg_terminate_backend exec。

如果其他连接未使用与您相同的用户,您将必须以 super 用户身份连接才能成功发出终止。

更新:合并评论并表达为 Capistrano 任务:

desc "Force disconnect of open backends and drop database"
task :force_close_and_drop_db do
dbname = 'your_database_name'
run "psql -U postgres",
:data => <<-"PSQL"
REVOKE CONNECT ON DATABASE #{dbname} FROM public;
ALTER DATABASE #{dbname} CONNECTION LIMIT 0;
SELECT pg_terminate_backend(pid)
FROM pg_stat_activity
WHERE pid <> pg_backend_pid()
AND datname='#{dbname}';
DROP DATABASE #{dbname};
PSQL
end

关于ruby-on-rails - Capistrano 与 PostgreSQL,错误 : database is being accessed by other users,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12924466/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com