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

PostgreSQL зависает при завершении работы в Linux?

Я использую PostgreSQL 9.0. Зависает при выключении. когда я использовал pg_ctl stop он зависает, и через некоторое время отображается сообщение:

pg_ctl: server does not shut down

и когда я использовал psql, он показывал:

psql: FATAL:  the database system is shutting down

и в журналах он пишет эти сообщения

 DEBUG:  postmaster received signal 15
2011-07-14 09:36:00 ETC/GMT LOG:  received smart shutdown request

Подскажите пожалуйста, как решить?

По умолчанию, pg_ctl попытается «умное выключение». Это выключение сообщит системе, что она не принимает никаких новых подключений, но не отключится до тех пор, пока существующие не отключатся.

Вероятно, вы захотите использовать «быстрое» выключение (выполнив pg_ctl -m fast), что также отключит существующих пользователей.

Для Debian (pg_ctl не по умолчанию включен $PATH):

pg_ctlcluster 9.4 main restart -m fast

Обычный запрос на отключение будет ждать, пока все соединения не будут разорваны.

когда pg_ctl stop "зависает", это означает, что у вас все еще есть открытые подключения к базе данных. Закройте все приложения, которые подключаются к этому серверу, после чего Postgres должен нормально завершиться.

Ошибка «система базы данных выключается» возникает из-за того, что Postgres пытается завершить работу и в результате не разрешает новые соединения.

При попытке определить, что происходит, вы можете войти в систему через psql и введите:

test=> SELECT * FROM pg_stat_activity;
 datid | datname | procpid | usesysid |   usename    | application_name | client_addr | client_hostname | client_port |         backend_start         |          xact_start           |          query_start          | waiting |          current_query          
-------+---------+---------+----------+--------------+------------------+-------------+-----------------+-------------+-------------------------------+-------------------------------+-------------------------------+---------+---------------------------------
 18703 | test |    7604 |    18702 | test_sean | psql             |             |                 |          -1 | 2011-07-14 07:23:40.021921+00 |                               | 2011-07-14 07:23:46.398894+00 | f       | <IDLE>
 18703 | test |    7673 |    18702 | test_sean | psql             |             |                 |          -1 | 2011-07-14 07:24:54.507982+00 | 2011-07-14 07:25:00.102369+00 | 2011-07-14 07:25:00.102369+00 | f       | SELECT * FROM pg_stat_activity;
(2 rows)

Если вы абсолютно не хотите использовать pg_ctl, почему бы вместо этого не использовать следующее:

sudo /etc/init.d/postgresql-9.1 stop

Проблемы со скриптами init.d:

$SU -l postgres -c "$PGENGINE/pg_ctl stop -D '$PGDATA' -s -m fast" > /dev/null 2>&1 < /dev/null

Это быстрое завершение работы и выполнение того, что вам нужно.