pg_repack и логическая репликация: есть ли риск пропустить изменения в таблице при запуске pg_repack? - PullRequest
0 голосов
/ 24 апреля 2020

Как я понимаю, pg_repack создает временную "зеркальную" таблицу (таблица B), копирует строки из исходной таблицы (таблица A) и переиндексирует их, а затем заменяет оригинал зеркалом. , Шаг зеркалирования создает много шума при логической репликации (много вставок одновременно), поэтому я хотел бы игнорировать зеркальную таблицу от репликации.

Я немного запутался с тем, что происходит во время Переключатель хотя. Есть ли риск потерять некоторые изменения? Я не думаю, что это так, поскольку все фактические записи все еще идут в исходную таблицу до и после переключения, так что это должно быть безопасно, верно?

Мы запускаем Postgres 10.7 на AWS Аврора , используя wal2 json в качестве выходного модуля для репликации.

Ответы [ 2 ]

0 голосов
/ 24 апреля 2020

Чтобы выполнить перепаковку, pg_repack:

  1. создаст таблицу журнала для записи изменений, внесенных в исходную таблицу.
  2. добавит триггер в исходную таблицу, регистрируя INSERT, ОБНОВЛЕНИЯ и УДАЛЕНИЯ в нашу таблицу журналов.
  3. создать новую таблицу, содержащую все строки в старой таблице.
  4. построить индексы для этой новой таблицы.
  5. применить все изменения которые произошли в таблице журнала в новую таблицу.
  6. поменяйте местами таблицы, включая индексы и таблицы тостов, используя системные каталоги.
  7. удалите исходную таблицу.

По моему опыту, таблица журналов сохраняет все изменения и применяет их после индексов сборки, кроме того, если repack необходимо откатить изменения, примененные и к исходной таблице.

0 голосов
/ 24 апреля 2020

Я не использовал ни pg_repack, ни логическую репликацию, но в соответствии с pg_repack Github-репозиторием возможна проблема с использованием pg_repack с логической репликацией: см. https://github.com/reorg/pg_repack/issues/135

...