একটি পোস্টগ্র্যাস্কিল সেশন / সংযোগ হত্যা করুন


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;

আপনি যদি পোস্টগ্রিস 8.4-9.1 ব্যবহার করছেন তবে পিডের পরিবর্তে প্রোপপিড ব্যবহার করুন

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 এ, প্রোপিডের নাম বদলে পিড করা হয়েছে।
ডেভিন

তিনি যদি sudoসুপারইউসার হন, তবে তিনি কি আর কিল-ই মারতে পারতেন না ?
ndnenkov

3
@ndn একটি ডাটাবেস সুপারউসার কোনও ওএস স্তরের সুপারভাইজারের মতো জিনিস নয়। সেখানে নেই sudoপিজি হবে।
jpmc26

এটি বহু এসও প্রশ্নের একমাত্র কার্যকরী উত্তর কারণ এটির REVOKEপদক্ষেপ রয়েছে। আপনি কাউকে বাঁচিয়েছেন, আরও একবার অনুমান করি!
আইয়ামদেব

এই কাজের জন্য ধন্যবাদ ....
অজয় কুমার

205

সম্ভবত কেবল পুনরায় চালু করুন postgres=>sudo service postgresql restart


@ স্টারকার্স আমি উপরের উত্তরগুলি সর্বাধিক দিয়েছি, যতক্ষণ না এটি আমার উপর অবতীর্ণ হয় :)
হারিস ক্রাজিনা

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

ওএসএক্স, পোস্টগ্রিস 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
পিজেএসকোপল্যান্ড

@ পিজেএসকোপল্যান্ড অত্যন্ত সহজ সমাধানের জন্য ধন্যবাদ! : আমি আপনার মন্তব্য একটি বাস্তব উত্তর, এইভাবে হতে দাবী মনে stackoverflow.com/a/48226667/1097104
Juuso Ohtonen

তার জন্য ধন্যবাদ, @ জুসো ওহটনেন। আপনাকে বলছি যদিও, আপনি যদি এর থেকে খ্যাতি চান, তবে আপনি আমার মন্তব্যে অন্তত লিঙ্ক করতে পারেন?
পিজেএসকোপল্যান্ড

@PJSCopeland হয়েছে
জুসো ওহটনেন

অন্যান্য উত্তর এবং অন্যান্য অনুরূপ এসও পোস্ট সমাধানগুলির সাথে সমস্যা ছিল। আপনার চালানো pg_ctl restart -D /usr/local/var/postgresচালাকি! (আমি এমনকি প্রথম বা তৃতীয় আদেশটিও চালাইনি)।
ইগগি

8

এটি পোস্টগ্রিসকিউএল 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

এখানে এবং এখানে পাওয়া গেস্টগুলি থেকে উদ্ধৃত ।

এখানে একটি পরিবর্তিত সংস্করণ রয়েছে যা পোস্টগ্র্রেএসকিউএল 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

সম্পাদনা করুন: এটি পোস্টগ্র্যাস্কল 9.2+ এর জন্য


আপনার পোস্টগ্রিস 9.1 এবং নীচের pg_stat_activity.procpidপরিবর্তে ব্যবহার করতে হবে pg_stat_activity.pid। দেখুন stackoverflow.com/a/5408501/444774
talyric

1
এটি একটি দুর্দান্ত উত্তর! এটি রেলস ডিফল্টের চেয়ে ভাল এবং সুরক্ষিত। ধন্যবাদ!
পিয়ার্স্যাড্রিয়ান

5

সহজ এবং আরও আপডেটের উপায় হ'ল:

  1. ps -ef | grep postgresসংযোগটি খুঁজে পেতে ব্যবহার করুন #
  2. sudo kill -9 "#" সংযোগের

দ্রষ্টব্য: অভিন্ন পিআইডি থাকতে পারে। একজনকে হত্যা করা সকলকে হত্যা করে।


3

আমার এই সমস্যাটি ছিল এবং সমস্যাটি ছিল যে নাভিচ্যাট আমার স্থানীয় পোস্টগ্রিস ডিবিতে সংযুক্ত ছিল। একবার আমি নাভিচ্যাট সংযোগ বিচ্ছিন্ন হয়ে গেলে সমস্যাটি অদৃশ্য হয়ে গেল।

সম্পাদনা করুন:

এছাড়াও, একটি নিখুঁত শেষ অবলম্বন হিসাবে আপনি আপনার ডেটা ব্যাক আপ করতে পারেন তারপর এই আদেশটি চালান:

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

