postgres 14 «создать публикацию» застрял на несколько часов

#postgresql #logical-replication #pg-upgrade

#postgresql #логическая репликация #pg-обновление

Вопрос:

Я обновился с Postgres 10 до Postgres 14, используя --link опцию pg_upgrade. Общий размер баз данных составляет около 10 ТБ. pg_upgrade прошел успешно и быстро, как и предлагал инструмент —

Optimizer statistics are not transferred by pg_upgrade. Once you start the new server, consider running: /usr/pgsql-14/bin/vacuumdb --all --analyze-in-stages

Я выполнил приведенную выше команду, но процесс застрял. В качестве побочного эффекта этого (или нет, не уверен), когда я создаю публикацию, приглашение никогда не возвращается, и публикация не создается даже через много часов.

postgres=# выбрать * из pg_stat_progress_vacuum;

c1 c2
pid 9520
датид 16402
имя даты xyz
релид 22423
фаза индексы пылесоса
heap_blks_total 232816470
heap_blks_scanned 36766348
heap_blks_vacuumed 0
index_vacuum_count 0
max_dead_tuples 11184809
num_dead_tuples 11184521

Это тот же результат, что и вчера. Что я могу сделать, чтобы ускорить это и команду «создать публикацию»? Примечание: Виртуальная машина, на которой работает Postgres, довольно мощная (64 ГБ оперативной памяти, 16 ядер). Спасибо!


изменить 1: вывод pg_stat_activity для того же pid,

c1 c2
pid 9520
backend_start 2021-12-06 15:13:23.479071-08
xact_start 2021-12-06 15:13:23.512581-08
query_start 2021-12-06 15:13:23.512581-08
обмен состояниями 2021-12-06 15:13:23.512581-08
wait_event_type Перерыв
wait_event Вакуумный отсек
государство активный
серверная часть_xmin 3140627534
запрос автовакуум: ВАКУУМНЫЙ xyz (для предотвращения закручивания)
backend_type автовакуумный рабочий

Ответ №1:

vacuumdb --all --analyze-in-stages не побежит VACUUM , но ANALYZE , так что вам придется заглянуть внутрь pg_stat_progress_analyze , чтобы посмотреть, как у него дела.

VACUUM Процесс, который вы видите запущенным, не имеет к этому никакого отношения. Это антиобертывающий вакуум, который в настоящее время спит, но в остальном обрабатывается. Позвольте этому завершиться; этот процесс важен для работоспособности вашей базы данных. если вы хотите, чтобы дальнейшие запуски autovacuum в этой таблице выполнялись быстрее, уменьшите autovacuum_vacuum_cost_delay для этой таблицы.

Комментарии:

1. pg_stat_progress_analyze Выходные данные пусты, так что, возможно, поэтапный анализ завершен? Да, каждый раз pg_stat_progress_vacuum результат один и тот же. Я не настраивал никаких параметров автовакуума. Я могу посмотреть на это. Спасибо. Из pg_stat_activity я вижу одну интересную строку для того же pid и отредактировал свой вопрос с выводом.

2. Спасибо за редактирование вашего ответа, Лоренц. как добиться прогресса в этом процессе? поле pg_stat_activity state_change вообще не обновляется. Этот процесс замедляет работу всей базы данных. Я не могу настроить логическую/ потоковую репликацию — это ожидается?

3. Да, это ожидаемо. В настоящее время он сканирует и очищает индексы. Пусть это закончится.

Ответ №2:

Простое выполнение обновления не должно было приводить к запуску вакуума защиты от обтекания, так что решение о запуске сразу после обновления может быть совпадением по времени. С другой стороны, возможно, ваша новая версия базы данных имеет другие параметры конфигурации , например, более низкое значение для autovacuum_freeze_max_age , запуск с этой новой настройкой-это то, что вызвало ее запуск прямо сейчас. Вы перенесли все настройки конфигурации, отличные от настроек по умолчанию, с v10 на v14?

Я согласен с Лоренцем, что нужно дать этому закончиться, но это не значит, что вам нужно позволить этому закончиться прямо сейчас. Вы можете завершить очистку бэкэнда, чтобы у вашей публикации «СОЗДАТЬ» была возможность запуска. Автоматическая очистка может быстро перезапуститься, поэтому при отмене вакуума у вас уже должна быть попытка запустить публикацию «СОЗДАТЬ». Таким образом, он сможет получить блокировку до того, как вакуум сможет снова включиться и снова захватить блокировку. Но убедитесь, что у вас не вошло в привычку отменять пылесосы каждый раз, когда они причиняют вам неудобства.

Кроме того, вы должны значительно увеличить maintenance_work_mem. Похоже, что в настоящее время он установлен на 64 МБ, что довольно мало для сервера, который вы описываете. Если вы установите для него значение 1 ГБ, то он сможет очистить всю таблицу всего за один проход по индексам, а не за семь, для которых вы в настоящее время работаете. Я бы изменил эту настройку в файле conf и НАСТРОИЛ сервер, прежде чем вы отмените вакуум, таким образом, у нового вакуума, который запускается, должна быть новая настройка.

Наконец, я не знаю, почему это приводит к удалению индекса. Я думал, что v14 изменил его так, чтобы аварийные пылесосы не утруждали себя этим, а просто замораживали кортежи в куче и оставляли индексы на потом. Я думаю, мне нужно немного больше изучить v14, чтобы понять, что он здесь делает на самом деле.

Комментарии:

1. autovacuum_freeze_max_age значение является значением по умолчанию как для V10, так и для V14. Не знаю, сработал ли вакуум против обтекания, потому что мы создали 2 реплики виртуальных машин из нашего живого экземпляра, и на обеих виртуальных машинах (на одной работает v10, а на другой v14) я вижу, что выполняется один и тот же вакуумный процесс. Спасибо за разъяснение, что мне не нужно ждать завершения этого вакуумного процесса прямо сейчас(так как он все еще работает)!

2. вы были правы насчет вакуума против обтекания, как только я применил изменение конфигурации и убил предыдущий процесс, он быстро запустился, но я снова убил этот процесс для «создания публикации», и это удалось в кратчайшие сроки. Теперь снова возник вакуумный процесс против завертывания, и на этот раз я позволю ему работать. Сейчас будет интересно рассчитать время логической репликации.