Форматы сообщений логической репликации

В этом разделе подробно описывается формат всех сообщений логической репликации. Эти сообщения либо возвращаются через SQL-интерфейс слота репликации, либо передаются передатчиком WAL. В варианте с передатчиком WAL они заключаются внутрь WAL-сообщений протокола репликации, описанных в разделе Протокол потоковой репликации и в целом следуют тому же потоку сообщений, что и при физической репликации.

Begin

Byte1('B')
Показывает, что это начальное сообщение.

Int64 (XLogRecPtr)
Конечный LSN транзакции.

Int64 (TimestampTz)
Временная метка фиксации транзакции. Значение является количеством микросекунд, прошедших с начала эпохи QHB (2000-01-01).

Int32 (TransactionId)
Идентификатор транзакции.

Message

Byte1('M')
Показывает, что это сообщение логического декодирования.

Int32 (TransactionId)
Идентификатор транзакции (присутствует только для потоковых транзакций). Это поле доступно со 2-й версии протокола.

Int8
Флаги; либо 0 при отсутствии флагов, либо 1, если сообщение логического декодирования является транзакционным.

Int64 (XLogRecPtr)
LSN сообщения логического декодирования.

String
Префикс сообщения логического декодирования.

Int32
Длина содержимого.

Byten
Содержимое сообщения логического декодирования.

Commit

Byte1('C')
Показывает, что это сообщение о фиксации.

Int8(0)
Флаги; в настоящее время не используются.

Int64 (XLogRecPtr)
LSN фиксации.

Int64 (XLogRecPtr)
Конечный LSN транзакции.

Int64 (TimestampTz)
Временная метка фиксации транзакции. Значение является количеством микросекунд, прошедших с начала эпохи QHB (2000-01-01).

Origin

Byte1('O')
Показывает, что это сообщение об источнике.

Int64 (XLogRecPtr)
LSN фиксации на сервере-источнике.

String
Имя источника.

Обратите внимание, что внутри одной транзакции может быть несколько сообщений Origin.

Relation

Byte1('R')
Показывает, что это сообщение об отношении.

Int32 (TransactionId)
Идентификатор транзакции (присутствует только для потоковых транзакций). Это поле доступно со 2-й версии протокола.

Int32 (Oid)
OID отношения.

String
Пространство имен (пустая строка для pg_catalog).

String
Имя отношения.

Int8
Идентификационная характеристика реплики для отношения (то же, что и столбец relreplident в pg_class).

Int16
Количество столбцов.

Затем для каждого включенного в публикацию столбца (кроме генерируемых) идет следующая часть сообщения:

Int8
Флаги для столбца. В настоящее время это может быть 0, означающий, что флагов нет, или 1, который помечает столбец как часть ключа.

String
Имя столбца.

Int32 (Oid)
OID типа данных столбца.

Int32
Модификатор типа столбца (atttypmod).

Type

Byte1('Y')
Показывает, что это сообщение о типе.

Int32 (TransactionId)
Идентификатор транзакции (присутствует только для потоковых транзакций). Это поле доступно со 2-й версии протокола.

Int32 (Oid)
OID типа данных.

String
Пространство имен (пустая строка для pg_catalog).

String
Имя типа данных.

Insert

Byte1('I')
Показывает, что это сообщение о добавлении данных.

Int32 (TransactionId)
Идентификатор транзакции (присутствует только для потоковых транзакций). Это поле доступно со 2-й версии протокола.

Int32 (Oid)
OID отношения, соответствующий идентификатору в сообщении об отношении.

Byte1('N')
Обозначает следующее сообщение TupleData как новый кортеж.

TupleData
Раздел сообщения TupleData, представляющий содержимое нового кортежа.

Update

Byte1('U')
Показывает, что это сообщение об изменении данных.

Int32 (TransactionId)
Идентификатор транзакции (присутствует только для потоковых транзакций). Это поле доступно со 2-й версии протокола.

Int32 (Oid)
OID отношения, соответствующий идентификатору в сообщении об отношении.

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 (TransactionId)
Идентификатор транзакции (присутствует только для потоковых транзакций). Это поле доступно со 2-й версии протокола.

Int32 (Oid)
OID отношения, соответствующий идентификатору в сообщении об отношении.

Byte1('K')
Определяет следующее вложенное сообщение TupleData как ключ. Это поле присутствует, только если таблица, в которой произошло удаление, использует индекс в качестве REPLICA IDENTITY.

Byte1('O')
Определяет следующее вложенное сообщение TupleData как старый кортеж. Это поле присутствует, только если у таблицы, в которой произошло удаление, свойство REPLICA IDENTITY равно FULL.

TupleData
Раздел сообщения TupleData, представляющий содержимое старого кортежа или первичного ключа, в зависимости от предыдущего поля.

Сообщение Delete может содержать либо раздел 'K', либо раздел 'O', либо ни один из них, но не оба сразу.

Truncate

Byte1('T')
Показывает, что это сообщение об опустошении отношений.

Int32 (TransactionId)
Идентификатор транзакции (присутствует только для потоковых транзакций). Это поле доступно со 2-й версии протокола.

Int32
Количество отношений.

Int8
Битовые параметры для TRUNCATE: 1 для указания CASCADE, 2 для указания RESTART IDENTITY.

Int32 (Oid)
OID отношения, соответствующий идентификатору в сообщении об отношении. Это поле повторяется для каждого отношения.

Следующие сообщения (Stream Start, Stream Stop, Stream Commit и Stream Abort) доступны со 2-й версии протокола.