... যা পোস্টগ্রিজ ব্যবহারকারী অ্যাক্সেস করছে এমন সমস্ত কিছুকে হত্যা করবে। কোনও প্রোডাকশন মেশিনে এটি করা এড়াবেন তবে আপনার বিকাশের পরিবেশ নিয়ে সমস্যা হবে না। এটি অত্যাবশ্যক যে আপনি নিশ্চিত করে নিন যে এর postgresপরে পোস্টগ্রেএসকিউএল পুনরায় চালু করার চেষ্টা করার আগে প্রতিটি প্রক্রিয়া সত্যই বন্ধ হয়ে গেছে।

সম্পাদনা 2:

দরুন এই unix.SE পোস্টে আমি থেকে পরিবর্তন করেছি kill -9করতে kill -15


1
নাভিচ্যাট লাইটের সাথে আমার সীমিত অভিজ্ঞতায় ডাটাবেস বা সার্ভার সংযোগটি কেবল বন্ধ করা সবসময়ই যথেষ্ট নয়। অ্যাপ্লিকেশনটি শেষ না হওয়া পর্যন্ত নাভিচ্যাট লাইট মাঝে মাঝে সংযোগ খোলা রাখবে বলে মনে হচ্ছে।
কেন

3

আমি এই ভাবে সমাধান করেছি:

আমার সালে Windows8 64 বিট, শুধু restartসেবা ing: 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 এবং পুনরায় চালু করতে
কা টেক

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

রিমোট দৃশ্য। তবে আপনি যদি রেল অ্যাপে পরীক্ষা চালানোর চেষ্টা করছেন এবং আপনি এরকম কিছু পান

"অ্যাক্টিভেকর্ড :: স্টেটমেন্টআইনওয়েড: পিজি :: অবজেক্টইন ইউজ: এআরআরআর: ডেটাবেস" মায়াপ_স্টেস্ট "অন্যান্য ব্যবহারকারীদের দ্বারা অ্যাক্সেস করা হয়েছে বিবরণ: ডাটাবেস ব্যবহার করে অন্য 1 টি অধিবেশন রয়েছে।"

পরীক্ষা চালানোর আগে আপনি পিজএডমিন বা অন্য কোনও পোস্টগ্রিজ জিইউআই সরঞ্জাম বন্ধ করে দিয়েছেন তা নিশ্চিত করুন।


0

কেস:
কোয়েরি কার্যকর করতে ব্যর্থ:

DROP TABLE dbo.t_tabelname

সমাধান:
ক। স্থিতি ক্রিয়াকলাপটি অনুসরণ হিসাবে প্রদর্শন করুন:

SELECT * FROM pg_stat_activity  ;

খ। যেখানে 'ক্যোয়ারি' কলামটিতে সারি রয়েছে তা সন্ধান করুন:

'DROP TABLE dbo.t_tabelname'

গ। একই সারিতে, 'পিআইডি' কলামের মান পান

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

আমি একটি ম্যাকের উপর আছি এবং এর মাধ্যমে পোস্টগ্রিজ ব্যবহার করি Postgres.app। আমি এই সমস্যাটি সবে ছেড়ে দিয়ে আবার অ্যাপ্লিকেশন শুরু করে দিয়েছি।


0

পিগাডমিন ওপেন করুন দেখুন যে কোনও কোয়েরি পৃষ্ঠা খোলা আছে কিনা, সমস্ত কোয়েরি পৃষ্ঠাটি বন্ধ করুন এবং পোস্টগ্রিসএসকিউএল সার্ভারটি সংযোগ বিচ্ছিন্ন করুন এবং আবার এটি সংযোগ করুন এবং মুছুন / ড্রপ বিকল্পটি চেষ্টা করুন his এটি আমাকে সহায়তা করেছে।


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

আমি ব্যবহার করছি:
গিটল্যাব_ইডিশন: "গিটল্যাব-সিই"
গিতলাব_আরভিশন: '12 .4.0-ce.0.el7 '


0

প্রথমে পোস্টগ্রিসটি সন্ধান করুন যা এটি চলছে port

  1. ps -ef | grep postgres

    এটি পোর্ট নম্বর ফিরিয়ে দেবে

  2. হত্যা -9 port_number

শেষে আবার পোস্টগ্রিস শুরু করুন

brew services start postgresql 
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.