#postgresql
#postgresql
Вопрос:
Я ищу простой способ найти процесс-виновник, хранящий журнал транзакций, который вызывает полные запросы pg_wal.
Комментарии:
1.
pg_wal
не может быть полным. Только ваш диск может быть заполнен.
Ответ №1:
Журнал транзакций содержит все транзакции, и он не содержит ссылки на процесс, который вызвал запись записи. Таким образом, вы не можете сделать вывод из WAL, какой процесс вызывает действие по изменению данных, которое заполняет ваш диск.
Вы можете включить ведение журнала ( log_min_duration_statement = 0
) и найти ответ в файле журнала.
Но я думаю, что вы смотрите на проблему неправильно: проблема не в том, что генерируется WAL, а в том, что полные сегменты WAL не удаляются достаточно быстро.
Это может произойти по целому ряду причин:
-
Архивирование WAL имеет проблемы или выполняется слишком медленно
-
устаревший слот репликации блокирует удаление WAL
-
wal_keep_segments
слишком высокое
Комментарии:
1. Если транзакция открыта без фиксаций в течение длительного времени, контрольная точка не сможет очистить эту открытую транзакцию, потому что нет переданных данных. В этом случае журнал будет продолжать заполняться, и кто-нибудь хотел бы знать, какой процесс заполняет журнал транзакций? Как нам это выяснить?
2. Еще одна вещь, которую нужно добавить, есть несколько длительно выполняющихся открытых транзакций — откуда мне знать, какая из них НЕ позволяет процессу checkpoint очистить журнал транзакций.
3. Вы ошибаетесь. Изменения, вызванные незафиксированными транзакциями, также записываются в WAL, и после контрольной точки эти сегменты WAL будут удалены, даже если транзакция еще не зафиксирована. Длительные транзакции проблематичны по многим причинам, но они не увеличат объем вашего каталога WAL.