অন্যরা সংযুক্ত থাকতে পারে এমন সময়ে ফোটা ড্রব চাপুন


103

পোস্টগ্র্রেএসকিউএল ডিবি ক্লাস্টার থেকে আমার একটি ডাটাবেস অপসারণ করতে হবে। সক্রিয় সংযোগ থাকলেও কীভাবে আমি এটি করতে পারি? আমার এক ধরণের -forceপতাকা দরকার, যা সমস্ত সংযোগ এবং তারপরে ডিবি ছাড়বে।

আমি কীভাবে এটি বাস্তবায়ন করতে পারি?

আমি dropdbবর্তমানে ব্যবহার করছি , তবে অন্যান্য সরঞ্জামগুলিও সম্ভব।

উত্তর:


154

PostgreSQL * এ , ক্লায়েন্টরা এর সাথে সংযুক্ত থাকাকালীন আপনি কোনও ডাটাবেস ছাড়তে পারবেন না।

কমপক্ষে, dropdbইউটিলিটি সহ নয় - যা DROP DATABASEসার্ভারের ক্যোয়ারির চারপাশে কেবল একটি সাধারণ মোড়ক ।

বেশ শক্তিশালী কাজ অনুসরণ:

আপনার সার্ভারের সাথে সুপারউসার হিসাবে ব্যবহার করে psqlবা অন্য ক্লায়েন্ট ব্যবহার করুন। আপনি যে ডাটাবেসটি ফেলে দিতে চান তা ব্যবহার করবেন না

psql -h localhost postgres postgres

এখন আপনি সরল ডাটাবেস ক্লায়েন্ট ব্যবহার করে ড্রপ ডাটাবেসকে তিনটি সহজ পদক্ষেপ ব্যবহার করে জোর করতে পারেন:

  1. নিশ্চিত করুন যে কেউ এই ডাটাবেসে সংযুক্ত হতে পারে না। আপনি নিম্নলিখিত পদ্ধতিগুলির মধ্যে একটি ব্যবহার করতে পারেন (দ্বিতীয়টি নিরাপদ বলে মনে হচ্ছে তবে সুপারউসারদের থেকে সংযোগগুলি আটকাবে না)।

    /* Method 1: update system catalog */
    UPDATE pg_database SET datallowconn = 'false' WHERE datname = 'mydb';
    
    /* Method 2: use ALTER DATABASE. Superusers still can connect!
    ALTER DATABASE mydb CONNECTION LIMIT 0; */
    
  2. ব্যবহার করে এই ডাটাবেসের সাথে সংযুক্ত সমস্ত ক্লায়েন্টের সংযোগ বিচ্ছিন্ন করুন pg_terminate_backend

    SELECT pg_terminate_backend(pid)
    FROM pg_stat_activity
    WHERE datname = 'mydb';
    
    /* For old versions of PostgreSQL (up to 9.1), change pid to procpid:
    
    SELECT pg_terminate_backend(procpid)
    FROM pg_stat_activity
    WHERE datname = 'mydb'; */
    
  3. ডাটাবেসটি ফেলে দিন।

    DROP DATABASE mydb;

ধাপ 1 প্রয়োজন সুপার-ইউজার 1 ম পদ্ধতির জন্য বিশেষাধিকার, এবং ডাটাবেসের মালিক 2nd এক জন্য বিশেষাধিকার। পদক্ষেপ 2 প্রয়োজন সুপার-ইউজার বিশেষাধিকার। পদক্ষেপ 3 ডাটাবেসের মালিকের অধিকার প্রয়োজন ge


* এটি পোস্টগ্র্রেএসকিউএল এর সমস্ত সংস্করণে প্রযোজ্য, সংস্করণ 11 পর্যন্ত।



সুতরাং আমি জানি না আমি কী ভুল করেছিলাম, কিন্তু এখন আমি যে ডেটাবেসকে লক্ষ্য করেছি তার সাথে সংযোগও করতে পারি না! তাছাড়াও আমি এটা ড্রপ করতে পারেন যেমন বলে "রক্ষণাবেক্ষণ ডাটাবেসের বাদ যাবে না"
ম্যাট Skeldon

@ ম্যাটস্কেল্ডন, এই বার্তার অর্থ কী তা জানা নেই। ভ্যানিলা PostgreSQL এ আপনি টেমপ্লেট 0 এবং টেম্পলেট 1 ব্যতীত যে কোনও ডাটাবেস ফেলে দিতে পারেন। হতে পারে আপনি কিছু অ-মুক্ত / বাণিজ্যিক সংস্করণ ব্যবহার করছেন? সম্ভবত এটি ক্লায়েন্ট ইস্যু নয় সার্ভার সমস্যা? আপনি কি পিএসকিএল চেষ্টা করেছিলেন?
ফিলিপ্রেম

দুর্ভাগ্যক্রমে আমি একটি এসকিউএল ব্যাকগ্রাউন্ড থেকে এসেছি, পিজিএসকিউএল ব্যবহার করা হচ্ছে বাণিজ্যিক / মুক্ত অবস্থানের কারণে ব্যবহার করা হচ্ছে।
ম্যাট স্কেলডন

