programing

postgresql 세션/연결 종료

goodsources 2023. 5. 26. 20:55
반응형

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

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 ON DATABASE dbname FROM PUBLIC, username;

Postgres 8.4-9.1을 사용하는 경우 pid 대신 procid를 사용합니다.

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

아마 그냥 다시 시작할 수도 있습니다.postgres=>sudo service postgresql restart

실행 프로세스에 대한 모든 정보:

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

MacOS, postgresql이 brew와 함께 설치된 경우:

brew services restart postgresql

원본: postgresql 세션/연결 종료

보다 쉽고 업데이트된 방법은 다음과 같습니다.

  1. 사용하다ps -ef | grep postgres연결고리 찾기 #
  2. sudo kill -9 "#"동류의

참고: 동일한 PID가 있을 수 있습니다.한 명을 죽이면 모든 사람이 죽습니다.

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


데이터가 다른 곳에 있는 경우 출력을 검사하여 데이터가 어디에 있는지 확인할 수 있습니다.ps aux | grep postgres

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

특정 사용자의 세션 연결을 끊어야 하는 경우 다음과 같은 도움이 되었습니다.

모든 전류 연결 확인:

select * from pg_stat_activity; 

사용자에게 역할 부여(중요하지 않음):

set role "db_admin";

세션 종료:

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

이것은 Postgre에 효과가 있는 것 같습니다.SQL 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

여기와 여기에서 발견된 지스트에서 들어왔습니다.

Postgre 두 가지에 모두 사용할 수 있는 수정된 버전은 다음과 같습니다.SQL 9.1 및 9.2.

MacOS, postgresql이 brew와 함께 설치된 경우:

brew services restart postgresql

UBUNTU,

먼저 이것으로 확인합니다(백그라운드에서 실행 중인 킬 서버).

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

pid를 찾지 못한 경우 Postgresql 서비스를 다음과 같은 명령으로 다시 시작하면 됩니다.

sudo service postgresql restart

다음 레이크 작업을 사용하여 레일을 오버라이드합니다.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+용입니다.

다음과 같은 방법으로 해결했습니다.

Windows 8 64비트에서는restart서비스: postgresql-x64-9.5

저는 이 문제가 있었고, 문제는 Navicat가 제 로컬 Postgres db에 연결되어 있다는 것이었습니다.일단 Navic의 연결을 끊자 문제가 사라졌습니다.

편집:

또한 데이터를 백업한 후 다음 명령을 실행할 수 있습니다.

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

포스트그레스 사용자가 액세스하는 모든 것을 죽일 것입니다.프로덕션 시스템에서 이 작업을 수행하지 않도록 하되 개발 환경에 문제가 있어서는 안 됩니다.다음 항목을 모두 확인하는 것이 중요합니다. postgresPostgrePostgre를 다시 되었습니다.이후 SQL.

편집 2:

unix 때문에.가 바꾼 SE 포스트kill -9kill -15.

PG 관리자에서 서버 연결을 해제할 수 있으며(서버에서 마우스 오른쪽 버튼을 클릭하면) 재시작 시 모든 세션의 연결이 끊어집니다.

postgres를 종료하고 다시 시작합니다.단순하지만, 다른 CLI 명령이 작동하지 않는 경우가 있습니다.

그것을 떨어뜨릴 필요가 없습니다.공용 스키마를 삭제하고 다시 만들기만 하면 됩니다.대부분의 경우 이것은 정확히 같은 효과를 가집니다.

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

다른 백그라운드 프로세스가 데이터베이스를 사용하는 경우 Haris's Answer가 작동하지 않을 수 있다는 점을 지적하고 싶습니다. 지연된 작업의 경우, 저는 다음과 같이 했습니다.

script/delayed_job stop

그리고 나서야 데이터베이스를 삭제/재설정할 수 있었습니다.

원격 시나리오.하지만 레일 앱에서 테스트를 실행하려고 하면 다음과 같은 것이 표시됩니다.

"활성 레코드:: 문잘못된: PG:: ObjectInUse: ERROR: 데이터베이스 "myapp_test"를 다른 사용자가 액세스하고 있습니다. 세부 정보:데이터베이스를 사용하는 다른 세션이 하나 있습니다."

테스트를 실행하기 전에 pgAdmin 또는 다른 postgres GUI 도구를 닫아야 합니다.

소문자:
. : " 리를실못다니습".

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

저는 맥에 있고 우편물을 사용합니다.Postgres.app저는 이 문제를 앱을 종료하고 다시 시작하는 것만으로 해결했습니다.

PGadmin 열기 쿼리 페이지가 열려 있는지 확인하고 모든 쿼리 페이지를 닫고 Postgres 연결을 해제합니다.SQL server와 Connect it reach it and try delete/drop option.이게 도움이 됐어요.

위의 답변 중 하나는 확실히 Windows에서 이 문제를 해결할 수 있는 아이디어를 제공했습니다.

Windows에서 서비스를 열고 Postgres 서비스를 찾은 다음 다시 시작합니다.

먼저 닫을 쿼리/연결의 PID를 찾습니다(PostgreSQL에서 활성 연결을 나열하는 방법 참조).

mydb=> select pid, application_name, state, query from pg_stat_activity where application_name = 'myapp';
 pid  | application_name | state | query 
------+------------------+-------+-------
 1234 | myapp            | idle  | 
 5678 | myapp            | idle  | 
(2 rows)

그리고 나서, 당신이 선택한 PID와의 연결을 이와 같이 닫습니다.

mydb=> SELECT pg_terminate_backend(1234);

저는 다음과 같은 일을 했습니다.

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_cisco: "gitlab-ce"
gitlab_version: '12.4.0-ce.0.el7'

위의 중 : 위의설명중답이숨있습겨다니져나에하▁the.brew services restart postgresql

언급URL : https://stackoverflow.com/questions/5108876/kill-a-postgresql-session-connection

반응형