Включение core dump в PostgreSQL

Обновлено и опубликовано Опубликовано:

Используемые термины: PostgreSQL, Linux.

При возникновении сложных проблем требуется посмотреть на более детальный лог. Он, по умолчанию, не включен, так как создает очень высокую нагрузку на систему и занимает много дискового пространства. Рассмотрим его включение и средства просмотра. Предполагается, что мы работаем в системе 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:

./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'

* желтым отмечено то, что было добавлено в моем случае. Остальное, это то, что выдала команда /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.

# Linux # Базы данных
Дмитрий Моск — частный мастер
Была ли полезна вам эта инструкция?

Да            Нет