终止postgresql会话/连接

如何杀死我所有的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
655159 次浏览

你可以使用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'
;

在执行这个查询之前,你必须撤销 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'
;

这似乎适用于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

从gist中提取在这里在这里

这是修改后的版本,适用于PostgreSQL 9.1和9.2。

我有这个问题,问题是Navicat连接到我本地的Postgres数据库。一旦我断开Navicat,问题就消失了。

编辑:

另外,作为最后的手段你可以备份你的数据,然后运行这个命令:

sudo kill -15 `ps -u postgres -o pid`

... 这将杀死postgres用户正在访问的所有内容。避免在生产机器上这样做,但在开发环境中应该不会有问题。在尝试重启PostgreSQL之前,确保每一个 postgres进程已经真正终止是至关重要的。

编辑2:

由于unix。SE后,我已经从kill -9更改为kill -15

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
< p > < br > 如果你的datadir在其他地方,你可以通过检查ps aux | grep postgres

的输出来找到它在哪里

我使用下面的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+

也许只是重新启动postgres => sudo service postgresql restart

没有必要放弃。只需删除并重新创建公共模式。在大多数情况下,这有完全相同的效果。

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

只是想指出,如果一些其他后台进程正在使用数据库,哈里斯的答案可能无法工作,在我的情况下,它是延迟的工作,我做到了:

script/delayed_job stop

只有这样我才能删除/重置数据库。

远程场景。但如果你试图在rails应用程序中运行测试,你会得到

"ActiveRecord::StatementInvalid: PG::ObjectInUse: ERROR: database "myapp_test" is being being access by other users . DETAIL:有另外一个会话正在使用数据库。" < / p >

确保在运行测试之前关闭pgAdmin或任何其他postgres GUI工具。

< p >: < br > 查询执行失败:

.输出说明
DROP TABLE dbo.t_tabelname
< br > < p >解决方案: a.查询状态活动显示如下:

SELECT * FROM pg_stat_activity  ;

b.查找“查询”列包含的行:

'DROP TABLE dbo.t_tabelname'

c.在同一行中,获取“PID”列的值

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'
;

退出postgres并重新启动。很简单,但每次对我都有效,而其他cli命令有时不能。

我是这样解决的:

在我的Windows8 64位中,只是restarting服务:postgresql - x64 - 9.5

关于运行进程的所有信息:

SELECT *, pg_terminate_backend(pid)
FROM pg_stat_activity
WHERE pid <> pg_backend_pid()
AND datname = 'my_database_name';

MacOS,如果postgresql酿造一起安装:

brew services restart postgresql

来源:终止postgresql会话/连接

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

我在mac上,我通过Postgres.app使用postgres。我解决了这个问题,只是退出,重新开始应用程序。

打开PGadmin查看是否有任何查询页面打开,关闭所有查询页面,断开PostgresSQL服务器连接,重新连接,尝试删除/删除选项。这对我很有帮助。

更简单和更新的方法是:

  1. 使用ps -ef | grep postgres查找连接#
  2. 连接的sudo kill -9 "#"

注:可能有相同的PID。杀死一个人就会杀死所有人。

在PG管理中,您可以断开您的服务器(右键单击服务器)&重启时所有会话将断开连接

我的工作如下:

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”< br > gitlab_version:“12.4.0-ce.0.el7”< / p >

当然,上面的一个答案给了我在Windows中解决它的想法。

在Windows中打开Services,找到Postgres服务并重新启动它。

答案隐藏在上面的注释之一:brew services restart postgresql

如果你需要断开一个特定用户的会话,这有助于我:

检查当前所有连接:

select * from pg_stat_activity;

授予你的用户一个角色(不重要):

set role "db_admin";

杀死届:

select pg_terminate_backend(pid)
from pg_stat_activity
where usename = '*** USER NAME TO DISCONNECT ***';

MacOS,如果postgresql安装了brew:

brew services restart postgresql

UBUNTU,

首先用这个检查(在后台运行的kill服务器)

sudo kill -9 $(lsof -i :3000 -t)

如果你没有找到pid那么你只需要重新启动 Postgresql服务的命令如下:

sudo service postgresql restart