PostgreSQL: сборка из исходников и настройка под Linux
3 марта 2016
СУБД является важнейшим компонентом многих современных систем. Поэтому совершенно естественным является желание собрать эту СУБД из исходников самостоятельно с флагами -march=native -O3
, не говоря уже о куда более тонкой настойке при помощи скрипта configure. В этом случае вы также можете подобрать компилятор, который лучше оптимизирует конкретную СУБД под ваши конкретные задачи. Не исключено также, что готового бинарного пакета нужной вам версии приложения еще попросту не существует. Наконец, умение самостоятельно собирать и настраивать приложение дает куда более лучшее понимание его работы, чем простое запоминание каталогов с конфигами и логами. В силу названных причин, давайте попробуем разобраться, как собрать из исходников PostgreSQL, а затем настроить его для полноценной работы.
Я ставил свои эксперименты под Ubuntu Linux 14.04 LTS и PostgreSQL 9.5, но последовательность действий для других *nix систем и версий PostgreSQL не должна сильно отличаться. Поскольку для сборки PostgreSQL нам понадобится ряд пакетов, не требуемых во время работы СУБД, для сборки лучше создать LXC контейнер, чтобы эти пакеты не засоряли основную систему.
Перекрестная ссылка: Вас также может заинтересовать заметка Начало работы с PostgreSQL. В частности, в ней рассказывается, для чего нужны файлы pg_hba.conf и postgresql.conf, как пользоваться утилитой psql, а также как производится резервное копирование и восстановление PostgreSQL. Далее предполагается, что все это вы уже знаете.
Получаем исходники
Исходники PostgreSQL можно получить по HTTP или из Git-репозитория.
Пойдем сложным путем на случай, если вас интересует конкретная ветка или самый свежий код из master:
Это займет какое-то время. Затем говорим:
git checkout (ветка)
Ура, теперь у нас есть исходники.
Сборка
Для сборки при помощи gcc говорим:
jade
Если же вы предпочитаете clang:
zlib1g-dev jade
sudo update-alternatives --install /usr/bin/cc cc \
/usr/bin/clang-3.6 100
sudo update-alternatives --install /usr/bin/c++ c++ \
/usr/bin/clang++-3.6 100
Если вы намерены собирать еще и документацию, также понадобятся:
openjade1.3 opensp xsltproc
Смотрим все доступные флаги скрипта configure:
В документации можно найти более подробное их описание. Вот несколько наиболее интересных:
--enable-profiling build with profiling enabled
--enable-coverage build with coverage testing instrumentation
--enable-dtrace build with DTrace support
--enable-tap-tests enable TAP tests (requires Perl and IPC::Run)
--enable-cassert enable assertion checks (for debugging)
Примечание: Кое-какие подробности касательно флага --enable-coverage
вы найдете в конце заметки Определение степени покрытия кода на C/C++ тестами. Подробности касательно DTrace приводятся в посте Использование DTrace на примере FreeBSD и Linux.
Пример сборки с отладочными символами и ассертами (не для прода!):
make -j8
Чтобы make не выводил длинный список всего, что он делает, используйте -s:
Желающие адской оптимизации могут попробовать:
Сборка вообще всего, включая документацию и расширения:
Прогон регрессионных тестов:
make check-world
Если вдруг тесты почему-то свалились, здесь можно посмотреть логи:
src/test/regress/log/initdb.log
Если что-то пошло не так, можно попробовать очистить все лишнее и начать заново, сказав git clean -dfx
.
Дополнение: Во FreeBSD сборка осуществляется аналогично, только вместо перечисленных выше пакетов вам понадобятся: git-lite bison perl5 gmake
, а также при сборке вместо make следует использовать gmake.
Установка
Все просто:
sudo make install-world
Важно! Скорее всего, здесь вы захотите воспользоваться checkinstall. Если же вы разрабатываете патч для PostgreSQL, куда удобнее будет использовать флаг конфигурации --prefix
и один из этих скриптов (спасибо, @kelvich!).
Если вы хотите установить только расширения, это можно сделать так:
make -j8
sudo make install
Сразу после установки не лишим будет прописать каталог /usr/local/pgsql/bin в переменную окружения $PATH.
Создаем пользователя postgres:
Под пользователем postgres:
… подготавливаем каталог, в котором будут храниться все данные:
mkdir data
/usr/local/pgsql/bin/initdb -D /home/postgres/data
Файлы postgresql.conf и pg_hba.conf вы найдете в /home/postgres/data.
Наконец, запускаем PostgreSQL:
>/home/postgres/logfile 2>&1 &
Видим, что порт 5432 прослушивается. В файле ./data/postmaster.pid первой строчкой записан PID master-процесса.
Пример создания БД и подключения к ней:
/usr/local/pgsql/bin/psql my_database
Остановить СУБД можно, например, так:
Но лучше так:
После установки можно еще заполнить базу какими-то данными и провести нагрузочное тестирование (не зря же мы кудрили с флагами оптимизации?):
… или, как вариант:
select * from my_table where id = 100;
Стандартный бенчмарк — инициализация и сам тест:
pgbench -j 8 -c 8 -T 30 -P my_database
Прогон обычных регрессионных тестов:
Удалить PostgreSQL можно, вернувшись в каталог с исходниками, и сказав:
Все это, конечно, безумно интересно, но для полноценный настройки кое-чего все же не хватает.
Автозапуск
Парни из компании 2nd Quadrant написали отличный init.d скрипт для PostgreSQL. Он мне так понравился, что я даже сделал зеркало на GitHub.
Копируем скрипт в /etc/init.d/postgresql и правим несколько первых строк:
prefix=/usr/local/pgsql/
# Data directory
PGDATA=/home/postgres/data
# Who to run the postmaster as, usually "postgres". (NOT "root")
PGUSER=postgres
# Where to keep a log file
PGLOG=/home/postgres/logfile
Затем говорим:
sudo update-rc.d postgresql defaults
sudo service postgresql stop
sudo service postgresql start
Это уже почти здорово, но, к сожалению, пока что без ротации логов.
Ротация логов
Настраивается путем правки postgresql.conf примерно так:
log_directory = '/home/postgres/logs'
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
log_rotation_age = 1d
log_rotation_size = 0
# чтобы в логи писались таймстемпы
log_line_prefix = '%m '
Сам PostgreSQL не умеет сжимать и удалять старые логи, но эту проблему легко решить, прописав в /etc/crontab скрипт для ротации логов из заметки Как я выбирал скриптовый язык и остановился на Python.
В качестве альтернативного варианта можно воспользоваться утилитой rotatelogs из пакета apache2-utils. В этом случае придется отредактировать строку что-то там $PGCTL start
в init.d скрипте PostgreSQL. Результат должен получиться примерно таким:
Мне лично этот способ не нравится, так как мне хотелось бы, чтобы в именах лог-файлов были даты, а rotatelogs пишет просто номера. Кроме того, сжимать логи rotatelogs не умеет.
Заключение
Как видите, все довольно просто. Как уже отмечалось, сборка PostgreSQL для других версий Ubuntu или других *nix систем будет мало чем отличаться. Если же вдруг вас интересует сборка PostgreSQL под Windows, она описана здесь.
Дополнение: Также вас могут заинтересовать посты Памятка по сборке PostgreSQL при помощи Meson, Учимся писать расширения на языке C для PostgreSQL, и далее по ссылкам.
Метки: PostgreSQL, СУБД.
Вы можете прислать свой комментарий мне на почту, или воспользоваться комментариями в Telegram-группе.