55.9. Форматы сообщений логической репликации
В этом разделе подробно описывается формат каждого сообщения логической репликации. Эти сообщения или выдаются через SQL-интерфейс слота репликации или передаются процессом walsender. Когда их передаёт walsender, они помещаются внутрь WAL-сообщений протокола репликации, описанных в Разделе 55.4, и в общем следуют тому же потоку сообщений, что и сообщения физической репликации.
- Begin
 - Byte1('B')
 Указывает, что это начальное сообщение.
- Int64
 Окончательный LSN транзакции.
- Int64
 Время фиксации транзакции. Значение задаётся в микросекундах, прошедших с начала эпохи Postgres Pro (2000-01-01).
- Int32
 Идентификатор транзакции.
- Commit
 - Byte1('C')
 Указывает, что это сообщение о фиксации.
- Int8
 Флаги; в настоящее время не используются (поле должно содержать 0).
- Int64
 LSN записи фиксации.
- Int64
 Конечный LSN транзакции.
- Int64
 Время фиксации транзакции. Значение задаётся в микросекундах, прошедших с начала эпохи Postgres Pro (2000-01-01).
- Origin
 - Byte1('O')
 Указывает, что это сообщение об источнике.
- Int64
 LSN записи фиксации на сервере-источнике.
- String
 Имя источника.
Заметьте, что внутри одной транзакции может быть несколько сообщений Origin.
- Relation
 - Byte1('R')
 Указывает, что это сообщение об отношении.
- Int32
 Идентификатор отношения.
- String
 Пространство имён (пустая строка для
pg_catalog).- String
 Имя отношения.
- Int8
 Свойство идентификации реплики для отношения (то же, что и
relreplidentвpg_class).- Int16
 Число столбцов.
Затем для каждого столбца (за исключением генерируемых) идёт следующий блок сообщения:
- Int8
 Флаги столбца. В настоящее время это может быть 0 (флагов нет) или 1 (столбец помечается как часть ключа).
- String
 Имя столбца.
- Int32
 Идентификатор типа данных столбца.
- Int32
 Модификатор типа столбца (
atttypmod).
- Тип
 - Byte1('Y')
 Указывает, что это сообщение о типе.
- Int32
 Идентификатор типа данных.
- String
 Пространство имён (пустая строка для
pg_catalog).- String
 Имя типа данных.
- Insert
 - Byte1('I')
 Указывает, что это сообщение о добавлении данных.
- Int32
 Идентификатор отношения, соответствующий идентификатору в сообщении об отношении.
- Byte1('N')
 Обозначает следующее сообщение TupleData как содержащее новый кортеж.
- TupleData
 Блок сообщения TupleData, представляющий содержимое нового кортежа.
- Update
 - Byte1('U')
 Указывает, что это сообщение об изменении данных.
- Int32
 Идентификатор отношения, соответствующий идентификатору в сообщении об отношении.
- Byte1('K')
 Указывает, что следующий блок TupleData содержит ключ. Это поле является необязательным и присутствует, только если изменение затронуло столбцы, являющиеся частью индекса REPLICA IDENTITY.
- Byte1('O')
 Указывает, что следующий блок TupleData содержит старый кортеж. Это поле является необязательным и присутствует, только если у таблицы, в которой произошло изменение, свойство REPLICA IDENTITY равно FULL.
- TupleData
 Блок сообщения TupleData, представляющий содержимое старого кортежа или первичного ключа. Присутствует, только если перед ним идёт признак 'O' или 'K'.
- Byte1('N')
 Обозначает следующее сообщение TupleData как содержащее новый кортеж.
- TupleData
 Блок сообщения TupleData, представляющий содержимое нового кортежа.
Сообщение Update может содержать либо блок 'K', либо блок 'O', либо ни один из них, но не оба сразу.
- Delete
 - Byte1('D')
 Указывает, что это сообщение об удалении данных.
- Int32
 Идентификатор отношения, соответствующий идентификатору в сообщении об отношении.
- Byte1('K')
 Указывает, что следующий блок TupleData содержит ключ. Это поле присутствует, если таблица, в которой произошло удаление, использует индекс в качестве REPLICA IDENTITY.
- Byte1('O')
 Указывает, что следующий блок TupleData содержит старый кортеж. Это поле присутствует, если у таблицы, в которой произошло удаление, свойство REPLICA IDENTITY равно FULL.
- TupleData
 Блок сообщения TupleData, представляющий содержимое старого кортежа или первичного ключа, в зависимости от предыдущего поля.
Сообщение Delete может содержать либо блок 'K', либо блок 'O', но не оба сразу.
- Truncate
 - Byte1('T')
 Указывает, что это сообщение об усечении отношений.
- Int32
 Число отношений.
- Int8
 Битовые флаги для
TRUNCATE: 1 соответствует указаниюCASCADE, 2 —RESTART IDENTITY.- Int32
 Идентификатор отношения, соответствующий идентификатору в сообщении об отношении. Это поле повторятся для каждого отношения.
Описанные выше сообщения имеют следующие общие блоки.
- TupleData
 - Int16
 Число столбцов.
Затем для каждого столбца (за исключением генерируемых) идёт одно из следующих вложенных сообщений:
- Byte1('n')
 Обозначает данные как значение NULL.
Или
- Byte1('u')
 Обозначает неизменённое значение TOAST (само значение не передаётся).
Или
- Byte1('t')
 Обозначает данные как значение в текстовом формате.
- Int32
 Длина значения столбца.
- Byte
n Значение столбца в текстовом формате. (В будущих выпусках могут поддерживаться и другие форматы.) Здесь
n— заданная выше длина.