voretaq7 의 답변 은 백엔드를 종료 하는 올바른 방법을 포함하여 핵심 요점을 다루지 만 조금 더 설명하고 싶습니다.
kill -9
(즉, SIGKILL
) 절대로 당신의 첫 번째 선택이되어서는 안됩니다 . 프로세스가 정상적인 종료 요청에 응답하지 않고 SIGTERM
( kill -15
)가 효과가없는 경우 최후의 수단이어야합니다 . 그것은 Pg와 다른 모든 것의 사실입니다.
kill -9
종료 된 프로세스가 전혀 정리할 기회를 제공하지 않습니다.
PostgreSQL과 관련하여 Pg는 kill -9
백업 된 충돌로 종료 된 백업을 확인합니다 . 백엔드가 공유 메모리를 손상 시켰을 수도 있습니다. 예를 들어 페이지를 shm에 쓰거나 수정하는 등의 과정을 절반으로 중단했을 수 있기 때문에 백엔드가 갑자기 사라 졌다는 것을 알게되면 다른 모든 백엔드를 종료하고 다시 시작합니다. 0이 아닌 오류 코드로 종료되었습니다.
로그에이 내용이보고됩니다.
손상되지 않은 것으로 보이면 충돌 후 Pg가 모든 것을 다시 시작하고 응용 프로그램이 손실 된 연결을 깨끗하게 복구하기 때문입니다. 그것은 좋은 생각이 아닙니다. 백엔드 충돌이 Pg의 정상 작동 부분보다 잘 테스트되지 않고 훨씬 더 복잡하고 다양하면 백엔드 충돌 처리 및 복구에 버그가 발생할 가능성이 더 높습니다.
BTW, kill -9
포스트 마스터 가 postmaster.pid
모든 postgres
백엔드가 사라지지 않도록 제거 하고 다시 시작하면 매우 나쁜 일이 발생할 수 있습니다 . 백엔드 대신 우발적으로 포스트 마스터를 종료하고 데이터베이스가 다운 된 것을보고 재시작을 시도한 후 재시작에 실패했을 때 "stale".pid 파일을 제거한 후 다시 시작하려고하면이 문제가 쉽게 발생할 수 있습니다. 이것이 kill -9
Pg를 흔들지 말아야하는 이유 중 하나이며 삭제해서는 안됩니다 postmaster.pid
.
데모 :
kill -9
백엔드에서 어떤 일이 발생하는지 정확히 보려면 다음 단계를 수행하십시오. 두 개의 터미널을 열고 각각 psql을 실행 SELECT pg_backend_pid();
합니다. 다른 터미널 kill -9
에서 PID 중 하나. 이제 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
백엔드 가 아닌 이유 입니다.