杀死postgresql会话/连接

时间:2011-02-24 18:30:10

标签: database 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

21 个答案:

答案 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

来源:Kill a postgresql session/connection

答案 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

从要点中找到herehere

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)

更简单,更更新的方法是:

  1. 使用ps -ef | grep postgres查找连接号
  2. 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'
    ;