คำตอบของvoretaq7ครอบคลุมประเด็นสำคัญรวมถึงวิธีที่ถูกต้องในการยุติแบ็กเอนด์แต่ฉันต้องการเพิ่มคำอธิบายเพิ่มเติมอีกเล็กน้อย
kill -9
(คือSIGKILL
) ไม่ควรเคยเคยเป็นค่าเริ่มต้นตัวเลือกแรกของคุณ ควรเป็นทางเลือกสุดท้ายของคุณเมื่อกระบวนการไม่ตอบสนองต่อคำขอปิดระบบปกติและ a SIGTERM
( kill -15
) ไม่มีผลใด ๆ นั่นเป็นความจริงของ Pg และทุกอย่างก็สวยมาก
kill -9
ทำให้กระบวนการที่ถูกฆ่าไม่มีโอกาสที่จะทำการล้างข้อมูลใด ๆ เลย
เมื่อมันมากับ PostgreSQL, Pg เห็นได้รับการสนับสนุนว่ายกเลิกโดยkill -9
เป็นความผิดพลาดที่ได้รับการสนับสนุน มันรู้ว่าแบ็คเอนด์อาจมีหน่วยความจำที่ใช้ร่วมกันที่เสียหาย - เพราะคุณสามารถขัดจังหวะมันได้ครึ่งทางโดยการเขียนหน้าเป็น shm หรือแก้ไขอย่างใดอย่างหนึ่ง - ดังนั้นมันจะยุติและรีสตาร์ทแบ็กเอนด์อื่น ๆ ทั้งหมดเมื่อสังเกตว่าแบ็กเอนด์ และออกด้วยรหัสข้อผิดพลาดที่ไม่ใช่ศูนย์
คุณจะเห็นรายงานนี้ในบันทึก
หากดูเหมือนว่าไม่มีอันตรายใด ๆ นั่นเป็นเพราะ Pg รีสตาร์ททุกอย่างหลังจากความผิดพลาดและแอปพลิเคชันของคุณกำลังกู้คืนจากการเชื่อมต่อที่หายไปอย่างหมดจด นั่นไม่ได้ทำให้มันเป็นความคิดที่ดี หากไม่มีสิ่งใดที่แบ็คเอนด์ล่มเกิดการทดสอบน้อยกว่าชิ้นส่วนที่ใช้งานได้ปกติของ Pg และมีความซับซ้อน / หลากหลายมากขึ้นดังนั้นโอกาสของข้อผิดพลาดที่ซุ่มซ่อนในการจัดการกับแบ็กเอนด์และการกู้คืนจะสูงกว่า
BTW ถ้าคุณkill -9
ไปรษณีย์แล้วลบpostmaster.pid
และเริ่มต้นอีกครั้งโดยไม่ต้องทำให้แน่ใจว่าทุกpostgres
แบ็กเอนด์จะหายไปสิ่งที่ไม่ดีมากสามารถเกิดขึ้นได้ สิ่งนี้อาจเกิดขึ้นได้อย่างง่ายดายหากคุณเผลอฆ่า postmaster แทนแบ็กเอนด์โดยไม่ได้ตั้งใจเห็นฐานข้อมูลล้มเหลวพยายามรีสตาร์ทลบไฟล์. pid "stale" เมื่อรีสตาร์ทล้มเหลวและพยายามรีสตาร์ทอีกครั้ง นั่นเป็นหนึ่งในเหตุผลที่คุณควรหลีกเลี่ยงโบกทั่วหน้าและไม่ควรลบkill -9
postmaster.pid
การสาธิต:
หากต้องการดูสิ่งที่เกิดขึ้นเมื่อคุณkill -9
แบ็กเอนด์ลองขั้นตอนง่าย ๆ เหล่านี้ เปิดเทอร์มินัลสองเครื่องเปิด psql ในแต่ละรายการและในการรันแต่ละSELECT pg_backend_pid();
ครั้ง ในเทอร์มินัลอื่นkill -9
หนึ่งใน PIDs ตอนนี้ทำงาน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
ต้องแบ็กเอนด์