我有一个运行在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>
如果有人最近通过web访问过应用程序,就会发生这种情况(postgres会打开一个“会话”)
有没有办法终止postgres DB上的会话?
谢谢。
编辑
我可以使用phppgadmin的接口删除数据库,但不能使用rake任务。
如何使用rake任务复制phppgadmin的drop?
发布于 2011-04-22 07:06:39
如果终止应用程序正在运行的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
取消rails下的连接有时会导致下一次您尝试加载页面时它会吐出,但再次重新加载它会重新建立连接。
发布于 2016-10-02 10:06:16
更简单、更新的方法是: 1.使用ps -ef | grep postgres
查找连接# 2. sudo kill -9 "# of the connection
注:可能存在相同的PID。杀一个人就杀了所有人。
发布于 2012-06-19 05:55:23
这里有一个快速的方法,可以杀死所有到postgres数据库的连接。
sudo kill -9 `ps -u postgres -o pid`
警告:这将杀死postgres
用户打开的所有正在运行的进程,因此请确保首先执行此操作。
https://stackoverflow.com/questions/2369744
复制相似问题