Убить сеанс / соединение postgresql - PullRequest
308 голосов
/ 24 февраля 2011

Как я могу убить все мои соединения 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

Ответы [ 18 ]

561 голосов
/ 24 февраля 2011

Вы можете использовать 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;

Если вы используете Postgres8.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'
    ;
186 голосов
/ 14 мая 2014

Может быть просто перезапустить postgres => sudo service postgresql restart

18 голосов
/ 11 января 2017

Со всей информацией о запущенном процессе:

SELECT *, pg_terminate_backend(pid)
FROM pg_stat_activity 
WHERE pid <> pg_backend_pid()
AND datname = 'my_database_name';
12 голосов
/ 26 февраля 2013

OSX, Postgres 9.2 (установлен с homebrew)

$ 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

11 голосов
/ 12 января 2018

MacOS, если postgresql был установлен с brew :

brew services restart postgresql

Источник: Завершить сеанс / соединение postgresql

8 голосов
/ 20 сентября 2011

Это похоже на работу с 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

Поднято из найденных сущностей здесь и здесь .

Вот модифицированная версия , которая работает как для PostgreSQL 9.1, так и для 9.2.

6 голосов
/ 31 марта 2013

Я использую следующую задачу 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+

4 голосов
/ 13 июня 2012

У меня была эта проблема, и проблема была в том, что Navicat был подключен к моей локальной базе данных Postgres.Как только я отключил Navicat, проблема исчезла.

РЕДАКТИРОВАТЬ:

Кроме того, в качестве абсолютного крайнего средства вы можете создать резервную копию ваших данных, а затем выполнить эту команду:

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

... что уничтожит все, к чему имеет доступ пользователь postgres.Избегайте этого на производственной машине, но у вас не должно быть проблем со средой разработки.Очень важно убедиться, что каждый postgres процесс действительно завершен, прежде чем пытаться перезапустить PostgreSQL после этого.

EDIT 2:

Из-за этого unix.SE post Я изменил с kill -9 на kill -15.

3 голосов
/ 13 ноября 2016

Я РЕШЕН ЭТОМ СПОСОБОМ:

В моем Windows8 64 бит, просто restart в сервисе: postgresql-x64-9.5

3 голосов
/ 20 июня 2018
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...