Программы. Советы. Безопасность. Интересное. Накопитель

После изменения настроек postgresql не запускается служба. PostgreSQL Запуск и завершение PostgreSQL

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

Итак, история начинается с того, что мне 30 декабря в 11-30 звонят с сообщением о том, что у одного из наших клиентов не запускается наша система, поскольку не может подключиться к базе данных (в качестве СУБД у нас используется PostgreSql версии 8.1). Люди объясняют это тем, что час назад вырубило свет и компьютер вырубился некорректно, а после включения – все перестало работать:)

Хорошие пользователи нашей системы знают, где находится кнопка пуск и знают, что в системе не двое часиков “одни с цифрами, а другие песочные”. Поэтому единственное, что удалось сделать по телефону, так это попытаться руками запустить службу СУБД, результат – служба таки не запускается. Пришлось пробрасывать на тот компьютер интернет (на компьютерах, где установлена наша система интернета быть не должно) для возможности удаленного подключения.

После подключения к удаленному компьютеру я попытался запустить службу и получил следующее сообщение: “Служба PostgreSql Database Server 8.1” на “Локальный компьютер” была запущена и затем остановлена. Некоторые службы автоматически останавливаются, если им нечего делать, например, служба журналов и оповещений производительности”. Мда…

Проблема в том, что на тот момент это была единственная доступная информация… Логи PostgreSql пусты, записей в них никаких, в системных логах – тоже пустота.

Отладка служб – процесс не простой, поэтому многие разработчики предусматривают механизмы запуска приложения-службы, как обыкновенного консольного приложения с помощью ключей командной строки. И PostgreSql в этом плане – не исключение; для запуска нужно использовать следующую команду (Hint: эту команду можно запустить только из под неадминистративного пользователя системы, правда, если вы об этом забудете, то PostgreSql очень быстро вам об этом напомнит):

postgres -D ""

Запускаем, и смотрим на сообщение об ошибке. В моем случае это сообщение звучало примерно так:

FATAL - bogus data in lock file "postmaster.pid"

Безусловно, мне повезло, проблема оказалась поправимой. Почему-то указанный файл оказался пустым, и мне понадобилось скопировать его содержимое из рабочего экземпляра СУБД, что не составило особого труда.

Мораль этого сообщения в том, что если база легла, или произошли какие-то другие проблемы с системой, то прежде чем переустанавливать СУБД (или систему целиком) и терять при этом все данные, нужно хотя бы попытаться выяснить в чем проблема, возможно, есть все шансы, что вам удастся восстановить работоспособность не такими радикальными способами.

З.Ы. Всех с наступающим Новым Годом и пожелания того, чтобы ваши системы были стабильными и надежными и не портили ваш сон, но даже если какие-то проблемы и возникали, то у вас всегда были наготове варианты, как с этой ситуацией справиться.

Вопрос: Не стартует служба PostgreSQL


Windows Server 2012
PostgreSQL Database Server 9.4.2-1.1C(x64)
На сервере с середины апреля крутились 2 базы 1С
Файл postgresql.conf был отредактирован по рекомендациям с сайта 1с сообразно характеристикам сервера.

Со слов админа, вчера штатно выключили, потом включили.
Служба не стартует, в логах вот что:

2016-05-06 10:05:40 GMT LOG: database system was interrupted; last known up at 2016-05-06 09:59:33 GMT
2016-05-06 10:05:40 GMT LOG: database system was not properly shut down; automatic recovery in progress
2016-05-06 10:05:40 GMT LOG: record with zero length at 6/C7F6AAA8
2016-05-06 10:05:40 GMT LOG: redo is not required
2016-05-06 10:05:40 GMT FATAL: could not access status of transaction 1262199
2016-05-06 10:05:40 GMT DETAIL: Could not open file "pg_clog/0001": No such file or directory.
2016-05-06 10:05:40 GMT LOG: startup process (PID 24696) exited with exit code 1
2016-05-06 10:05:40 GMT

