如何杀死所有postgresql连接?
我正在尝试rake db:drop
,但我得到了:
ERROR: database "database_name" is being accessed by other users
DETAIL: There are 1 other session(s) using the database.
我已经尝试关闭我从ps -ef | grep postgres
看到的流程,但这也不起作用:
kill: kill 2358 failed: operation not permitted
答案 0 :(得分:545)
您可以使用pg_terminate_backend()来终止连接。您必须是超级用户才能使用此功能。这适用于所有操作系统。
SELECT
pg_terminate_backend(pid)
FROM
pg_stat_activity
WHERE
-- don't kill my own connection!
pid <> pg_backend_pid()
-- don't kill the connections to other databases
AND datname = 'database_name'
;
在执行此查询之前,您必须REVOKE CONNECT权限以避免新连接:
REVOKE CONNECT ON DATABASE dbname FROM PUBLIC, username;
如果您使用的是Postgres 8.4-9.1,请使用procpid而不是pid
SELECT
pg_terminate_backend(procpid)
FROM
pg_stat_activity
WHERE
-- don't kill my own connection!
procpid <> pg_backend_pid()
-- don't kill the connections to other databases
AND datname = 'database_name'
;
答案 1 :(得分:183)
也许只需重新启动postgres
=&gt; sudo service postgresql restart
答案 2 :(得分:18)
关于正在运行的所有信息:
SELECT *, pg_terminate_backend(pid)
FROM pg_stat_activity
WHERE pid <> pg_backend_pid()
AND datname = 'my_database_name';
答案 3 :(得分:12)
OSX,Postgres 9.2(随自制软件一起安装)
$ launchctl unload -w ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
$ pg_ctl restart -D /usr/local/var/postgres
$ launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
如果您的datadir位于其他地方,您可以通过检查ps aux | grep postgres
答案 4 :(得分:11)
MacOS,如果使用 brew 安装 postgresql :
brew services restart postgresql
答案 5 :(得分:8)
这似乎适用于PostgreSQL 9.1:
#{Rails.root}/lib/tasks/databases.rake
# monkey patch ActiveRecord to avoid There are n other session(s) using the database.
def drop_database(config)
case config['adapter']
when /mysql/
ActiveRecord::Base.establish_connection(config)
ActiveRecord::Base.connection.drop_database config['database']
when /sqlite/
require 'pathname'
path = Pathname.new(config['database'])
file = path.absolute? ? path.to_s : File.join(Rails.root, path)
FileUtils.rm(file)
when /postgresql/
ActiveRecord::Base.establish_connection(config.merge('database' => 'postgres', 'schema_search_path' => 'public'))
ActiveRecord::Base.connection.select_all("select * from pg_stat_activity order by procpid;").each do |x|
if config['database'] == x['datname'] && x['current_query'] =~ /<IDLE>/
ActiveRecord::Base.connection.execute("select pg_terminate_backend(#{x['procpid']})")
end
end
ActiveRecord::Base.connection.drop_database config['database']
end
end
Here's a modified version适用于PostgreSQL 9.1和9.2。
答案 6 :(得分:6)
我使用以下rake任务来覆盖Rails drop_database
方法。
lib/database.rake
require 'active_record/connection_adapters/postgresql_adapter'
module ActiveRecord
module ConnectionAdapters
class PostgreSQLAdapter < AbstractAdapter
def drop_database(name)
raise "Nah, I won't drop the production database" if Rails.env.production?
execute <<-SQL
UPDATE pg_catalog.pg_database
SET datallowconn=false WHERE datname='#{name}'
SQL
execute <<-SQL
SELECT pg_terminate_backend(pg_stat_activity.pid)
FROM pg_stat_activity
WHERE pg_stat_activity.datname = '#{name}';
SQL
execute "DROP DATABASE IF EXISTS #{quote_table_name(name)}"
end
end
end
end
编辑:这适用于Postgresql 9.2+
答案 7 :(得分:4)
我有这个问题,问题是Navicat连接到我当地的Postgres数据库。一旦我断开Navicat,问题就消失了。
编辑:
此外,as an absolute last resort您可以备份数据然后运行此命令:
sudo kill -15 `ps -u postgres -o pid`
...会杀死postgres用户正在访问的所有内容。避免在生产计算机上执行此操作,但您不应该遇到开发环境问题。在此之后尝试重新启动PostgreSQL之前,确保每个 postgres
进程真正终止是至关重要的。
编辑2:
由于this unix.SE post我已从kill -9
更改为kill -15
。
答案 8 :(得分:3)
SELECT
pg_terminate_backend(pid)
FROM
pg_stat_activity
WHERE
pid <> pg_backend_pid()
-- no need to kill connections to other databases
AND datname = current_database();
-- use current_database by opening right query tool
答案 9 :(得分:3)
我已经解决了这个问题:
在我的 Windows8 64 位中,只需restart
该服务: postgresql-x64-9.5
答案 10 :(得分:1)
退出postgres并重新启动它。很简单,但每次都适用于我,其他cli命令有时不工作。
答案 11 :(得分:1)
更简单,更更新的方法是:
ps -ef | grep postgres
查找连接号sudo kill -9 "#"
的连接注意:可能有相同的PID。杀死一个人会杀死所有人。
答案 12 :(得分:1)
只是想指出,如果其他一些后台进程正在使用数据库,那么Haris的答案可能无法正常工作,在我的情况下,它延迟了工作,我做了:
stored=true
只有这样我才能删除/重置数据库。
答案 13 :(得分:0)
远程方案。但是如果您尝试在rails应用程序中运行测试,那么您会得到类似
的内容&#34; ActiveRecord :: StatementInvalid:PG :: ObjectInUse:ERROR:database&#34; myapp_test&#34;正在被其他用户访问 详细信息:使用数据库还有另外一个会话。&#34;
确保在运行测试之前关闭pgAdmin或任何其他postgres GUI工具。
答案 14 :(得分:0)
我在Mac上,并且通过Postgres.app
使用了postgres。我解决了这个问题,只是退出并重新启动该应用程序。
答案 15 :(得分:0)
打开PGadmin,查看是否有任何查询页面打开,关闭所有查询页面,并断开PostgresSQL服务器的连接,然后再次连接它,然后尝试删除/删除选项。这对我有所帮助。
答案 16 :(得分:0)
没有必要放弃它。只需删除并重新创建公共模式即可。在大多数情况下,这具有完全相同的效果。
namespace :db do
desc 'Clear the database'
task :clear_db => :environment do |t,args|
ActiveRecord::Base.establish_connection
ActiveRecord::Base.connection.tables.each do |table|
next if table == 'schema_migrations'
ActiveRecord::Base.connection.execute("TRUNCATE #{table}")
end
end
desc 'Delete all tables (but not the database)'
task :drop_schema => :environment do |t,args|
ActiveRecord::Base.establish_connection
ActiveRecord::Base.connection.execute("DROP SCHEMA public CASCADE")
ActiveRecord::Base.connection.execute("CREATE SCHEMA public")
ActiveRecord::Base.connection.execute("GRANT ALL ON SCHEMA public TO postgres")
ActiveRecord::Base.connection.execute("GRANT ALL ON SCHEMA public TO public")
ActiveRecord::Base.connection.execute("COMMENT ON SCHEMA public IS 'standard public schema'")
end
desc 'Recreate the database and seed'
task :redo_db => :environment do |t,args|
# Executes the dependencies, but only once
Rake::Task["db:drop_schema"].invoke
Rake::Task["db:migrate"].invoke
Rake::Task["db:migrate:status"].invoke
Rake::Task["db:structure:dump"].invoke
Rake::Task["db:seed"].invoke
end
end
答案 17 :(得分:0)
在PG管理员中,您可以断开服务器连接(右键单击服务器),并且所有会话都将在重新启动时断开连接
答案 18 :(得分:0)
对我来说,它从事以下工作:
sudo gitlab-ctl stop
sudo gitlab-ctl start gitaly
sudo gitlab-rake gitlab:setup [type yes and let it finish]
sudo gitlab-ctl start
我正在使用:
gitlab_edition:“ gitlab-ce”
gitlab_version:'12 .4.0-ce.0.el7'
答案 19 :(得分:0)
肯定是上面的答案之一给了我在 Windows 中解决它的想法。
从 Windows 打开服务,找到 Postgres 服务并重新启动它。
答案 20 :(得分:-1)
案例:
无法执行查询:
DROP TABLE dbo.t_tabelname
解决方案:
一个。显示查询状态活动如下:
SELECT * FROM pg_stat_activity ;
湾查找行&#39;查询&#39;列包含:
'DROP TABLE dbo.t_tabelname'
℃。在同一行中,获取&#39; PID&#39;专栏
example : 16409
d。执行这些脚本:
SELECT
pg_terminate_backend(25263)
FROM
pg_stat_activity
WHERE
-- don't kill my own connection!
25263 <> pg_backend_pid()
-- don't kill the connections to other databases
AND datname = 'database_name'
;