হেরোকু পোস্টগ্র্রেস - হ্যাং কোয়েরি শেষ করুন (লেনদেনে নিষ্ক্রিয়)


102

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

select * from pg_stat_activity

একটি এন্ট্রি আছে

<IDLE> in transaction

কারেন্ট_কোয়ারী_পেক্স কলামে

ফলস্বরূপ, আমি যে টেবিলটি শেষ করে দেওয়া ক্যোয়ারী দ্বারা লিখিত ছিল তা ফেলে দিতে পারি না। আমি পিজি_স্যান্সেল_ব্যাকেন্ড (এন) ব্যবহার করার চেষ্টা করেছি এবং এটি সত্য ফিরে আসে তবে কিছুই ঘটেছিল বলে মনে হয় না।

আমি কীভাবে এই প্রক্রিয়াটি শেষ করতে পারি যাতে আমি টেবিলটি ফেলে দিতে পারি?


4
হয়ত প্রশ্নটির পুনঃব্যবহার করা উচিত "যখন পোস্টগ্রিস সার্ভারে না রুট অ্যাক্সেস এবং ডাটাবেসে কোনও অতিরিক্ত ব্যবহারকারীর অ্যাক্সেস না থাকে তখন কীভাবে আমি আমার নিজের প্রশ্নটি শেষ করব"। এটি সত্যিই খুব ভাল প্রশ্নের মতো মনে হচ্ছে ... এবং আমি উত্তরটি জানি না।
tobixen

উত্তর:


141

এটি একটি সাধারণ পোস্টগ্রাসের উত্তর, এবং হিরকুর সাথে নির্দিষ্ট নয়


(এই প্রশ্নের সহজ-বোকা উত্তর হতে পারে ... কেবল পোস্টগ্র্যাসকিএল পুনরায় আরম্ভ করুন ing ধরে নেওয়া যায় যে এটি পছন্দসই নয় বা বিকল্প নয় ...)

এই স্কয়ার চালিয়ে পিআইডি সন্ধান করুন:

SELECT pid , query, * from pg_stat_activity
  WHERE state != 'idle' ORDER BY xact_start;

(ক্যোয়ারির পোস্টগ্রাসের সংস্করণের উপর নির্ভরশীল সংশোধন দরকার হতে পারে - অবশেষে কেবলমাত্র পিজি_স্ট্যাট_অ্যাক্টিভিটি থেকে * নির্বাচন করুন)। আপনি প্রথম (বাম) কলামে পিডটি পেয়ে যাবেন এবং প্রথম (শীর্ষ) সারিটি আপনি যে ক্লোয়ারটি শেষ করতে চান তা হতে পারে। আমি ধরে নিচ্ছি পিডটি নীচে 1234।

আপনি এসকিউএল (যেমন শেল অ্যাক্সেস ব্যতীত) কোনও ক্যোয়ারী বাতিল করতে পারেন যতক্ষণ না এটি আপনার বা আপনার ব্যবহারকারীর কাছে অ্যাক্সেস রয়েছে:

select pg_cancel_backend(1234);

1234-ক্যোয়ারী বাতিল করার জন্য এটি একটি "বন্ধুত্বপূর্ণ" অনুরোধ, এবং কিছু ভাগ্যের সাথে এটি কিছুক্ষণ পরে অদৃশ্য হয়ে যাবে। শেষ পর্যন্ত, এটি আরও কার্যকর:

select pg_terminate_backend(1234);

আপনার শেল অ্যাক্সেস এবং রুট বা পোস্টগ্রিজ অনুমতি থাকলে আপনি শেল থেকে এটিও করতে পারেন। "বাতিল" করতে একজন এটি করতে পারেন:

kill -INT 1234

এবং "সমাপ্ত", সহজভাবে:

kill 1234

করো না:

kill -9 1234

... এর ফলে প্রায়শই পুরো পোস্টগ্র্যাস সার্ভারটি শিখায় নেমে যায়, তারপরে আপনি পোস্টগ্রিস পুনরায় চালু করতে পারেন। পোস্টগ্রিস বেশ মজবুত, সুতরাং ডেটাটি দুর্নীতিগ্রস্থ হবে না, তবে আমি "কিল -9" যে কোনও ক্ষেত্রে ব্যবহার করার বিরুদ্ধে সুপারিশ করব :-)


একটি দীর্ঘস্থায়ী "লেনদেনে নিষ্ক্রিয়" এর অর্থ প্রায়ই হয় যে লেনদেনটি "কমিট" বা "রোলব্যাক" দিয়ে শেষ করা হয়নি, যার অর্থ অ্যাপ্লিকেশনটি বগিযুক্ত বা লেনদেনের ডাটাবেসের সাথে কাজ করার জন্য সঠিকভাবে ডিজাইন করা হয়নি। দীর্ঘস্থায়ী "লেনদেনের মধ্যে নিষ্ক্রিয়" এড়ানো উচিত, কারণ এটি বড় পারফরম্যান্সের সমস্যাও তৈরি করতে পারে।


আমি চেষ্টা করেছি pg_cancel_ ব্যাকএন্ডে কোনও লাভ হয়নি। আমার শেল অ্যাক্সেস নেই এবং আমি কোনও সুপারইউজার নই তাই আমি পিজি_রমিটার_ব্যাকএন্ড ব্যবহার করে একটি সিক্কিল পাঠাতে পারি না
অ্যালান

