#postgresql
Вопрос:
Я запускаю приложение с примерно 20 процессами, подключенными к базе данных postgres (10.0) в Windows server 2016.
Примерно с месяца у меня случаются неожиданные сбои postgres.exe. Чтобы изолировать проблему, я расширил ведение журнала, установив log_min_duration_statement = 0
Это создает более подробный файл журнала. Что я могу видеть, так это:
LOG: server process (PID xxxxx) was terminated by exception
0xFFFFFFFF DETAIL: Failed process was running: COMMIT HINT: See C
include file "ntstatus.h" for a description of the hexadecimal value.
Затем он разрушает все 20 процессов, подобных этому:
LOG: terminating any other active server processes
WARNING: terminating connection because of crash of another server process
DETAIL: The postmaster has commanded this server process to roll back the current transaction and exit, because another server process exited abnormally and possibly corrupted shared memory.
HINT: In a moment you should be able to reconnect to the database and repeat your command.
WARNING: terminating connection because of crash of another server process
DETAIL: The postmaster has commanded this server process to roll back the current transaction and exit, because another server process exited abnormally and possibly corrupted shared memory.Then DB recovers:
HINT: In a moment you should be able to reconnect to the database and repeat your command.
LOG: all server processes terminated; reinitializing
LOG: database system was interrupted; last known up at 2021-06-11 18:17:18 CEST
БД переходит в режим восстановления
FATAL: the database system is in recovery mode
FATAL: the database system is in recovery mode
FATAL: the database system is in recovery mode
FATAL: the database system is in recovery mode
LOG: database system was not properly shut down; automatic recovery in progress
...
LOG: redo starts at 1B2/33319E58
FATAL: the database system is in recovery mode
LOG: invalid record length at 1B2/33D29930: wanted 24, got 0
LOG: redo done at 1B2/33D29908
LOG: last completed transaction was at log time 2021-06-11 18:21:39.830526 02
FATAL: the database system is in recovery mode
...
FATAL: the database system is in recovery mode
LOG: database system is ready to accept connections
Теперь он снова работает как обычно
Разбившийся PID xxxxx, который я могу идентифицировать с postgres.exe выполняется для одного из 20 прикладных процессов. Это не всегда одно и то же. Это происходит примерно каждые 5-10 дней.
Кто-нибудь может дать мне несколько советов, как отследить причину этой аварии?
Используемые расширения:
oracle_fdw 2.0.0, PostgreSQL 10.0, Oracle client 11.2.0.3.0, Oracle server 11.2.0.2.0
Крашдамп:
Перейдите по ссылке : https://wiki.postgresql.org/wiki/Getting_a_stack_trace_of_a_running_PostgreSQL_backend_on_Windows
Хотя пользователь postgres имеет «полный контроль» над папкой crashdump на вкладке безопасность, он ничего не пишет. Папка остается пустой.
Продолжение комментария @Laurenz Albe: Фиксация не является причиной сбоя. Это последняя успешно выполненная команда сеанса. Объяснено на следующем примере:
Процесс получает работу и начинает выполнять свою работу
2021-06-15 16:27:51.100 CEST [25604] LOG: duration: 0.061 ms statement: DISCARD ALL
2021-06-15 16:27:51.100 CEST [25604] LOG: duration: 0.012 ms statement: BEGIN
2021-06-15 16:27:51.100 CEST [25604] LOG: duration: 0.015 ms statement: SET TRANSACTION ISOLATION LEVEL READ COMMITTED
сейчас много действий происходит в рамках сеанса 25404
и, среди прочего, в oracle foreign datawrapper
2021-06-15 16:28:13.792 CEST [25604] LOG: duration: 0.016 ms execute <unnamed>: FETCH ALL FROM "<unnamed portal 689>"
успешно завершает действие (данные транзакции в базе данных)
2021-06-15 16:28:13.823 CEST [25604] LOG: duration: 0.059 ms statement: COMMIT
много действий происходит в разных сеансах
, в том числе в oracle foreign datawrapper
еще через 7 минут после этого запрашивается следующее задание, и теперь postgres.exe крушение
2021-06-15 16:36:01.524 CEST [17904] LOG: server process (PID 25604) was terminated by exception 0xFFFFFFFF
Процесс не ОТМЕНЯЕТ ВСЕ, НЕ НАЧИНАЕТ и не УСТАНАВЛИВАЕТ УРОВЕНЬ ИЗОЛЯЦИИ ТРАНЗАКЦИЙ ЧТЕНИЕ ЗАФИКСИРОВАНО
Он немедленно выходит из строя
Мой вывод: «возможно, поврежденная общая память» была инициирована одним из предыдущих процессов. Это означает, что между последней успешной фиксацией и новым запросом. Это 7-минутный промежуток времени, в течение которого возникает проблема.
Какие-то отзывы по этому выводу?
Комментарии:
1. Если a
COMMIT
терпит крах, это плохо. Какие расширения установлены?2. Возможно, это уже исправленная ошибка. Текущая незначительная версия 10-10.17. Не запускайте программное обеспечение с почти 4-летними нефиксированными известными ошибками.
3. Есть ли запущенная антивирусная программа? Если да, отключите его — по крайней мере, для каталога данных Postgres
4. @jjanes: Я не нашел никакой информации в документах postgres.
5. @a_horse_with_no_name: Я тоже нашел это в документах posgres: Там не работает антивирусный сканер