Служба работает под пользователем USR1CV8, права у него на папку Data полные
Архивы есть недельной давности.

Ответ:

тогда базы у вас нет.

--
Maxim Boguk

Вопрос: postgresql - после переноса каталога data служба не запускается


Доброе время суток. Имеется вышеуказанная СУБД, каталог данных установлен по пути: /var/lib/pgsql/9.3/data
Нужно перенести каталог данных в расположение /postgre_dbs/data . Мои действия:
1. Останавливаю PostGreSQL
2. Копирую папку data со всеми подпапками, и записями прав на папки и файлы (cp -p -R) в /postgre_dbs
3. В файле /var/lib/pgsql/9.3/data пишу строку:
data_directory = "/postgre_dbs/data/"
4. Пробую запустить службу postgresql - получаю FAILED
5. смотрю pgstartup.log - там строки:
< 2015-10-20 21:14:17.361 ALMT >ВАЖНО: файл блокировки "postmaster.pid" уже существует
< 2015-10-20 21:14:17.361 ALMT >ПОДСКАЗКА: Другой экземпляр postmaster (PID 1633) работает с каталогом данных "/postgre_dbs/data"?

В чем причина проблемы, как ее решить?

Ответ: guestfreeman,

Вы идете четко по плану опытных товарищей:

Как запускается служба PostgreSQL?
Знает ли она, что БД находится в другом каталоге?

Вопрос: Не стартует служба postgree


2016-04-27 13:28:46 IRKT LOG: database system was interrupted; last known up at 2016-04-27 13:16:51 IRKT
2016-04-27 13:28:46 IRKT LOG: invalid primary checkpoint record
2016-04-27 13:28:46 IRKT LOG: invalid secondary checkpoint link in control file
2016-04-27 13:28:46 IRKT PANIC: could not locate a valid checkpoint record
2016-04-27 13:28:46 IRKT LOG: startup process (PID 8912) exited with exit code 3
2016-04-27 13:28:46 IRKT LOG: aborting startup due to startup process failure

Из поисков в интернете попробовал выполнить pg_controldata

PostgreSQL\9.4.2-1.1C\bin>pg_controldata e:\pql

pg_control version number: 942
Catalog version number: 201409291
Database system identifier: 6254454928233336196
Database cluster state: in production
pg_control last modified: 27.04.2016 9:04:41
Latest checkpoint location: DC/223641B8
Prior checkpoint location: DC/1F301DA8
Latest checkpoint"s REDO location: DC/213D1950
Latest checkpoint"s REDO WAL file: 00000001000000DC00000021
Latest checkpoint"s TimeLineID: 1
Latest checkpoint"s PrevTimeLineID: 1
Latest checkpoint"s full_page_writes: on
Latest checkpoint"s NextXID: 0/2148384
Latest checkpoint"s NextOID: 4123902
Latest checkpoint"s NextMultiXactId: 1
Latest checkpoint"s NextMultiOffset: 0
Latest checkpoint"s oldestXID: 668
Latest checkpoint"s oldestXID"s DB: 1
Latest checkpoint"s oldestActiveXID: 0
Latest checkpoint"s oldestMultiXid: 1
Latest checkpoint"s oldestMulti"s DB: 16402
Time of latest checkpoint: 27.04.2016 9:04:31
Fake LSN counter for unlogged rels: 0/1
Minimum recovery ending location: 0/0
Min recovery ending loc"s timeline: 0
Backup start location: 0/0
Backup end location: 0/0
End-of-backup record required: no
Current wal_level setting: minimal
Current wal_log_hints setting: off
Current max_connections setting: 200
Current max_worker_processes setting: 8
Current max_prepared_xacts setting: 0
Current max_locks_per_xact setting: 64
Maximum data alignment: 8
Database block size: 8192
Blocks per segment of large relation: 131072
WAL block size: 8192
Bytes per WAL segment: 16777216
Maximum length of identifiers: 64
Maximum columns in an index: 32
Maximum size of a TOAST chunk: 1996
Size of a large-object chunk: 2048
Date/time type storage: 64-bit integers
Float4 argument passing: by value
Float8 argument passing: by reference
Data page checksum version: 0

