2015-04-02 3 views
0

Я недавно отлаживал проблему с повреждением базы данных PostgreSQL 9.2 (в Solaris, но я сомневаюсь, что это важно), и я обнаружил, что мы можем надежно воспроизвести ее, если клиент умер в середине транзакции, а затем я закрыл PostgreSQL, выполнив pkill postgres (который в основном отправляет SIGTERM каждому запуску postgres процесс). Если бы вместо этого мы сделали pkill -QUIT postgres, чтобы отправить SIGQUIT, база данных будет закрыта чистой и никакой коррупции не произойдет.безопасно убивать процессы postgres с помощью SIGTERM?

Основываясь на PostgreSQL 9.2 docs, я думаю, что SIGTERM должен быть на 100% ожидаемым сервером базы данных, так почему это не безопасно закрывать, как это? Это ошибка в PostgreSQL, или я могу что-то делать (конфигурация и т. Д.), Чтобы разрешить возникновение коррупции?

+1

(1) это вопрос, более подходящий для dba.stackexchange.com; (2) какая именно версия, 9.2.что? (3) что такое «коррупция», о которой вы говорите? Какая ошибка, журналы, симптомы и т. Д.? (4) Любая безопасная опция, например, отключенный fync или full_page_writes? – MatheusOl

ответ

0

Не думаю, что сигммер является причиной вашей проблемы. Опять же, порекомендуйте, чтобы вы спросили на dba.stackexchange вместо этого.

Если клиент умирает посреди трансакции, проблема в том, что сетевое соединение висит? И тогда, когда вы его убиваете, вы получаете коррупцию во время повтора WAL?

Это сложная область для устранения, но здесь некоторые места, чтобы начать:

  1. Что происходит conncurrently, когда это произойдет? Какая транзакция фиксирует нагрузку?
  2. Как часто журналы WAL обычно вращаются?

Возможно, вы могли бы работать в редкую, непонятную ошибку с PostgreSQL (возможно, где-то между БД, ядром и файловой системой), но если это так, пожалуйста, начните с обновлением до последней 9.2 и попытаться снова воспроизвести. Предполагается, что сигналы Term и even kill на 100% безопасны для PostgreSQL, поэтому, если вы видите повреждение базы данных, этого не ожидается.