Найти в Дзене

[PostgreSQL] Поднятие службы на Windows

В статье рассматривается поднятия службы PostgreSQL на Windows. У этой статьи есть продолжение Создание и подключение к БД, где рассматривается создание БД, таблиц со связями и подключение к БД через python. В конце статьи есть ссылка на исходники в GitLab ОС: Windows 10 БД: PostgreSQL 17.5 Прочее: 7-zip Нам понадобятся: В статье используется PostgreSQL версии 17.5, но вероятно, что на других версиях примеры из статьи тоже будут работать В рамках статьи мы будем писать bat-файлы. Данный раздел будет являться начальным перед написанием каждого bat-файла Структура начального bat-файла chcp 65001 >nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system" if '%errorlevel%' NEQ '0' (goto need_admin) else (goto as_admin) :as_admin :need_admin echo "Для запуска нужны права администратора" pause Давайте пройдемся по строкам данного файла: Указываем, что будет использоваться кодировка UTF-8 chcp 65001 Наш bat-файл необходимо будет запускать от имени администратора.
Оглавление

Введение

В статье рассматривается поднятия службы PostgreSQL на Windows.

служба PostgreSQL
служба PostgreSQL

У этой статьи есть продолжение Создание и подключение к БД, где рассматривается создание БД, таблиц со связями и подключение к БД через python.

В конце статьи есть ссылка на исходники в GitLab

Используемые технологии

ОС: Windows 10

БД: PostgreSQL 17.5

Прочее: 7-zip

План работ

  • скачивание ПО
  • начальный bat-файл
  • подготовка инфраструктуры
  • поднятие службы
  • откат к начальным настройкам

Скачивание ПО

Нам понадобятся:

enterprisedb.com
enterprisedb.com

В статье используется PostgreSQL версии 17.5, но вероятно, что на других версиях примеры из статьи тоже будут работать

Начальный bat-файл

В рамках статьи мы будем писать bat-файлы.

Данный раздел будет являться начальным перед написанием каждого bat-файла

Структура начального bat-файла

chcp 65001
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"
if '%errorlevel%' NEQ '0' (goto need_admin) else (goto as_admin)
:as_admin
:need_admin
echo "Для запуска нужны права администратора"
pause

Давайте пройдемся по строкам данного файла:

Указываем, что будет использоваться кодировка UTF-8

chcp 65001

Наш bat-файл необходимо будет запускать от имени администратора. В связи с тем, что часть кода может отработать и без прав администратора, пишем безобидную проверку, в рамках которой пытаемся открыть системную директорию. Если bat-файл запущен НЕ с правами администратора, то возникнет ошибка. Для того что бы программа продолжала работать, мы это ошибку перехватываем командой >nul 2>&1

>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"

Считываем ошибку. Если она произошла, то переходим на строку need_admin, если ошибки нет, то на строку as_admin.

if '%errorlevel%' NEQ '0' (goto need_admin) else (goto as_admin)

Строка as_admin. Именно после этой строки бы будем писать команды в следующих разделах статьи.

:as_admin

Строки need_admin. Фактически это строки завершения программы с просьбой перезапустить bat-файл, но уже с правами администратора.

:need_admin
echo "Для запуска нужны права администратора"
pause

Подготовка инфраструктуры

Необходимо определить место, где будет располагаться ваш PostgreSQL.

Для расположения таких программ я придерживаюсь правила:

path к нашей директории и сама директория не должны содержать:

  1. кириллических символов
  2. пробелов
Пример директории
Пример директории

После того, как определили директорию, где будет расположен PostgreSQL, создаем в ней bat-файл "0_load_and_run_serv.bat" с содержанием из раздела Начальный bat-файл

0_load_and_run_serv.bat
0_load_and_run_serv.bat

Начнем заполнение файла после строки :as_admin

Необходимо указать название нашего сервиса PostgreSQL. Можем придумать любое название. Я придумал: "ServPosgre17"

set PG_SERV=ServPosgre17

Необходимо указать путь к zip файлу с PostgreSQL

set PG_ZIP=D:\Downloads\postgresql-17.5-1-windows-x64-binaries.zip

Это были единственные внешние данные, которые у нас с вами могут не совпадать, остальное все будет одинаковое.

Теперь фиксируем путь к текущей папке (где лежит bat-файл)

set WORK_DIR=%~dp0

Фиксируем пути к папке bin и папке data. Их еще нет, но будут

set PG_BIN=%WORK_DIR%%PG_SERV%\bin\
set PG_DATA=%WORK_DIR%%PG_SERV%\data\

Создаем переменную для обновления PATH. Берем текущий PATH и добавляем к нему путь к нашему PostgreSQL.

set NEW_PATH=%PG_BIN%;%PATH%

В связи с тем, что bat-файл запустится от имени администратора. По умолчанию мы будем находится в папке C:\WINDOWS\system32. Давайте укажем перейти в текущую директорию.

cd /d %WORK_DIR%

В связи с тем, что предполагается обновление PATH, давайте сохраним текущий PATH в файле. Если что-то пойдет не так мы всегда сможем восстановиться.

echo %PATH% > %WORK_DIR%\path-backup.txt

Предлагаю сделать проверку на наличия папки с PostgreSQL.

if not exist %PG_SERV% (goto create_pg_folder) else (goto pg_folder_exist)

Если папки нет, то делаем 2 действия. Заходим в zip файл с PostgreSQL и переименовываем корневой каталог под название нашей службы. Потом достаем из архива в нашу текущую директорию все содержимое zip файла с сохранением вложенности файлов и папок.

:create_pg_folder
"C:\Program Files\7-Zip\7z.exe" rn %PG_ZIP% pgsql %PG_SERV%
"C:\Program Files\7-Zip\7z.exe" x %PG_ZIP% -o"%WORK_DIR%"