PostgreSQL\9.4.2-1.1C\bin>pg_resetxlog -o 4123902 -x 2148384 -f e:\pql
pg_resetxlog: could not create pg_control file: File exists

Как устранить проблему с pg_resetxlog: could not create pg_control file: File exists?

Ответ:

Попробуйте добавить ключ
-P disable system indexes
(но скорее всего у вас не только этот индекс слетел).

Если у вас нет ни реплики ни backup - я бы сказал что шансов восстановить базу у вас около 0.
Восстановить так чтобы 1C заработал - еще меньше.

PS: а как вы такого добились и какое значение fsync было в конфиге?

--
Maxim Boguk

Вопрос: portable postgresql doesn"t listen


Выполняю запуск портативного postgre.
Каталог - копия работающего postgresql 9.3
ОС - Windows 7
На компьютере был установлен сервер postgresql 9.3, но в момент запуска poratble postgresql процесс был остановлен, процессы postgress в диспетчере задач windows завершены

Для запуска в каталог postgresql добавлен командный файл:
ECHO ON for %%i in (*.bat) do SET CD=%%~dpi REM Устанавливаем переменные окружения для запуска PostgreSQL SET PATH="%CD%bin" ;%PATH% SET PGDATA=%CD%data SET PGDATABASE=postgres SET PGUSER=postgres SET PGPORT=5439 SET PGLOCALEDIR=%CD%share \locale REM %CD%bin\initdb -U postgres -A trust %CD%bin\pg_ctl -D %CD%data -l logfile start ECHO pause %CD%\bin\pg_ctl -D %CD%data stop

Сервер стартует. Выдаются сообщения:
... F:\Temp\9.3 \bin\pg_ctl -D F:\Temp\9.3 \data -l logfile start Сервер запускается ECHO "Press Enter to Stop PostgreSQL Server" pause

Пытаюсь подключиться к серверу из pgAdmin III
Свойства подключения:
Имя: TempPostgre Хост: localhost Служба: пустая строка Обслуживание DB: postgres Имя пользователя:postgres Пароль:X (Тот, который был для базы-прототипа)

Получаю сообщение:
Server doesn"t listen
The server doesn"t accept conections: connections library reports

При подключении к серверу пробовал в адресе хоста: 10.10.10.121 (ip компьютера в локальной сети). Результат тот же.

Ответ: Проблема была в файле postgresql.conf, который находится в каталоге данных
После установки в этом файле
port = 5439 # (change requires restart)

все заработало.

Всем спасибо

Вопрос: ошибка 1053 при запуске postgresql


заранее извиняюсь, если тема создана не в том разделе.

win10 x64
postgresql 8.4

автоматически служба не запускается. если принудительно - вылазит ошибка 1053:

антивирус нод32. брандмауэр отключил (хотя служба была в исключениях):

сейчас она в исключениях брандмауэра виндовс:

postgresql использую для работы holdemmanager2. поэтому из-за не запуска postgresql не запускается и holdemmanager2.
помогите пожалуйста. перелопатил уже полсети - ничего не помогает.

Ответ:

при этом в службах постгри не в статусе "running"

Вопрос: Репликация данных PostgreSQL - Windows Server 2008


Есть сервер БД, с которым работают клиенты, и резервный сервер, на который надо настроить репликацию с основной базы данных.
В моём случае используется PostgreSQL 9.2.1, который установлен на обоих серверах

сделал по этой инструкции не работает

при настройке конфигурационных файлов (как указано в статье) и при добавлении файла recovery.conf база перестает стартовать.

Нужна ваша помощь.

Ответ: askat123,

