Capistrano 与 PostgreSQL,错误:数据库正在被其他用户访问

2024-04-19

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

当我尝试执行时db:reset在部署期间的 Capistrano 任务中,我收到错误:

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

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


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

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

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

SELECT pg_terminate_backend($1);

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

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

  • 管理信令功能文档 http://www.postgresql.org/docs/current/static/functions-admin.html#FUNCTIONS-ADMIN-SIGNAL
  • 监控统计功能 http://www.postgresql.org/docs/current/static/monitoring-stats.html#MONITORING-STATS-FUNCTIONS
  • pg_stat_activity 查看文档 http://www.postgresql.org/docs/current/static/monitoring-stats.html#PG-STAT-ACTIVITY-VIEW

更新:合并评论并表达为 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Capistrano 与 PostgreSQL,错误:数据库正在被其他用户访问 的相关文章

随机推荐