У меня вопрос об остановке контейнера базы данных.
sudo docker run --name db -d asg1612 / postgresql
/usr/lib/postgresql/9.3/bin/postgres -D /var/lib/postgresql/9.3/main -c config_file = / etc / postgresql / 9.3 / main / postgresql.conf
и каталог / var / lib / pgdata создается как объем контейнера
Я останавливаю контейнер с помощью:
sudo docker stop db
Будет ли база данных остановлена корректно?
Будут ли у меня повреждены данные?
Независимо от того, останавливается ли база данных «изящно» или нет, вы не получите поврежденных данных. PostgreSQL безопасен от сбоев, если вы не сконфигурируете его иначе, пока базовая файловая система и дисковое хранилище соблюдают запросы на очистку диска (fsync). Вы теряете незавершенные транзакции, но ничего не повреждено и не осталось незавершенным. Это правда, даже если вы SIGKILL
(kill -9
) сервер, хотя это не значит, что делать это регулярно.
Основная проблема, с которой вы столкнетесь, заключается в том, что если сервер PostgreSQL внезапно выключается, в следующий раз может потребоваться больше времени для запуска, потому что ему нужно проделать больше работы для восстановления работы, которая зафиксирована, но еще не полностью выполнена. (чрезмерное упрощение).
Если нет init
запускается в контейнере (sysvinit / systemd / upstart), то, скорее всего, корректное завершение работы не выполняется, если вы явно не указали докеру какой-либо сценарий отключения. (С докером еще не работал). Некоторые быстрые поиски предполагают, что он просто отправляет SIGTERM
к процессу (ам) в контейнере. Это нормально для PostgreSQL и на самом деле то, что pg_ctl -m smart
делает. Остановка может занять некоторое время, поэтому вы можете использовать SIGINT
для принудительного прерывания транзакции и более быстрого завершения работы.