если база не стартует - в логах обязательно будет написано почему. нужно начинать с них, прежде чем гадать.

Вопрос: Postgresql 9.5 не запускается автоматически после сбоя питания


Добрый день!
Помогите, пожалуйста, разобраться со следующей проблемой:
На десктопе под Debian 8.2 установлена тестовая БД PostgreSQL (9.5.3). Настройки БД в postgresql.conf - минимальные - listen_adress, port и т.п. Остально по умолчанию. Файл прилагаю.
Достаточно часто отключают электроэнергию, упса нет.

После появления питания СУБД сама не запускается - лог привожу ниже

автор
2016-08-04 19:13:30 MSK postgres@postgres ВАЖНО: система баз данных запускается
2016-08-04 19:13:30 MSK СООБЩЕНИЕ: работа системы БД была прервана; последний момент работы: 2016-08-04 16:15:49 MSK
2016-08-04 19:13:30 MSK [н/д]@[н/д] СООБЩЕНИЕ: неполный стартовый пакет
2016-08-04 19:13:31 MSK postgres@postgres ВАЖНО: система баз данных запускается
2016-08-04 19:13:31 MSK postgres@postgres ВАЖНО: система баз данных запускается
2016-08-04 19:13:32 MSK postgres@postgres ВАЖНО: система баз данных запускается
2016-08-04 19:13:32 MSK postgres@postgres ВАЖНО: система баз данных запускается
2016-08-04 19:13:33 MSK postgres@postgres ВАЖНО: система баз данных запускается
2016-08-04 19:13:33 MSK postgres@postgres ВАЖНО: система баз данных запускается
2016-08-04 19:13:34 MSK postgres@postgres ВАЖНО: система баз данных запускается
2016-08-04 19:13:34 MSK postgres@postgres ВАЖНО: система баз данных запускается
2016-08-04 19:13:35 MSK postgres@postgres ВАЖНО: система баз данных запускается
2016-08-04 19:13:35 MSK postgres@postgres ВАЖНО: система баз данных запускается

2016-08-04 19:13:45 MSK СООБЩЕНИЕ: система БД была остановлена нештатно; производится автоматическое восстановление
2016-08-04 19:13:45 MSK СООБЩЕНИЕ: неверная длина записи по смещению 1/9F46638
2016-08-04 19:13:45 MSK СООБЩЕНИЕ: данные REDO не требуются
2016-08-04 19:13:46 MSK СООБЩЕНИЕ: Защита от наложения мультитранзакций сейчас включена
2016-08-04 19:13:46 MSK СООБЩЕНИЕ: выключение
2016-08-04 19:13:46 MSK СООБЩЕНИЕ: система БД выключена

После этого либо запуском вручную либо после перезагрузки компа система стартует нормально.
Как можно обеспечить, чтобы после внештатного выключения в случае успешного восстановления система запускалась автоматически?

К сообщению приложен файл (postgresql.conf - 21Kb)

Ответ: asdasd1,

я подозреваю что настройки systemd виноваты. после какого-то таймаута он выключает базу штатно:

2016-08-04 19:13:35 MSK СООБЩЕНИЕ: получен запрос на "вежливое" выключение

посмотрите, какие настройки в /usr/lib/systemd/system/postgresql-9.5.service файле.

Вопрос: Не стартует PostgreSQL


Добрый день
Выпал Postgresql и больше не запускается, в логах
автор



LOG: could not link file "pg_xlog/xlogtemp.79221" to "pg_xlog/00000001000000000000004F" (initialization of log file 0, segment 79): Operation not permitted

LOG: startup process (PID 79221) exited with exit code 1
LOG: aborting startup due to startup process failure
LOG: loaded library "online_analyze"
LOG: loaded library "plantuner"
LOG: database system was shut down at 2015-04-09 09:11:44 EEST
LOG: could not link file "pg_xlog/xlogtemp.79344" to "pg_xlog/00000001000000000000004F" (initialization of log file 0, segment 79): Operation not permitted
FATAL: could not open file "pg_xlog/00000001000000000000004F" (log file 0, segment 79): No such file or directory
LOG: startup process (PID 79344) exited with exit code 1
LOG: aborting startup due to startup process failure

