При возникновении сложных проблем требуется посмотреть на более детальный лог. Он, по умолчанию, не включен, так как создает очень высокую нагрузку на систему и занимает много дискового пространства. Рассмотрим его включение и средства просмотра. Предполагается, что мы работаем в системе Linux и у нас уже установлена и работает СУБД PostgreSQL
Сборка PostgreSQL
Для включения подробного лога, наша СУБД должна быть собрана с опцией debug. Посмотреть опции сборки установленного PostgreSQL можно с помощью команды pg_config. Так как она может быть установлена вне стандартного каталога для запуска, вводим:
find / -name pg_config -type f
Допустим, команда вернула:
/usr/pgsql-11/bin/pg_config
* далее, наша работа должна учитывать данный путь. Ниже по инструкции вам нужно будет менять мое значение /usr/pgsql-11/bin на свое.
Тогда запустим:
/usr/pgsql-11/bin/pg_config | grep -i debug
Если система ничего не вернула, то нам нужно пересобрать СУБД.
Для начала установим пакеты, которые нам понадобятся для сборки:
yum install centos-release-scl-rh epel-release
yum install wget systemtap-sdt-devel gcc llvm-libs llvm-toolset-7-clang-devel llvm5.0-devel libicu-devel perl-ExtUtils-Embed zlib-devel krb5-devel openssl-devel pam-devel libxml2-devel libxslt-devel openldap-devel libuuid-dev systemd-devel tcl-devel python-devel gcc-c++
Как видим, для сборки PostgreSQL требуется большое число библиотек. Чтобы не засорять систему, рекомендуется сделать сборку (configure, make) на другом компьютере или в контейнере Docker.
Смотрим версию установленного программного продукта:
psql -V
В моем примере было:
psql (PostgreSQL) 11.14
На странице ftp.postgresql.org/pub/source можно найти все версии для исходников. Мы же поступим, немного, по-другому. Создадим переменную с нашей версией:
PG_VER='11.14'
И загрузим исходник командой:
wget --no-check-certificate https://ftp.postgresql.org/pub/source/v$PG_VER/postgresql-$PG_VER.tar.gz
* если получим ошибку, вводим команду yum install wget.
Распаковываем скачанный архив:
tar zxf postgresql-*.tar.gz
Перейдем в распакованный каталог:
cd postgresql-*/
Смотрим, с какими опциями собрана наша установленная СУБД:
/usr/pgsql-11/bin/pg_config | grep -i configure
Берем полученные опции и добавляем при конфигурировании еще несколько — --enable-cassert --enable-debug:
1 |
./configure --enable-cassert --enable-debug '--enable-rpath' '--prefix=/usr/pgsql-11' '--includedir=/usr/pgsql-11/include' '--libdir=/usr/pgsql-11/lib' '--mandir=/usr/pgsql-11/share/man' '--datadir=/usr/pgsql-11/share' '--with-icu' '--with-llvm' '--with-perl' '--with-python' '--with-tcl' '--with-tclconfig=/usr/lib64' '--with-openssl' '--with-pam' '--with-gssapi' '--with-includes=/usr/include' '--with-libraries=/usr/lib64' '--enable-nls' '--enable-dtrace' '--with-uuid=e2fs' '--with-libxml' '--with-libxslt' '--with-ldap' '--with-selinux' '--with-systemd' '--with-system-tzdata=/usr/share/zoneinfo' '--sysconfdir=/etc/sysconfig/pgsql' '--docdir=/usr/pgsql-11/doc' '--htmldir=/usr/pgsql-11/doc/html' 'CFLAGS=-O2 -ggdb -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic' 'LLVM_CONFIG=/usr/lib64/llvm5.0/bin/llvm-config' 'CLANG=/opt/rh/llvm-toolset-7/root/usr/bin/clang' 'PKG_CONFIG_PATH=:/usr/lib64/pkgconfig:/usr/share/pkgconfig' |
я добавил --enable-cassert --enable-debug и -ggdb
Остальное, это то, что выдала команда /usr/pgsql-11/bin/pg_config | grep -i configure.
Собираем пакет:
make
Выполняем установку:
make install
Еще раз проверяем:
/usr/pgsql-11/bin/pg_config | grep -i debug
Теперь система должна вернуть строку с перечнем опций.
Запуск PostgreSQL в режиме отладки
Переходим в консоль под пользователем postgres:
su - postgres
Смотрим статус работы СУБД:
/usr/pgsql-11/bin/pg_ctl status
* напомним, что путь до файла pg_ctl может быть другим. Это зависит от версии postgres и операционной системы, с которой мы работаем. Как описано в начале инструкции, найти данный файл можно командой find / -name pg_ctl -type f.
Мы увидим что-то на подобие:
/usr/pgsql-11/bin/postgres "-D" "/var/lib/pgsql/11/data/"
Нас интересует значение для опции -D — это путь к рабочему каталогу с данными базы.
Останавливаем СУБД:
/usr/pgsql-11/bin/pg_ctl stop
Теперь снова стартуем PostgreSQL, применяя команду:
/usr/pgsql-11/bin/pg_ctl -D /var/lib/pgsql/11/data/ -c start
* мы используем опции -D для указания пути до рабочего каталога и -c для указания на запуск режима отладки.
Готово. Начинаем работать с СУБД. При возникновении сбоев в рабочем каталоге мы увидим лог, в названии которого будет core, например:
ls /var/lib/pgsql/11/data/
core.19438
Имейте в виду, что данный файл очень быстро растет и если на сервере мало дискового пространства, оно быстро закончится.
Просмотреть содержимое лога можно командой:
gdb /usr/pgsql-11/bin/postmaster core.19438
* путь /usr/pgsql-11/bin также зависит от версии PostgreSQL и операционной системы. Он должен совпадать с путем, по которому мы искали pg_ctl.