voretaq7 'ın cevabı da dahil kilit noktaları kapsar arka uçları sonlandırmak için doğru yöntem ama biraz daha açıklama eklemek istiyorum.
kill -9
(yani SIGKILL
) asla, asla, asla ilk tercihiniz olan varsayılan olmamalı . İşlem normal kapatma isteklerine cevap vermediğinde ve SIGTERM
( kill -15
) etkisiz kaldığında son başvurunuz olmalıdır . Bu Pg için geçerlidir ve hemen hemen her şey.
kill -9
Öldürülen sürece hiç temizlik yapma şansı vermez.
PostgreSQL'e gelince, Pg, kill -9
yedeklenmiş bir çökme olarak sonlandırılan bir destek görür . Arka uç paylaşılan hafızayı bozmuş olabileceğini biliyor - örneğin bir sayfayı shm içine yazarak ya da değiştirerek yarı yarıya kesmiş olabilirsiniz - örneğin - bir arka uçta aniden ortadan kalktığını fark ettiğinde diğer tüm arka uçları sonlandırır ve yeniden başlatır. ve sıfır olmayan bir hata kodu ile çıkıldı.
Bunu günlüklerde rapor edilmiş olarak göreceksiniz.
Zarar vermeyecek gibi görünüyorsa, Pg, kazadan sonra her şeyi yeniden başlatıyor ve uygulamanız kayıp bağlantılardan temiz bir şekilde çıkıyor. Bu iyi bir fikir yapmaz. Başka hiçbir arka uç çarpışması Pg'nin normal işleyen parçalarından daha az iyi test edilmemişse ve çok daha karmaşık / çeşitli ise, arka uç çarpışma ele alma ve kurtarmada gizlenen bir böcek şansı daha yüksektir.
Btw, eğer kill -9
postacı sonra kaldırmak postmaster.pid
ve her postgres
arka uç gitti olduğundan emin olmadan tekrar başlatın , çok kötü şeyler olabilir . Yanlışlıkla arka uç yerine postacıyı öldürdüyseniz, veritabanının düştüğünü gördüyseniz, yeniden başlatmaya çalıştıysanız, yeniden başlatma başarısız olduğunda "eski" .pid dosyasını kaldırdıysanız ve yeniden başlatmayı denediyseniz, bu kolayca olabilirdi. Bu kill -9
, Pg etrafında dalgalanmaktan kaçınmanız ve silmemelisiniz postmaster.pid
.
Bir gösteri:
kill -9
Bir arka uç yaparken tam olarak ne olduğunu görmek için , bu basit adımları deneyin. İki terminal açın, her birinde psql ve her seferinde açın SELECT pg_backend_pid();
. Başka bir terminalde kill -9
PID'lerden biri. Şimdi SELECT pg_backend_pid();
her iki psql oturumunda tekrar çalıştırın . İkisinin de bağlantılarını nasıl kaybettiğine dikkat et.
Öldürdüğümüz 1. Oturum:
$ 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)
Teminat hasarı olan 2. Seans:
$ 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)
Her iki seansın nasıl kırıldığını gördün mü? Bu yüzden kill -9
arka uç yapmıyorsun .