Зашел в эту папку и действительно нету файла 00000001000000000000004F.

Не могу понять почему так получилось. Работало, а потом хлоп и все, не работает.

Как решить эту проблему, как запустить Постгрес?

Ответ: Dark Smoke,

Наиболее подозрительно смотрится:

автор
"LOG: could not link file "pg_xlog/xlogtemp.79344" to "pg_xlog/00000001000000000000004F" (initialization of log file 0, segment 79): Operation not permitted"

Обычно это следы вмешательства дурного антивируса в работу базы (или с правами у вас что то не так стало но само посебе нетак с правами не становится).
Директория базы должна быть исключена из списка мест куда антивирус может заходить.

Вопрос: Автозапуск PostgreSQL 9.6 в Debian 8


Приветствую вас!
Столкнулся с проблемой старта PostgreSQL 9.6 при загрузке ОС Debian 8.
Автозапуск пытаюсь сделать собственным скриптом написанным в соответствии с официальной документацией по СУБД (пп. 18.3 Запуск сервера БД, стр. 565)

Содержимое файла \etc\init.d\postgresql:
#!/bin/sh -e ### BEGIN INIT INFO # Provides: postgresql # Required-Start: $local_fs $remote_fs $network $time # Required-Stop: $local_fs $remote_fs $network $time # Should-Start: $syslog # Should-Stop: $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: PostgreSQL RDBMS server ### END INIT INFO PG_PATH="/usr/lib/postgresql/9.6/bin" PGDATA= PATH=/bin:/usr/bin:/sbin:/usr/sbin DESC="postgresql daemon" NAME=postgresql DAEMON=/usr/lib/postgresql/9.6 /bin/postgresql PIDFILE="$PGDATA/postmaster.pid" SCRIPTNAME=/etc/init.d/"$NAME" case "$1" in start) su - postgres -c "$PG_PATH/pg_ctl start -D $PGDATA -l $PGDATA/log_file.txt" exit 0 ;; stop|status) su - postgres -c "$PG_PATH/pg_ctl $1" ;; kill) su - postgres -c "$PG_PATH/pg_ctl stop -m fast" ;; reboot) $0 kill $0 start ;; *) echo "Используйте: $0 {start|stop|kill|reboot|status}" exit 1 ;; esac exit 0
При запуске из консоли скрипт работает корректно
root@debian:~# /etc/init.d/postgresql start сервер запускается root@debian:~# /etc/init.d/postgresql status pg_ctl: сервер работает (PID: 759 ) /usr/lib/postgresql/9.6 /bin/postgres "-D" "/var/lib/postgresql/9.6/main" root@debian:~# /etc/init.d/postgresql stop ожидание завершения работы сервера.... готово сервер остановлен root@debian:~#
На скрипт есть ссылки в:
/etc/rc0.d -> K02postgresql
/etc/rc1.d -> K02postgresql
/etc/rc2.d -> S02postgresql
/etc/rc3.d -> S02postgresql
/etc/rc4.d -> S02postgresql
/etc/rc5.d -> S02postgresql
/etc/rc6.d -> K02postgresql

Пытался разобраться со стандартным скриптом автозапуска PostgeSQL, но не осилил.
Тем более, что в мануале по postgresql рекомендуется делать именно так.
Уже отчаялся искать ответ в Инете. Прошу конкретного совета.

Ответ: Спасибо Ёш!
Повезло, наткнулся на хорошую статью на Хабрахабре