Stream Start

Byte1('S')
Показывает, что это сообщение о начале потока.

Int32 (TransactionId)
Идентификатор транзакции.

Int8
Значение 1 показывает, что это первый сегмент потока с этим идентификатором; 0 для любого другого сегмента потока.

Stream Stop

Byte1('E')
Показывает, что это сообщение об окончании потока.

Stream Commit

Byte1('c')
Показывает, что это сообщение о фиксации транзакции в потоке.

Int32 (TransactionId)
Идентификатор транзакции.

Int8(0)
Флаги; в настоящее время не используются.

Int64 (XLogRecPtr)
LSN фиксации.

Int64 (XLogRecPtr)
Конечный LSN транзакции.

Int64 (TimestampTz)
Временная метка фиксации транзакции. Значение является количеством микросекунд, прошедших с начала эпохи QHB (2000-01-01).

Stream Abort

Byte1('A')
Показывает, что это сообщение о прерывании транзакции в потоке.

Int32 (TransactionId)
Идентификатор транзакции.

Int32 (TransactionId)
Идентификатор субтранзакции (для транзакций верхнего уровня будет совпадать с идентификатором транзакций).

Int64 (XLogRecPtr)
LSN операции прерывания, присутствует, только если для потоковой передачи установлено значение parallel. Это поле доступно с 4-й версии протокола.

Int64 (TimestampTz)
Временная метка прерывания транзакции, присутствует, только если для потоковой передачи установлено значение parallel. Значение является количеством микросекунд, прошедших с начала эпохи QHB (2000-01-01). Это поле доступно с 4-й версии протокола.

Следующие сообщения (Begin Prepare, Prepare, Commit Prepared, Rollback Prepared, Stream Prepare) доступны с 3-й версии протокола.

Begin Prepare

Byte1('b')
Показывает, что это сообщение о начале подготовленной транзакции.

Int64 (XLogRecPtr)
LSN подготовки транзакции.

Int64 (XLogRecPtr)
Конечный LSN подготовленной транзакции.

Int64 (TimestampTz)
Временная метка подготовки транзакции. Значение является количеством микросекунд, прошедших с начала эпохи QHB (2000-01-01).

Int32 (TransactionId)
Идентификатор транзакции.

String
Пользовательский GID подготовленной транзакции.

Prepare

Byte1('P')
Показывает, что это сообщение о подготовленной транзакции.

Int8(0)
Флаги; в настоящее время не используются.

Int64 (XLogRecPtr)
LSN подготовки транзакции.

Int64 (XLogRecPtr)
Конечный LSN подготовленной транзакции.

Int64 (TimestampTz)
Временная метка подготовки транзакции. Значение является количеством микросекунд, прошедших с начала эпохи QHB (2000-01-01).

Int32 (TransactionId)
Идентификатор транзакции.

String
Пользовательский GID подготовленной транзакции.

Commit Prepared

Byte1('K')
Показывает, что это сообщение о фиксации подготовленной транзакции.

Int8(0)
Флаги; в настоящее время не используются.

Int64 (XLogRecPtr)
LSN фиксации подготовленной транзакции.

Int64 (XLogRecPtr)
Конечный LSN фиксации подготовленной транзакции.

Int64 (TimestampTz)
Временная метка подготовки транзакции. Значение является количеством микросекунд, прошедших с начала эпохи QHB (2000-01-01).

Int32 (TransactionId)
Идентификатор транзакции.

String
Пользовательский GID подготовленной транзакции.

Rollback Prepared

Byte1('r')
Показывает, что это сообщение об откате подготовленной транзакции.

Int8(0)
Флаги; в настоящее время не используются.

Int64 (XLogRecPtr)
Конечный LSN подготовленной транзакции.

Int64 (XLogRecPtr)
Конечный LSN отката подготовленной транзакции.

Int64 (TimestampTz)
Временная метка подготовки транзакции. Значение является количеством микросекунд, прошедших с начала эпохи QHB (2000-01-01).

Int64 (TimestampTz)
Временная метка отката транзакции. Значение является количеством микросекунд, прошедших с начала эпохи QHB (2000-01-01).

Int32 (TransactionId)
Идентификатор транзакции.

String
Пользовательский GID подготовленной транзакции.

Stream Prepare

Byte1('p')
Показывает, что это сообщение о потоковой передаче подготовленной транзакции.

Int8(0)
Флаги; в настоящее время не используются.

Int64 (XLogRecPtr)
LSN подготовки транзакции.

Int64 (XLogRecPtr)
Конечный LSN подготовленной транзакции.

Int64 (TimestampTz)
Временная метка подготовки транзакции. Значение является количеством микросекунд, прошедших с начала эпохи QHB (2000-01-01).

Int32 (TransactionId)
Идентификатор транзакции.

String
Пользовательский GID подготовленной транзакции.

Описанные выше сообщения имеют следующие общие разделы.

TupleData

Int16
Количество столбцов.

Затем для каждого столбца (кроме генерируемых) идет одно из следующих вложенных сообщений:

Byte1('n')
Обозначает данные как значение NULL.

Или

Byte1('u')
Обозначает неизмененное значение TOAST (само значение не передается).

Или

Byte1('t')
Обозначает данные как значение в текстовом формате.

Или

Byte1('b')
Обозначает данные как значение в двоичном формате.

Int32
Длина значения столбца.

Byten
Значение столбца в двоичном или текстовом формате (определяется предшествующим байтом формата). n задает длину значения (см. выше).