एक postgresql सत्र / कनेक्शन को मार डालो


369

मैं अपने सभी पोस्टग्रैक्स्ल कनेक्शन कैसे मार सकता हूं?

मैं कोशिश कर रहा हूँ 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

जब अन्य सभी प्रयास विफल हो गए, तो pgreset मणि ने किसी तरह से रेल / पीजी को एक कनेक्शन के रूप में तय किया, जो कि नहीं था।
जोसफ

जवाबों:


671

आप एक कनेक्शन को मारने के लिए 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 ​​के बजाय procpid का उपयोग करें

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

68
ध्यान दें कि Postgres 9.2 में, procpid का नाम बदलकर pid किया जाता है।
डेविन

अगर वह एक महान व्यक्ति होता, तो क्या वह किसी sudoभी तरह से हत्या नहीं कर सकता था ?
ndnenkov

3
@ndn एक डेटाबेस सुपरयुसर OS स्तर के सुपरयुसर के समान नहीं है। sudoपीजी में नहीं है।
jpmc26

यह कई SO प्रश्नों के लिए एकमात्र काम करने वाला उत्तर है क्योंकि इसमें REVOKEकदम है। आपने किसी को बचाया, एक बार और मुझे लगता है!
आयमदेव

थिस काम करता है धन्यवाद ....
अजय कुमार

205

शायद बस पुनः आरंभ करें postgres=>sudo service postgresql restart


@Starkers मैं ऊपर के अधिकांश उत्तरों से गुज़रा, जब तक कि यह मुझ पर नहीं पड़ा :)
हारिस क्रिना

32
@ स्टार्स हाँ, विशेष रूप से उच्च भार के तहत उत्पादन में सुरक्षित;)
एराथियल

10
brew services restart postgresqlअगर यू काढ़ा है
सैम काहिन

28

चल रही प्रक्रिया के बारे में सभी जानकारी के साथ:

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


13

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


4
याbrew services restart postgresql
PJSCopeland

@PJSCopeland अत्यंत सरल समाधान के लिए धन्यवाद! मुझे लगता है कि आपकी टिप्पणी इस प्रकार से एक वास्तविक उत्तर देने की पात्र है: stackoverflow.com/a/48226667/1097104
जुसो ओह्टनन

इसके लिए धन्यवाद, @ जूसूसोतन आपको बताते हैं कि क्या है, अगर आप इससे प्रतिष्ठा चाहते हैं, तो आप कम से कम मेरी टिप्पणी पर वापस लिंक कर सकते हैं?
PJSCopland

@PJSCopeland किया।
जुसूओ ओहटन

अन्य उत्तरों और अन्य समान एसओ पोस्ट समाधानों के साथ समस्या थी। अपनी pg_ctl restart -D /usr/local/var/postgresचाल चल रहा है ! (मैंने पहली या तीसरी कमांड भी नहीं चलाई थी)।
Iggy

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

यहाँ और यहाँ पाए जाने वाले भीड़ों से उठा ।

यहाँ एक संशोधित संस्करण है जो PostgreSQL 9.1 और 9.2 दोनों के लिए काम करता है।


6

मैं रेल 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 9.1 और उसके बाद के संस्करण के pg_stat_activity.procpidबजाय उपयोग करने की आवश्यकता है pg_stat_activity.pid। देखें stackoverflow.com/a/5408501/444774
तांत्रिक

1
यह एक महान जवाब है! यह रेल डिफ़ॉल्ट से बेहतर और सुरक्षित है। धन्यवाद!
पियरसैड्रियन

5

आसान और अधिक अद्यतन तरीका है:

  1. ps -ef | grep postgresकनेक्शन खोजने के लिए उपयोग करें #
  2. sudo kill -9 "#" कनेक्शन का

नोट: समान पीआईडी ​​हो सकती है। एक को मारना सबको मार देता है।


3

मेरे पास यह मुद्दा था और समस्या यह थी कि नविकट मेरे स्थानीय पोस्टग्रेज डीबी से जुड़ा था। एक बार जब मैंने नवजात को काट दिया तो समस्या गायब हो गई।

संपादित करें:

