Убейте сеанс/соединение 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

Ответ 1

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

Ответ 2

Возможно, просто перезапустите postgres = > sudo service postgresql restart

Ответ 3

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

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

Ответ 4

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

Ответ 6

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

Поднятые из gists нашли здесь и здесь.

Здесь изменена версия, которая работает как для PostgreSQL 9.1, так и для 9.2.

Ответ 7

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

Ответ 8

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

EDIT:

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

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

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

ИЗМЕНИТЬ 2:

Благодаря этому сообщению unix.SE я изменил с kill -9 на kill -15.

Ответ 9

Я РЕШИЛ ЭТОТ ПУТЬ:

В моем Windows8 64, просто restart службе: postgresql-x64-9.5

Ответ 10

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

Ответ 11

Просто хотел указать, что Haris Answer может не работать, если какой-либо другой фоновый процесс использует базу данных, в моем случае это были задержки заданий, я сделал:

script/delayed_job stop

И только тогда мне удалось сбросить / reset базу данных.

Ответ 12

Закройте postgres и перезапустите его. Простой, но работает каждый раз для меня, где другие команды cli иногда этого не делают.

Ответ 13

Более простой и обновленный способ это:

  1. Используйте ps -ef | grep postgres ps -ef | grep postgres чтобы найти соединение
  2. sudo kill -9 "#" соединения

Примечание: может быть идентичный PID. Убийство одного убивает всех.

Ответ 14

Нет необходимости отбрасывать его. Просто удалите и заново создайте общедоступную схему. В большинстве случаев это имеет точно такой же эффект.

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

Ответ 15

Удаленный сценарий. Но если вы пытаетесь запустить тесты в приложении rails и получаете что-то вроде

"ActiveRecord:: StatementInvalid: PG:: ObjectInUse: ОШИБКА: к базе данных" myapp_test "обращаются другие пользователи ДЕТАЛИ: Существует одна другая сессия, использующая базу данных.

Перед запуском тестов убедитесь, что вы закрыли pgAdmin или любые другие инструменты графического интерфейса postgres.

Ответ 16

Я на Mac, и я использую postgres через Postgres.app. Я решил эту проблему, просто выйдя и снова запустив приложение.

Ответ 17

Откройте PGadmin, посмотрите, открыта ли какая-либо страница запросов, закройте все страницы запросов, отключите сервер PostgresSQL, снова подключите его и попробуйте удалить/удалить. Это помогло мне.

Ответ 18

Дело:
Не удалось выполнить запрос:

DROP TABLE dbo.t_tabelname

Решение:
а. Отобразить запрос Состояние Выполнение действия:

SELECT * FROM pg_stat_activity  ;

б. Найдите строку, в которой находится столбец "Запрос":

'DROP TABLE dbo.t_tabelname'

с. В той же строке получите значение столбца "PID"

example : 16409

д. Выполните следующие скрипты:

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