По ней:
1. В /etc/systemd/system/multi-user.target.wants нашел ссылку на unit postgresql.service
2. Переписал его следующим образом
Description=PostgreSQL RDBMS Type=forking PIDFile=/var/lib/postgresql/9.6 /main/postmaster.pid WorkingDirectory=/usr/lib/postgresql/9.6 /bin User=postgres Group=postgres Environment=PGDATA=/var/lib/postgresql/9.6 /main OOMScoreAdjust=-100 ExecStart=/usr/lib/postgresql/9.6 /bin/pg_ctl start -D /var/lib/postgresql/9.6/main -l /var/lib/postgresql/9.6/main/log_file.txt ExecStop=/usr/lib/postgresql/9.6 /bin/pg_ctl stop -m fast ExecReload=/usr/lib/postgresql/9.6 /bin/pg_ctl restart -D /var/lib/postgresql/9.6/main TimeoutSec=60 #Restart=always #ExecStart=/bin/true #ExecReload=/bin/true #RemainAfterExit=on WantedBy=multi-user.target

К стати, здесь используется решение, которое позволяет препятствовать агрессивной работе OOM killer о которой пишется в мануале по postgres. О нем говорится что его невозможно остановить, но оказывается что это возможно, указав OOMScoreAdjust=-1000
OOM killer - механизм уничтожения процессов при нехватке памяти, который был реализован на уровне ядра, начиная с Linux 2.6 и новее.

Ещё возможно раскомментировать строчку #Restart=always.
В таком случае будет отслеживаться наличие указанного PIDFile и при его отсутствии производиться попытка запуска postgresql
Можно считать это аналогом скрипта из моего предшествующего поста, но с реализацией на уровне системы))

После изменения unit-файла postgresql.service поочередно выполнил команды для переустановки и проверки его работы
systemctl disable postgresql.service systemctl enable postgresql.service systemctl -l status postgresql.service systemctl start postgresql.service systemctl stop postgresql.service

При выключении системы сервер корректно останавливается и при старте ОС Debian 8 автоматом загружается.
Убрал костыль, который делал для Cron"а

Если есть недостатки в предложенном решении с радостью выслушаю.

Вопрос: При установке Postgresql 9.4 в Debian 8 (jessie) не создаётся директория /etc/postgresql


Добрый день!

Был установлен Postgresql 9.4. ОС Debian 8 (jessie)
В очередной момент горе администратор решил переустановить его.
При этом при удалении пакетов Postgresql и Pgadmin3 удалял что-то вручную.

В результате на сегодняшний день админа нет, а при моих всяческих попытках установить Postgresql не создается директория /etc/postgresql и соответственно конфигурационные файлы которые в ней хранятся...

Подскажите пожалуйста как можно теперь корректно установить Postgresql-сервер.

Использование стандартных методов sudo apt-get --purge remove postgresql и последующая установка sudo apt-get install postgresql не помогает...

Заранее спасибо за ответы!

Ответ:
Устанавливал так.

После удаления postgresql-common с параметром --purge и повторной установки все конфиги были восстановлены.
Прописал пользователей, поправил настройки и все заработало!
Спасибо огромное!!!

Запуск и завершение PostgreSQL

В этом разделе описаны два способа запуска и завершения серверного процесса PostgreSQL. Первый способ основан на применении управляющей программы pg_ctl, которая должна одинаково работать на всех компьютерах независимо от операционной системы. Предполагается, что сценарий должен выполняться системным пользователем (то есть пользователем, которому принадлежит каталог данных), которому разрешено выполнение серверного процесса postmaster.

Во втором варианте применяется сценарий SysV, находящийся в подкаталоге contrib/start-scripts основного каталога PostgreSQL. Установка сценария SysV описана в главе 2. По умолчанию сценарий называется linux, поскольку он предназначен для запуска из стартового сценария Linux, хотя в инструкциях по установке он переименовывается в сценарий postgresql в каталоге запуска служб (например, /etc/rc.d/init.d).

Самое принципиальное различие между программой pg_ctl и сценарием SysV заключается в том, что программа pg_ctl выполняется пользователем, запускающим серверный процесс postmaster (например, postgres), а сценарий SysV должен запускаться пользователем root.

