Введение
В статье рассматривается поднятия службы PostgreSQL на Windows.
У этой статьи есть продолжение Создание и подключение к БД, где рассматривается создание БД, таблиц со связями и подключение к БД через python.
В конце статьи есть ссылка на исходники в GitLab
Используемые технологии
ОС: Windows 10
БД: PostgreSQL 17.5
Прочее: 7-zip
План работ
- скачивание ПО
- начальный bat-файл
- подготовка инфраструктуры
- поднятие службы
- откат к начальным настройкам
Скачивание ПО
Нам понадобятся:
- архив с бинарными файлами PostgreSQL https://www.enterprisedb.com/download-postgresql-binaries (только скачать)
В статье используется 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 к нашей директории и сама директория не должны содержать:
- кириллических символов
- пробелов
После того, как определили директорию, где будет расположен PostgreSQL, создаем в ней bat-файл "0_load_and_run_serv.bat" с содержанием из раздела Начальный 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
Сохраняем файл
Теперь можно запустить bat-файл от имени администратора для поднятия службы PostgreSQL.
Можно проверить, что служба есть и выполняется:
Дальше можно не выполнять действия.
Для того, что бы убедиться, что все работает. Откроем GUI администратора PostgreSQL.
Выберем Servers
Выберем Register-Server
В Name укажем любое название
Пусть будет PG17
Переходим в Connection
В Host name указываем localhost
В Password указываем пароль от пользователя postgres
Нажимаем Save
Можно пользоваться БД
Откат к начальным настройкам
Если ошибка произошла на уровне регистрации службы.
Создаем 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-файл:
Если ошибка произошла на уровне замены 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-файл:
Исходники проекта
Подписывайтесь на Дзен, а также приглашаю в мой телеграмм канал, там публикую другой, но не менее интересный контент.