Логическая репликация PostgreSQL - игнорировать уже существующие данные
Представьте себе отказ от подписки и воссоздание ее с нуля. Можно ли игнорировать существующие данные во время первой синхронизации?
Создание подписки с (copy_data=false)
это не вариант, потому что я хочу скопировать данные, я просто не хочу копировать уже существующие данные.
Пример: есть users
таблица и соответствующая публикация на мастера. Эта таблица содержит 1 миллион строк, и каждую минуту добавляется новая строка. Затем мы отбрасываем подписку на один день.
Если мы воссоздаем подписку с (copy_data=true)
, репликация не начнется из-за конфликта с уже существующими данными. Если мы укажем (copy_data=false)
1440 новых строк будут отсутствовать. Как правильно синхронизировать издателя и подписчика?
2 ответа
Вы не можете этого сделать, потому что PostgreSQL не может сказать, когда были добавлены данные.
Вы должны были бы согласовать таблицы вручную (или INSERT ... ON CONFLICT DO NOTHING
).
К сожалению, PostgreSQL пока не поддерживает приятные опции пропуска для конфликтов, но я думаю, что эта функция будет улучшена.
На основе ответа @Laurenz Albe, который рекомендует использовать утверждение:
INSERT ... ON CONFLICT DO NOTHING.
Я считаю, что было бы лучше использовать следующую команду, которая также позаботится о любых возможных обновлениях ваших данных, прежде чем вы снова начнете подписку:
INSERT ... ON CONFLICT UPDATE SET...
Наконец, я должен сказать, что оба решения являются грязными, так как во время выполнения приведенного выше оператора и создания подписки могут быть получены новые строки, что приведет к их потере, пока вы снова не выполните пользовательскую синхронизацию.
Я видел некоторые другие предлагаемые решения, использующие номер LSN из файла журнала Postgresql...
Для меня, возможно, элегантно и безопасно удалить все данные из целевой таблицы и снова создать репликацию!