voretaq7 का उत्तर मुख्य बिंदुओं को शामिल करता है, जिसमें बैकएंड को समाप्त करने का सही तरीका शामिल है, लेकिन मैं थोड़ा और स्पष्टीकरण जोड़ना चाहूंगा।
kill -9
(यानी SIGKILL
) कभी भी, कभी भी, कभी भी आपकी पहली पसंद डिफ़ॉल्ट होना चाहिए । जब प्रक्रिया अपने सामान्य शटडाउन अनुरोधों का जवाब नहीं देती है, तो आपका अंतिम उपाय होना चाहिए और SIGTERM
( kill -15
) का कोई प्रभाव नहीं पड़ा है। यह Pg का सच है और बहुत अधिक सब कुछ।
kill -9
मारे गए प्रक्रिया को कोई भी सफाई करने का कोई मौका नहीं देता है।
जब यह PostgreSQL की बात आती है, तो Pg एक ऐसे बैकअप को देखता है kill -9
जिसे एक समर्थित क्रैश के रूप में समाप्त किया जाता है । यह जानता है कि बैकएंड ने साझा की गई मेमोरी को दूषित कर दिया है - क्योंकि आपने शम में पेज लिखने या किसी एक को संशोधित करने के माध्यम से इसे आधे रास्ते से बाधित किया हो सकता है, उदाहरण के लिए - तो यह समाप्त हो जाता है और अन्य सभी बैकेंड को पुनरारंभ करता है जब यह नोटिस होता है कि बैकएंड अचानक गायब हो गया है और एक गैर-शून्य त्रुटि कोड के साथ बाहर निकल गया।
आप इस रिपोर्ट को लॉग में देखेंगे।
यदि यह कोई नुकसान नहीं करता है, तो ऐसा इसलिए है क्योंकि Pg दुर्घटना के बाद सब कुछ फिर से शुरू कर रहा है और आपका एप्लिकेशन खोए हुए कनेक्शनों से सफाई से ठीक हो रहा है। यह एक अच्छा विचार नहीं है। अगर कुछ और बैकएंड क्रैश Pg के सामान्य-कामकाजी भागों की तुलना में कम अच्छी तरह से जांचे जाते हैं और बहुत अधिक जटिल / विविध होते हैं, तो बैकएंड क्रैश हैंडलिंग और रिकवरी में बग की संभावना अधिक होती है।
BTW, यदि आप kill -9
पोस्टमास्टर को हटाते हैं postmaster.pid
और इसे फिर से शुरू करते हैं , तो सुनिश्चित करें कि हर postgres
बैकेंड चला गया है, बहुत खराब चीजें हो सकती हैं । यह आसानी से हो सकता है यदि आपने गलती से एक बैकेंड के बजाय पोस्टमास्टर को मार दिया, तो देखा कि डेटाबेस नीचे चला गया था, इसे फिर से शुरू करने की कोशिश की, पुनरारंभ होने पर "बासी" .पीआईडी फ़ाइल को हटा दिया, और फिर से पुनरारंभ करने का प्रयास किया। यही एक कारण है कि आपको kill -9
Pg के चारों ओर घूमने से बचना चाहिए , और नहीं हटना चाहिए postmaster.pid
।
प्रदर्शन:
यह देखने के लिए कि kill -9
बैकएंड होने पर क्या होता है , इन सरल चरणों को आज़माएं। ओपन दो टर्मिनलों, प्रत्येक में खुला psql, और प्रत्येक समय में SELECT pg_backend_pid();
। एक और टर्मिनल kill -9
में पीआईडी में से एक। अब SELECT pg_backend_pid();
दोनों psql सत्र में फिर से चलाएँ । ध्यान दें कि उन दोनों ने अपने कनेक्शन कैसे खो दिए?
सत्र 1, जिसे हमने मार दिया:
$ psql regress
psql (9.1.4)
Type "help" for help.
regress=# select pg_backend_pid();
pg_backend_pid
----------------
6357
(1 row)
[kill -9 of session one happens at this point]
regress=# select pg_backend_pid();
server closed the connection unexpectedly
This probably means the server terminated abnormally
before or while processing the request.
The connection to the server was lost. Attempting reset: Succeeded.
regress=# select pg_backend_pid();
pg_backend_pid
----------------
6463
(1 row)
सत्र 2, जो संपार्श्विक क्षति थी:
$ psql regress
psql (9.1.4)
Type "help" for help.
regress=# select pg_backend_pid();
pg_backend_pid
----------------
6283
(1 row)
[kill -9 of session one happens at this point]
regress=# select pg_backend_pid();
WARNING: terminating connection because of crash of another server process
DETAIL: The postmaster has commanded this server process to roll back the current transaction and exit, because another server process exited abnormally and possibly corrupted shared memory.
HINT: In a moment you should be able to reconnect to the database and repeat your command.
server closed the connection unexpectedly
This probably means the server terminated abnormally
before or while processing the request.
The connection to the server was lost. Attempting reset: Succeeded.
regress=# select pg_backend_pid();
pg_backend_pid
----------------
6464
(1 row)
देखें कि कैसे दोनों सत्र टूट गए थे? यही कारण है कि आप kill -9
एक बैकेंड नहीं है।