দীর্ঘস্থায়ী জম্বি সেশনগুলি যেখানে এটি আমার পক্ষে কাজ করে না। pg_terminate_backend () এই অধিবেশনগুলিকে হত্যা করে না তাই আমি কী করতে হবে তা নিয়ে এখনও খানিকটা আটকে রয়েছি: আমি একটি পোস্টগ্র্যাস সু, তবে যে সার্ভারটি চলছে সেটিতে আমার অ্যাক্সেস নেই।
আলেকজান্ডার

6

সেখানে হয় শেল ইউটিলিটি সঙ্গে এই কাজ করার জন্য একটি উপায় dropdb& pg_ctl(অথবা pg_ctlclusterডেবিয়ান এবং derivates মধ্যে)। তবে @ ফিলিপ্রেমের পদ্ধতি বেশ কয়েকটি কারণে উচ্চতর :

  • এটি কেবল প্রশ্নযুক্ত ডাটাবেস থেকে ব্যবহারকারীদের সংযোগ বিচ্ছিন্ন করে।
  • এটি পুরো ক্লাস্টারটি পুনরায় চালু করার দরকার নেই।
  • এটি তাত্ক্ষণিক পুনরায় সংযোগগুলি রোধ করে, সম্ভবত dropdbকমান্ডটি নষ্ট করে ।

আমি উদ্ধৃতি man pg_ctlcluster:

সঙ্গে --forceবিকল্প "দ্রুত" মোড ব্যবহার করা হয় যা ফিরে ছুয়ে সমস্ত সক্রিয় লেনদেন, ক্লায়েন্ট অবিলম্বে সংযোগ বিচ্ছিন্ন এবং এইভাবে পরিচ্ছন্নভাবে স্থবির। যদি এটি কাজ না করে, "তাত্ক্ষণিক" মোডে আবার শাটডাউন করার চেষ্টা করা হয়েছে যা ক্লাস্টারটিকে একটি বেমানান অবস্থায় ছেড়ে দিতে পারে এবং এর ফলে পরবর্তী শুরুতে পুনরুদ্ধারের জন্য পরিচালিত হবে। এটি যদি এখনও সহায়তা না করে তবে পোস্টমাস্টার প্রক্রিয়াটি হত্যা করা হয়। সাফল্যে 0 দিয়ে প্রস্থান করে, 2 সার্ভারটি চালু না থাকলে এবং অন্যান্য ব্যর্থতার শর্তে 1 সহ প্রস্থান করে। এই মোডটি কেবল তখনই ব্যবহার করা উচিত যখন মেশিনটি বন্ধ হতে চলেছে।

pg_ctlcluster 9.1 main restart --force

অথবা

pg_ctl restart -D datadir -m fast

অথবা

pg_ctl restart -D datadir -m immediate

অবিলম্বে অনুসরণ:

dropdb mydb

সম্ভবত তাত্ক্ষণিক উত্তরাধিকারের জন্য কোনও স্ক্রিপ্টে।


4
এটি পুরোপুরি পোস্টগ্রাসের দৃষ্টিকোণটিকে লাথি মারার পাশাপাশি এটি আদর্শের চেয়েও কম নয় তবে এটির কাজ করার নিশ্চয়তাও নেই। আপনি যখন সার্ভারটি পুনরায় চালু করবেন এবং আবার ড্রপডবি চালানোর চেষ্টা করবেন তখন কোনও ক্লায়েন্টের পক্ষে যোগাযোগ স্থাপন সম্ভব। @ ফিলিপ্রেমের উত্তর উপরে সংযোগ বিচ্ছিন্ন হওয়ার পূর্বে ডাটাবেসের সমস্ত সংযোগ অক্ষম করে এবং অন্যান্য ডাটাবেসগুলি ধরে রাখে।
জিম মিচিটনার

6

আমার ক্ষেত্রে @ ফিলিপ্রেমের উত্তর ব্যবহার করা এবং এটি সরল করে তোলা:

-- Connecting to the current user localhost's postgres instance
psql

-- Making sure the database exists
SELECT * from pg_database where datname = 'my_database_name'

-- Disallow new connections
UPDATE pg_database SET datallowconn = 'false' WHERE datname = 'my_database_name';
ALTER DATABASE my_database_name CONNECTION LIMIT 1;

-- Terminate existing connections
SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = 'my_database_name';

-- Drop database
DROP DATABASE my_database_name

0

আপনি যদি আরডিএসের মতো হন যেখানে কোনও ডাটাবেস ছাড়াই সংযোগগুলি আপনাকে ডিবিতে রাখে যেখানে আপনি ডিফল্টরূপে তৈরি হতে বলেছিলেন আপনি নিজেকে সর্বশেষ উন্মুক্ত সংযোগ হওয়ার জন্য এই রূপটি করতে পারেন।

 DROP DATABASE IF EXISTS temporary_db_that_shouldnt_exist; 

 CREATE DATABASE temporary_db_that_shouldnt_exist with OWNER your_user; 

 \connect temporary_db_that_shouldnt_exist 
 SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = 'the_db_you_want_removed'; 


 DROP DATABASE IF EXISTS the_db_you_want_removed; 
 -- 
 -- Name: the_db_you_want_removed; Type: DATABASE; Schema: -; Owner: your_user 
 -- 

 CREATE DATABASE savings_champion WITH TEMPLATE = template0 ENCODING = 'UTF8' LC_COLLATE = 'en_US.UTF-8' LC_CTYPE = 'en_US.UTF-8'; 


 ALTER DATABASE the_db_you_want_removed OWNER TO your_user; 

 \connect the_db_you_want_removed 

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