Глава 33. Устранение неполадок
Postgres Pro Shardman предоставляет возможность выгружать состояние серверного процесса путём включения параметра конфигурации crash_info, что может быть полезно для диагностики и отладки. Чтобы настроить это, выполните следующие шаги:
Подключитесь к СУБД и узнайте PID обслуживающего процесса текущего сеанса:
postgres=# select pg_backend_pid();
pg_backend_pid
----------------
23770Отправьте сигнал SIGSEGV процессу с данным PID:
kill -11 23770
Это приведёт к сбою этого процесса, а в каталог /var/lib/postgresql/crashinfo запишется файл, содержащий время, обратную трассировку и причину ошибки:
# Signal
Program received signal: 11 (SIGSEGV)
Signal UTC date time: 25.10.2024 08:37:02
# Program
pid: 23770
ppid: 17506
program_invocation_name: postgres: postgres postgres 10.42.42.10(34202) idle
program_invocation_short_name: tgres 10.42.42.10(34202) idle
exe_path: /opt/pgpro/sdm-17/bin/postgres
exe: postgres
# Backtrace
1 postgres + 0x5b55c0 0x55c5ba8459b7 0x00007ffcbef19070 bt_crash_handler + 0x3f7
2 libc.so.6 + 0x4251f 0x7f01c2caa520 0x00007ffcbef19140 __sigaction + 0x50
unknown ./signal/../sysdeps/unix/sysv/linux/x86_64/libc_sigaction.c:0
3 libc.so.6 + 0x125f80 0x7f01c2d8df9a 0x00007ffcbef195b8 epoll_wait + 0x1a
epoll_wait ../sysdeps/unix/sysv/linux/epoll_wait.c:30
4 postgres + 0x433870 0x55c5ba6c39bb 0x00007ffcbef195c0 WaitEventSetWait + 0x14b
5 postgres + 0x320de0 0x55c5ba5b0e74 0x00007ffcbef19650 secure_read + 0x94
6 postgres + 0x327d20 0x55c5ba5b7dae 0x00007ffcbef196a0 pq_recvbuf + 0x8e
7 postgres + 0x328980 0x55c5ba5b8995 0x00007ffcbef196c0 pq_getbyte + 0x15
8 postgres + 0x457da0 0x55c5ba6e909c 0x00007ffcbef196d0 PostgresMain + 0x12fc
9 postgres + 0x3ce210 0x55c5ba65ef86 0x00007ffcbef19a60 ServerLoop + 0xd76
10 postgres + 0x3cf240 0x55c5ba65fe18 0x00007ffcbef1a040 PostmasterMain + 0xbd8
11 postgres + 0x14ecc0 0x55c5ba3df182 0x00007ffcbef1a0c0 main + 0x4c2
12 libc.so.6 + 0x29d10 0x7f01c2c91d90 0x00007ffcbef1a0f0 __libc_init_first + 0x90
__libc_start_call_main ../sysdeps/nptl/libc_start_call_main.h:58
13 libc.so.6 + 0x29dc0 0x7f01c2c91e40 0x00007ffcbef1a190 __libc_start_main + 0x80
call_init ../csu/libc-start.c:128
__libc_start_main_impl ../csu/libc-start.c:379
14 postgres + 0x14f200 0x55c5ba3df225 0x00007ffcbef1a1e0 _start + 0x25Файл состояния выгрузки можно сгенерировать одним из следующих способов:
Отправив сигнал
40(также называемый сигналом выгрузки для диагностики):kill -40
идентификатор_процессаИспользуя функцию
pg_diagdump():SELECT pg_diagdump(
идентификатор_процесса);
Здесь идентификатор_процесса — идентификатор серверного процесса, для которого нужно выгрузить состояние.
В результате Postgres Pro Shardman выгрузит состояние в файл в каталоге $PGDATA/crash_info по умолчанию или в каталоге, указанном в параметре конфигурации crash_info_location. Имя файла генерируется по следующему шаблону: crash_. Источники данных для выгрузки состояния можно задать в параметре конфигурации crash_info_dump.ид_файла_pidид_процесса.state
В примере ниже показано, как создать и просмотреть файл состояния для серверного процесса с PID 23111:
-- Создание файла состояния
SELECT pg_diagdump(23111);
-- Исследование каталога crash_info и его содержимого
SELECT pg_ls_dir('crash_info');
-- Чтение содержимого файла состояния
SELECT pg_read_file('crash_info/crash_1722943138419104_pid23111.state');