Пейджер

🌍 Вітаю вас, шаноўныя сябры! 🇧🇾

TL;DR
  • Ошибка: PG не может реплицировать UPDATE/DELETE без настроенного replica identity
  • Четыре режима: Default (PK), Using Index, Full, Nothing
  • Логическая репликация для Kafka, BigQuery, аудита, синхронизации БД
  • Sequelize может незаметно триггерить логическую репликацию
🌍 Вітаю вас, шаноўныя сябры! 🇧🇾

Что-то я подгораю🔥 на работе, нет даже времени до конца шорткаты на Vim изучить, а еще gopher🤡 на меня серьезно смотрит, но про вас я не забываю и сегодня рабочий кейс к вашим услугам 🥳.

PostgreSQL Replica Identity слыхали о таком? Уверен что 95% моих читателей не слышали, было бы даже интересно узнать статистику.

Кто встречал или слышал ставьте ➕ в комментариях, буду пальцы загибать 1️⃣.

🚀 Мотивация

Не думал что столкнусь когда-нибудь с такой ошибкой

cannot update table because it does not have a replica identity and publishes updates
или
to enable deleting from the table, set replica identity using alter table

Если сказать просто, это означает что PG не знает как именно находить строки которые подлежат репликации при выполнении операций UPDATE или DELETE. Мы не задали правило (ключ идентификатор)

🧨 Причины


У вас есть база данных PostgreSQL и вам в реальном времени необходимо узнавать, какие строки в ней меняются — и как именно.
Для этого существует логическая репликация.

Logical replication — это метод копирования данных из одной базы данных в другую, который основывается на логических изменениях (вставка, обновление, удаление записей).

Таким образом мы подписываемся на изменения в базе. Когда кто-то делает INSERT, UPDATE или DELETE, приходит событие об этом.

Примеры использования логических репликаций


🟠Cтримим данные в: Kafka, BigQuery, ClickHouse и т.д.
🟠Делаем систему аудита: когда и кто, что-то изменил.
🟠Нам нужна реактивная система: при изменении в БД — автоматически что-то происходит.
🟠Нужно синхронизировать данные между двумя PostgreSQL-инстансами, но не целиком, а только конкретные таблицы.

И получается когда вы вносите изменения в базу, к примеру через Sequelize это становится событием логической репликации.

А если таблицы не настроены правильно — возникает ошибка, которую я показал выше ⤴️.

Как должны быть настроены таблицы

Чтобы поправить ошибку нам нужно установить replica identity, а для этого нужно знать какие варианты существуют:

В PostgreSQL есть 4 режима REPLICA IDENTITY:

1️⃣ Default

🟠Используется Primary key.
🟠Если PK нет — UPDATE/DELETE ⚠️ не будут реплицироваться!
🟠При таком режике будет передан PK + новые значения
🟠Это значение по умолчанию ⚠️.

2️⃣ Using Index <index_name>

🟠Явно указывается индекс, который будет использоваться как identity.
🟠Могут быть случай когда вы не хотите использовать PK.

3️⃣ Full

🟠 В репликацию будет попадать вся строка целиком ⚠️, даже если не все было изменено.
🟠 Медленно по сравнению с остальными режимами.

4️⃣ Nothing

🟠 Репликация UPDATE и DELETE недоступна ⚠️.
🟠 Подписка будет получать только INSERT.

✏️ Полезности

Как посмотреть какое значение установлено для определенной таблицы

SELECT relname, relreplident
FROM pg_class
WHERE relname = 'your_table_name'


🔖 В сухом остатке

✔️ Если таблица участвует в логической репликации — настройте REPLICA IDENTITY
✔️ Без PK или явного индекса UPDATE/DELETE не реплицируются
✔️ Sequelize может триггерить логрепликацию, даже если вы об этом не знали
✔️ Проверяйте, какие таблицы в публикации:
SELECT * FROM pg_publication_tables;


💬 Делитесь своим мнением в комментариях👇! Если вам понравилась статья, не забудьте поставить лайк! 👍

#DATABASE #PostgreSQL
Медиа 1
Хотите больше таких постов?
Подпишитесь на канал и читайте продолжение в Telegram.
Подписаться на @ivanchikovitclub Открыть пост в Telegram