Прошу обратить внимание, что я ссылаюсь на "C:\Program Files\7-Zip\7z.exe", скорее всего установка 7-zip была у вас в эту же папку, но если это не так, замените путь.

Если папка с названием PG_SERV уже есть в WORK_DIR, то просто пишем сообщение, что папка уже есть

:pg_folder_exist
echo "pg path exist"

Указываем, что если PG_DATA уже есть, мы ее удаляем и создаем заново. Это необходимо для того, что бы не возникло проблем при перезапусках bat-файла

if exist %PG_DATA% rmdir %PG_DATA% /q /s
mkdir %PG_DATA%

Делаем проверку на наличие PG_SERV в PATH

Echo.%PATH% | findstr /C:%PG_SERV%>nul && (goto path_ok) || (goto set_path)

Если PG_SERV отсутствует в PATH, то заменяем текущий PATH значением из переменной NEW_PATH

:set_path
setx /M path "%NEW_PATH%"
setx path "%NEW_PATH%"

Если PG_SERV есть в PATH, то выводим сообщение, что все ок и ничего менять не надо

:path_ok
echo "path_ok"

Первая ошибка может появится тут. Поэтому мы сделали резервную копию с PATH. В конце статьи рассказывается, как восстановить PATH

Поднятие службы

Создаем кластер баз данных.

Документация к команде: https://www.postgresql.org/docs/current/app-initdb.html

"%PG_BIN%initdb.exe" -D %PG_DATA% -U postgres -A password -E utf8 -W

В этой строке говорится, что необходимо создать кластер БД и расположить его в PG_DATA, создать пользователя postgres запросить создание пароля и указать кодировку для БД utf8.

После этой команды bat-файл приостановит выполнение и будет ожидать ввода пароля для пользователя postgres

Зарегистрируем службу PostgreSQL от имени локальной системы. Служба будет запущена на порту 5432 (можно указать любой)

Документация к команде: https://www.postgresql.org/docs/current/app-pg-ctl.html

"%PG_BIN%pg_ctl.exe" register -N %PG_SERV% -U "LocalSystem" -D %PG_DATA% -w -o "-p 5432" -S auto

Запускаем службу

sc start %PG_SERV%

Ждем 2 секунды и делаем проверку статуса нашей службы. Должно возникнуть сообщение, что она запущена. Завершаем программу.

timeout 2
"%PG_BIN%pg_ctl.exe" status -D %PG_DATA%
pause
goto :eof

Сохраняем файл

0_load_and_run_serv.bat
0_load_and_run_serv.bat

Теперь можно запустить bat-файл от имени администратора для поднятия службы PostgreSQL.

Запуск от имени администратора
Запуск от имени администратора

Можно проверить, что служба есть и выполняется:

Диспетчер задач - Службы
Диспетчер задач - Службы

Дальше можно не выполнять действия.

Для того, что бы убедиться, что все работает. Откроем GUI администратора PostgreSQL.

.\ServPosgre17\pgAdmin 4\runtime\pgAdmin4.exe
.\ServPosgre17\pgAdmin 4\runtime\pgAdmin4.exe

Выберем Servers

pgAdmin4
pgAdmin4

Выберем Register-Server

Register-Server
Register-Server

В Name укажем любое название

Придумываем название к серверу
Придумываем название к серверу

Пусть будет PG17

Переходим в Connection

В Host name указываем localhost

В Password указываем пароль от пользователя postgres

Connection
Connection

Нажимаем Save

Можно пользоваться БД

PG17
PG17

Откат к начальным настройкам

Если ошибка произошла на уровне регистрации службы.

Создаем bat-файл "1_stop_serv.bat" с содержанием из раздела Начальный bat-файл

После строки as_admin указываем название нашей службы. Аналогичная строка есть в файле 0_load_and_run_serv.bat

set PG_SERV=ServPosgre17

Указываем путь к папке data. Предполагаю, что bat-файл будет располагаться и запускаться там же, где мы запускали файл 0_load_and_run_serv.bat.

set PG_DATA=%~dp0%PG_SERV%\data\

Останавливаем сервер и удаляем его из служб

pg_ctl stop -D %PG_DATA% -m fast
pg_ctl unregister -N %PG_SERV%

Проверяем статус службы. Такой службы больше не должно быть

pg_ctl status -D %PG_DATA%
pause
goto :eof

Итоговый bat-файл:

1_stop_serv.bat
1_stop_serv.bat

Если ошибка произошла на уровне замены PATH.

Создаем bat-файл "2_backup_path.bat" с содержанием из раздела Начальный bat-файл

После строки as_admin указываем рабочей директорией папку откуда запускается bat-файл.

set WORK_DIR=%~dp0
cd /d %WORK_DIR%

Предполагаю, что bat-файл будет располагаться и запускаться там же, где мы запускали файл 0_load_and_run_serv.bat. Поэтому в этой папке мы найдем файл path-backup.txt, который был создан после запуска 0_load_and_run_serv.bat.

Извлекаем из txt файла информацию. Просьба проверить информацию в файле, что там нет кракозябр, если есть, попытайтесь вручную их устранить.

set /p backup_path=<"path-backup.txt"

Обновляем PATH

setx /M path "%backup_path%"
setx path "%backup_path%"

Завершаем программу

pause
goto :eof

Итоговый bat-файл:

2_backup_path.bat
2_backup_path.bat

Исходники проекта

PyTechNotes / ServicePostgreSQL · GitLab

Подписывайтесь на Дзен, а также приглашаю в мой телеграмм канал, там публикую другой, но не менее интересный контент.