我有一个运行在 Postgres 上的 Rails 应用程序。
我有两台服务器:一台用于测试,另一台用于生产。
我经常需要在测试服务器上克隆生产数据库。
我通过 Vlad 运行的命令是:
rake RAILS_ENV='test_server' db:drop db:create
我遇到的问题是收到以下错误:
ActiveRecord::StatementInvalid: PGError: ERROR: database <database_name> is being accessed by other users DROP DATABASE IF EXISTS <database_name>
如果有人最近通过网络访问应用程序(postgres 保持“ session ”打开),就会发生这种情况
有什么方法可以终止 postgres 数据库上的 session ?
谢谢。
编辑
我可以使用 phppgadmin 的界面删除数据库,但不能使用 rake 任务。
如何用 rake 任务复制 phppgadmin 的 drop?
最佳答案
如果您为您的应用程序终止了正在运行的 postgresql 连接,那么您就可以运行 db:drop 了。那么如何杀死这些连接呢?我使用以下 rake 任务:
# lib/tasks/kill_postgres_connections.rake
task :kill_postgres_connections => :environment do
db_name = "#{File.basename(Rails.root)}_#{Rails.env}"
sh = <<EOF
ps xa \
| grep postgres: \
| grep #{db_name} \
| grep -v grep \
| awk '{print $1}' \
| xargs kill
EOF
puts `#{sh}`
end
task "db:drop" => :kill_postgres_connections
从 under rails 中删除连接有时会导致它在您下次尝试加载页面时出现故障,但再次重新加载它会重新建立连接。
关于ruby-on-rails - Rails + Postgres 丢弃错误 : database is being accessed by other users,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2369744/