इसके अलावा, एक अंतिम अंतिम उपाय के रूप में आप अपने डेटा का बैकअप ले सकते हैं और फिर इस कमांड को चला सकते हैं:

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

... जो पोस्टग्रैज यूजर तक पहुंच रहा है वह सब कुछ मार देगा। उत्पादन मशीन पर ऐसा करने से बचें, लेकिन आपको विकास के माहौल में कोई समस्या नहीं होनी चाहिए। यह महत्वपूर्ण है कि आप हर सुनिश्चित करें postgres इसके बाद PostgreSQL को पुनः आरंभ करने का प्रयास करने से पहले प्रक्रिया वास्तव में समाप्त हो गई है।

संपादित करें 2:

के कारण इस unix.SE पोस्ट मैं से बदल दिया है kill -9करने के लिए kill -15


1
Navicat Lite के साथ मेरे सीमित अनुभव में, बस डेटाबेस या सर्वर कनेक्शन को बंद करना हमेशा पर्याप्त नहीं होता है। Navicat Lite एप्लिकेशन समाप्त होने तक सामयिक कनेक्शन को खुला रखता है।
केन

3

मैं इस दिन हल कर रहा हूँ:

मेरे विंडोज 8 64 बिट में, बस restartसेवा को निगलना : postgresql-x64-9.5


5
यह सिर्फ एक पुनरारंभ है जो आम तौर पर उत्पादन वातावरण के लिए वांछनीय नहीं है, हग प्रक्रिया को मारना एक बहुत अधिक वांछनीय विकल्प है।
ब्रायनसी

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

1

बस यह बताना चाहता था कि अगर कुछ अन्य पृष्ठभूमि प्रक्रिया डेटाबेस का उपयोग कर रही है, तो हरिस का उत्तर काम नहीं कर सकता है, मेरे मामले में यह नौकरियों में देरी थी, मैंने किया:

script/delayed_job stop

और उसके बाद ही मैं डेटाबेस को छोड़ने / रीसेट करने में सक्षम था।


1

इसे छोड़ें और पुनः आरंभ करें। सरल, लेकिन मेरे लिए हर बार काम करता है, जहां अन्य क्लि कमांड कभी-कभी नहीं होते हैं।


सरल और काम करता है! आगे काफी स्पष्ट करने के लिए pgAdmin 4 और पुनः आरंभ करें
Ka Tech

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

0

दूरस्थ परिदृश्य। लेकिन अगर आप एक रेल एप्लिकेशन में परीक्षण चलाने की कोशिश कर रहे हैं, और आपको कुछ पसंद है

"ActiveRecord :: StatementInvalid: PG :: ObjectInUse: ERROR: डेटाबेस" myapp_test "को अन्य उपयोगकर्ताओं द्वारा एक्सेस किया जा रहा है DETAIL: डेटाबेस का उपयोग करते हुए 1 अन्य सत्र है।"

सुनिश्चित करें कि आप परीक्षण चलाने से पहले pgAdmin या किसी अन्य GUI उपकरण को बंद कर दें।


0

मामला :
क्वेरी निष्पादित करने में विफल:

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

0

मैं एक पर हूँ MAC और मैं के माध्यम से postgres का उपयोग करें Postgres.app। मैंने इस समस्या को सिर्फ छोड़ने और फिर से ऐप शुरू करने के लिए हल किया।


0

Open PGadmin देखें कि क्या कोई क्वेरी पृष्ठ खुला है, सभी क्वेरी पृष्ठ को बंद करें और PostgresSQL सर्वर को डिस्कनेक्ट करें और इसे फिर से कनेक्ट करें और हटाने / ड्रॉप विकल्प का प्रयास करें। इसने मेरी मदद की।


0

पीजी एडमिन में आप अपने सर्वर को डिस्कनेक्ट कर सकते हैं (सर्वर पर राइट क्लिक करें) और सभी सत्र पुनः आरंभ में काट दिए जाएंगे


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 '


0

सबसे पहले, Postgres को खोजें जो इसके रनिंग को पोर्ट करता है

  1. ps -ef | grep postgres

    यह पोर्ट नंबर लौटाएगा

  2. मारना -9 port_number

अंत में फिर से पोस्टग्रेज शुरू करें

brew services start postgresql 
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.