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

Thank you for reading this post, don't forget to subscribe!

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

я доба­вил --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.