পোস্টগ্রিজের কোন সংস্করণ আপনি ব্যবহার করছেন? (ইঙ্গিত select version():)। আপনি ব্যবহার করার সময় কোনও ত্রুটি বার্তা পান pg_cancel_backend?
tobixen

পিজি-ক্যান্সেল_ব্যাকেন্ড নিজেই ব্যবহার করার চেষ্টা করেছি, সুতরাং ত্রুটি বার্তাটি "অন্যান্য সার্ভারের প্রক্রিয়াগুলিকে সংকেতিত করার জন্য সুপারইউসার হতে হবে" ... এর অর্থ সম্ভবত আপনাকে সার্ভারে মূল রুট অ্যাক্সেসের প্রয়োজন হবে অথবা কিছু পোস্টগ্রিজ সুপার ব্যবহারকারীর মাধ্যমে ডিবি অ্যাক্সেসের প্রয়োজন হবে (যেমন পোস্টগ্রিজ ব্যবহারকারী) ) আপনার নিজের জিজ্ঞাসা হত্যা করতে। এটি কিছুটা স্তন্যপান বলে মনে হচ্ছে :-(
টোবিক্সেন

4
এটি প্রমাণিত হয়েছে যে প্রক্রিয়াগুলি পিজি_স্যানেল_ব্যাকএন্ডের দ্বারা বাতিল করা হয়েছিল তবে প্রশ্নগুলি এখনও কিছুক্ষণের জন্য পিজি_স্ট্যাট_অ্যাক্টিভিটিতে দেখায়
অ্যালান

সম্ভবত এটি হেরোকুর কাছে নির্দিষ্ট। আমি যতদূর দেখতে পাচ্ছি, সাধারণ পোস্টগ্রিজের অধীনে আটকে থাকা প্রক্রিয়াটি হত্যার জন্য সত্যই সুপারিশার হওয়া দরকার (আমি পৃষ্ঠায় 8.4 এর উপর "সিলেক্ট পিজি_স্লিপ (3600);" পরীক্ষা করছি এবং আমি পেয়েছি "ERROR: অবশ্যই সংকেত দেওয়ার জন্য সুপারিউজার হতে হবে অন্যান্য সার্ভার প্রক্রিয়াগুলি ")। যদিও, তারপর আবার "লেনদেনের মধ্যে নিষ্ক্রিয়" একেবারে এক নয়।
tobixen

36

এটা চেষ্টা কর:

select pg_terminate_backend(pid int)

এই সম্পর্কে আরও আপনি এখানে পেতে পারেন । এটি সিস্টেম দ্বারা হত্যা প্রক্রিয়া চেয়ে এই সমস্যার 'ক্লিনার' সমাধান হওয়া উচিত।


আপনার উত্তরে আপনার পিড কীভাবে পাবেন দয়া করে যুক্ত করুন
মাউন্টেন

20

আপনি heroku-pg-extrasঅ্যাড-অন ইনস্টল করতে পারেন এবং পিআইডি পেতে নিম্নলিখিত কমান্ডটি চালাতে পারেন:

heroku pg:locks --app <your-app>

তারপরে কেবল করুন:

heroku pg:kill <pid> --app <your-app> 

দ্রষ্টব্য : --forceবিকল্পটি pg_terminate_backend ইস্যু করতে ব্যবহার করা যেতে পারে যা সেই প্রশ্নের জন্য পুরো সংযোগটি ফেলে দেয়।

যদি heroku pg:locksকিছু তালিকাভুক্ত না হয়, চেষ্টা করুন heroku pg:ps

আরও তথ্যের জন্য দেখুন:
https://devcenter.heroku.com/articles/heroku-postgresql#pg-ps-pg-kill-pg-killall


ধন্যবাদ. আমি এখনও লেনদেন / পিআইডি বন্ধ করতে পারি না যদিও ... আমার কম্পিউটার একটি আমদানির সময় একটি হার্ডওয়্যার হিমশীতল করেছে এবং আমি পিআইডি বন্ধ করতে পারছি না। :(
dimitarvp

-3

আমরা একটি একক ক্যোয়ারিতে এটি অর্জনের জন্য নিম্নলিখিতগুলি ব্যবহার করতে পারি:

SELECT pg_cancel_backend(pid), pg_terminate_backend(pid) FROM pg_stat_activity WHERE state != 'idle';

এটি সমস্ত চলমান অনুসন্ধানগুলিকে মেরে ফেলবে, তারপরে কেউ পোস্টগ্রিস পুনরায় চালু করতে পারে। xact_start দিয়ে অর্ডার করুন এবং 1 টি সীমাবদ্ধ করুন, এবং আমি একমত হতে পারি ... তবে আবার, আমি অন্ধভাবে হত্যা করার আগে তালিকার দিকে নজর দিতে পছন্দ করব।
টোবিক্সেন

এই সম্পর্কে কি? SELECT pid, pg_cancel_backend(pid) FROM pg_stat_activity WHERE state != 'idle' AND (now() - query_start) > interval '5 minutes';
এএফএন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.