Сценарий службы не является специфическим для Linux. Он совместим с большинством систем, использующих стартовые сценарии SysV. Тем не менее, если вы не работаете в системе Linux, возможно, лучше выбрать pg_ctl.

Приложение pg_ctl

В поставку PostgreSQL входит приложение pg_ctl, предназначенное для решения общих задач управления. В частности, оно позволяет запускать, завершать, перезапускать и получать информацию о состоянии PostgreSQL.

При запуске pg_ctl с ключом - -help выводится следующее описание:

pg_ctl start [-w] [-D каталог] [-s] [-1 файл] [-о "параметры"]

pg_ctl stop [-W] [-0 каталог] [-s] [-m режим_завершения]

pg_ctl restart [-w] [-D каталог] [-s] [-m режим_завершения] [-о "параметры"]

pg_ctl status [-D каталог]

Ключи приложения pg_ctl описаны ниже.

  • - w. Приложение pg_ctl ож] [дает завершения операции перед возвратом в режим командной строки. Параметр используется с операциями start или restart; по умолчанию приложение передает команду процессу postmaster и немедленно завершается.
  • -W. Приложение pg_ctl не ожидает завершения операции перед возвратом в режим командной строки. Параметр используется только с операцией stop; по умолчанию приложение передает команду процессу postmaster и ожидает ее выполнения перед завершением.
  • -D каталог. Каталог, содержащий файлы базы данных. Данный ключ не обязателен, поскольку информация может храниться в переменной среды PGDATA. Если переменная не существует, флаг -D является обязательным.
  • -s. Подавление вывода pg_ctl, кроме системных ошибок. Если флаг не задан, сведения о действиях с базой данных (или запуске/завершении в зависимости от выбранной операции) выводятся на экране пользователя, выполнившего команду.
  • -1 файл. Имя файла, в который записываются сведения об операциях с базой данных. Параметр используется только с операцией start.
  • -m режим_завершения. Режим завершения postmaster (конечно, этот параметр доступен только для операций stop и restart):
    • smart - перед завершением процесс postmaster ожидает отключения всех клиентов;
    • fast - процесс postmaster завершается, не ожидая отключения клиентов;
    • immediate - процесс postmaster прекращает работу еще быстрее, чем в режиме fast, без выполнения стандартных завершающих процедур, при следующем запуске база данных запускается в режиме восстановления (recovery) и проверяет целостность системы.
  • -о "параметры". Заданная строка параметров, заключенная в кавычки, напрямую передается процессу postmaster (например, флаг - i для активизации поддержки TCP/IP). Полный список флагов приведен в подразделе «Прямое обращение к postmaster» этого раздела.

ПРИМЕЧАНИЕ

Многие параметры конфигурации postmaster задаются в файле postgresql.conf, находящемся в каталоге данных PostgreSQL (например, /usr/local/pgsql/data). Эти параметры управляют более сложными техническими аспектами работы PostgreSQL. He изменяйте их, если не уверены в правильности своих действий.

Запуск PostgreSQL в приложении pg_ctl

Чтобы запустить серверный процесс PostgreSQL postmaster, передайте pg_ctl ключ start. Помните, что приложение pg_ctl должно запускаться пользователем postgres (или другим пользователем, которому принадлежит каталог данных PostgreSQL).

В листинге 9.1 приведен пример запуска postmaster с каталогом данных /usr/ local/pgsql/data. СУБД успешно запускается, выдает время последнего завершения работы базы данных и отладочную информацию, после чего пользователь postgres возвращается к приглашению командного интерпретатора.

Листинг 9.1. Запуск PostgreSQL в приложении pg_ctl

$ pg_ctl -D /usr/1oca!/pgsql/data start

DEBUG: database system was shut down at 2001-09-17 08:06:34 POT

DEBUG: Checkpoint record at (0. 1000524052)

DEBUG: Redo record at (0. 1000524052): Undo record at (0. 0): Shutdown TRUE

Завершение PostgreSQL в приложении pg_ctl

Серверный процесс PostgreSQL postmaster можно остановить той же программой pg_ctl, которой он был запущен. Приложение pg_ctl проверяет Наличие работающего процесса postmaster, и если команда stop была выдана владельцем работающего процесса (например, пользователем postgres), сервер PostgreSQL прекращает работу.

Существуют три режима завершения серверного процесса PostgreSQL: интеллектуальный (smart), ускоренный (fast) и немедленный (immediate). Режим завершения задается ключом -т при вызове pg_ctl.

В интеллектуальном режиме (используемом по умолчанию) PostgreSQL перед завершением ждет, пока все клиенты отключатся от сервера. В ускоренном режиме PostgreSQL просто начинает стандартную процедуру завершения, не проверяя состояние клиентских подключений. В немедленном режиме стандартная процедура завершения пропускается, и при последующем перезапуске система должна пройти через режим восстановления.

ВНИМАНИЕ

Никогда не завершайте процесс postmaster командой kill -9 (kill -KILL), что приводит к потере или порче данных.

В листинге 9.2 сценарий pg_ctl завершает процесс postmaster в ускоренном режиме. Процесс postmaster прекращает работу, не дожидаясь отключения клиентов.

Листинг 9.2. Завершение PostgreSQL в приложении pg_ctl

$ pg_ctl -D /usr/local/pgsql/data stop -m fast

Fast Shutdown request at Mon Sep 17 09:23:39 2001 DEBUG: shutting down

waiting for postmaster to shut down.....

DEBUG: database system is shut down

ПРИМЕЧАНИЕ

Завершение в режиме smart эквивалентно команде kil I -TERM для процесса postmaster. Режим fast эквивалентен команде kill -INT, а аналогом режима immediate является команда kill -QUIT.

Перезапуск PostgreSQL в приложении pg_ctl

Последовательные вызовы pg_ctl с операциями stop и start можно заметить одним вызовом с операцией restart. В команде также может присутствовать флаг -т, определяющий режим завершения.

Параметры, использованные при последнем запуске PostgreSQL, хранятся во временном файле postmaster.opts в каталоге данных PostgreSQL (переменная PGDATA). Файл используется при вызове pg_ctl с аргументом restart и обеспечивает сохранение предыдущих настроек при перезапуске. Не размещайте собственные параметры конфигурации в файле postmaster.opts, поскольку они будут стерты при запуске pg_ctl с аргументом start.

В листинге 9.3 приведен пример перезапуска сервера базы данных booktown пользователем postgres.

Листинг 9.3. Перезапуск PostgreSQL в приложении pg_ctl

$ pg_ctl -D /usr/1oca!/pgsql/data restart

Smart Shutdown request at Mon Sep 17 08:33:51 2001

DEBUG: shutting down

waiting for postmaster to shut down.....DEBUG: database system is shut down

postmaster successfully shut down

postmaster successfully started

DEBUG: database system was shut down at 2001-09-17 08:33:53 PDT

DEBUG: Checkpoint record at (0. 1000524116)

DEBUG: Redo record at (0. 1000524116): Undo record at (0. 0): Shutdown TRUE

DEBUG: NextTransactionld: 815832: NextOid: 3628113

DEBUG: database system is in production state

$ pg_ctl -D /usr/local/pgsql/data status

pg_ctl: postmaster is running (pid: 11575)

Command line was:

/usr/local/pgsql/bin/postmaster "-D" "/usr/local/pgsql/data"

ПРИМЕЧАНИЕ

Использование переменной PGDATA заметно сокращает объем команды. Если вы всегда работаете с одним каталогом данных, присвойте значение переменной PGDATA (например, в файле /etc/profile, как рекомендовалось в главе 2), и вам не придется использовать ключ -D.

Похожие публикации