Назад | Перейти на главную страницу

Могу ли я потерять данные, если я `sudo reboot` свой сервер Ubuntu 12.04.2 с запущенным Postgres?

Я давно задавался вопросом, не sudo reboot с работающим сервером Postgres (а именно, 9.2.4) может (или определенно приведет) к потере данных или другим проблемам (например, невозможности снова запустить сервер при загрузке системы). Или делает reboot отправлять надлежащие сигналы процессам, которые позволяют им завершить работу (включая, например, разрешение транзакций на завершение и т. д.).

Если ваш сервер и оборудование правильно настроены, вы не потеряете данные, даже если нажмете кнопку сброса, выдернете шнур питания или вызовете панику ядра. PostgreSQL - это безопасный при столкновении из-за ведения журнала упреждающей записи.

Единственный, кто в этом смутно правильно понял, - это Zoredache в комментариях.

Вы потеряете данные только в том случае, если:

  • Вы настроили PostgreSQL на защиту от сбоев, установив fsync=off;
  • Вы используете UNLOGGED таблицы, которые не защищены от сбоев (и в этом случае вы потеряете данные только в незарегистрированных таблицах);
  • Базовая система хранения небезопасна при сбоях или игнорирует fsync, как и многие дешевые потребительские SSD, которые выполняют кэширование с обратной записью в энергозависимый кеш без надлежащего резервного питания;

Я много больше писал об этом в сообщении в блоге несколько месяцев назад.

Даже если вы используете дешевый SSD, вы, как правило, не потеряете данные при внезапной перезагрузке, только когда ваша система фактически потеряет питание. Я видел несколько систем, которые выключают и выключают диски при сбросе, и эти системы будут терять данные при использовании дешевых SSD.

«Чистое» завершение работы для PostgreSQL практически необязательно; единственными недостатками внезапной перезагрузки является то, что запуск базы данных может занять немного больше времени из-за времени, необходимого для применения журналов упреждающей записи во время восстановления, и это (согласно документации) UNLOGGED таблицы будут усечены.

Даже при так называемом «чистом» завершении работы большинство сценариев инициализации ожидают завершения работы сервера только ограниченное время. Большинство сценариев инициализации используют режим «быстрого» выключения, который прерывает текущие транзакции, отклоняет новые сеансы и быстро, но аккуратно завершает работу сервера. Обычно они выходят из строя, если это занимает слишком много времени, и все равно просто закрываются, эффективно полагаясь на защиту от сбоев PostgreSQL.

Если вы хотите, чтобы текущие транзакции завершились, вам необходимо вручную выполнить «умное» выключение перед выключением системы или изменить сценарии инициализации, чтобы использовать его. Интеллектуальное завершение работы не всегда очень полезно, потому что одно продолжительное или прерванное соединение может остановить весь сервер на неопределенное время, оставив его сидеть там, отказывая всем соединениям. В качестве первой попытки полезно дать поработать в течение минуты или перед быстрым завершением работы.

Безопасность при сбоях не может служить оправданием отказа в создании резервных копий и их тестировании.

Он должен корректно закрыть его и все запущенные службы. Сделайте резервную копию и протестируйте!

reboot это изящное завершение работы. reboot -f / reboot --force убийца данных.