Перейти к основному содержимому

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

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

Begin

Byte1('B')

Идентифицирует сообщение как начальное.

Int64 (XLogRecPtr)

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

Int64 (TimestampTz)

Временная метка фиксации транзакции. Значение указывается в количестве микросекунд от эпохи Post- greSQL (2000-01-01).

Int32 (TransactionId)

Xid транзакции.

Message

Byte1('M')

Идентифицирует сообщение как сообщение логического декодирования.

Int32 (TransactionId)

Xid транзакции (присутствует только для потоковых транзакций). Это поле доступно начиная с версии протокола 2.

Int8

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

Int64 (XLogRecPtr)

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

String

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

Int32

Длина контента.

Byten

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

Commit

Byte1('C')

Идентифицирует сообщение как сообщение фиксации.

Int8(0)

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

Int64 (XLogRecPtr)

LSN фиксации.

Int64 (XLogRecPtr)

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

Int64 (TimestampTz)

Временная метка фиксации транзакции. Значение указывается в количестве микросекунд от эпохи Post- greSQL (2000-01-01).

Origin

Byte1('O')

Идентифицирует сообщение как сообщение происхождения.

Int64 (XLogRecPtr)

LSN фиксации на сервере происхождения.

String

Название происхождения.

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

Relation

Byte1('R')

Идентифицирует сообщение как сообщение отношения.

Int32 (TransactionId)

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

Xid транзакции (присутствует только для потоковых транзакций). Это поле доступно начиная с версии протокола 2.

Int32 (Oid)

OID типа данных.

String

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

String

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

Insert

Byte1('I')

Идентифицирует сообщение как сообщение для вставки.

Int32 (TransactionId)

Xid транзакции (присутствует только для потоковых транзакций). Это поле доступно начиная с версии протокола 2.

Int32 (Oid)

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

Byte1('N')

Идентифицирует следующее сообщение TupleData как новый кортеж.

TupleData

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

Update

Byte1('U')

Идентифицирует сообщение как сообщение обновления.

Int32 (TransactionId)

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

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

Xid транзакции (присутствует только для потоковых транзакций). Это поле доступно начиная с версии протокола 2.

Int32

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

Int8

Биты опции для TRUNCATE: 1 для CASCADE, 2 для RESTART IDENTITY

Int32 (Oid)

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

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

Stream Start

Byte1('S')

Идентифицирует сообщение как сообщение о начале потока.

Int32 (TransactionId)

Xid транзакции.

Int8

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

Stream Stop

Byte1('E')

Идентифицирует сообщение как сообщение об остановке потока.

Stream Commit

Byte1('c')

Идентифицирует сообщение как сообщение фиксации потока.

Int32 (TransactionId)

Xid транзакции.

Int8(0)

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

Int64 (XLogRecPtr)

LSN фиксации.

Int64 (XLogRecPtr)

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

Int64 (TimestampTz)

Временная метка фиксации транзакции. Значение указывается в количестве микросекунд от эпохи Post- greSQL (2000-01-01).

Stream Abort

Byte1('A')

Идентифицирует сообщение как сообщение о прерывании потока.

Int32 (TransactionId)

Xid транзакции.

Int32 (TransactionId)

Xid субтранзакции (будет таким же, как xid транзакции для транзакций верхнего уровня).

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

Begin Prepare

Byte1('b')

Идентифицирует сообщение как начало сообщения подготовленной транзакции.

Int64 (XLogRecPtr)

LSN подготовки.

Int64 (XLogRecPtr)

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

Int64 (TimestampTz)

Временная метка подготовки транзакции. Значение указывается в количестве микросекунд от эпохи Post- greSQL (2000-01-01).

Int32 (TransactionId)

Xid транзакции.

String

Определенный пользователем GID подготовленной транзакции.

Prepare

Byte1('P')

Идентифицирует сообщение как сообщение подготовленной транзакции.

Int8(0)

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

Int64 (XLogRecPtr)

LSN подготовки.

Int64 (XLogRecPtr)

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

Int64 (TimestampTz)

Временная метка подготовки транзакции. Значение указывается в количестве микросекунд от эпохи Post- greSQL (2000-01-01).

Int32 (TransactionId)

Xid транзакции.

String

Определенный пользователем GID подготовленной транзакции.

Commit Prepared

Byte1('K')

Идентифицирует сообщение как фиксацию сообщения подготовленной транзакции.

Int8(0)

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

Int64 (XLogRecPtr)

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

Int64 (XLogRecPtr)

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

Int64 (TimestampTz)

Временная метка фиксации транзакции. Значение указывается в количестве микросекунд от эпохи Post- greSQL (2000-01-01).

Int32 (TransactionId)

Xid транзакции.

String

Определенный пользователем GID подготовленной транзакции.

Rollback Prepared

Byte1('r')

Идентифицирует сообщение как сообщение об откате подготовленной транзакции.

Int8(0)

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

Int64 (XLogRecPtr)

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

Int64 (XLogRecPtr)

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

Int64 (TimestampTz)

Временная метка подготовки транзакции. Значение указывается в количестве микросекунд от эпохи Post- greSQL (2000-01-01).

Int64 (TimestampTz)

Временная метка отката транзакции. Значение указывается в количестве микросекунд от эпохи Post- greSQL (2000-01-01).

Int32 (TransactionId)

Xid транзакции.

String

Определенный пользователем GID подготовленной транзакции.

Stream Prepare

Byte1('p')

Идентифицирует сообщение как сообщение транзакции, подготовленное для потока.

Int8(0)

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

Int64 (XLogRecPtr)

LSN подготовки.

Int64 (XLogRecPtr)

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

Int64 (TimestampTz)

Временная метка подготовки транзакции. Значение указывается в количестве микросекунд от эпохи Post- greSQL (2000-01-01).

Int32 (TransactionId)

Xid транзакции.

String

Определенный пользователем GID подготовленной транзакции.

Следующие части сообщения являются общими для всех вышеперечисленных сообщений.

TupleData

Int16

Количество колонок.

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

Byte1('n')

Идентифицирует данные как значение NULL.

Или Byte1('u')

Идентифицирует неизменное значение TOASTed (фактическое значение не передается).

Или Byte1('t')

Идентифицирует данные как текстовое форматированное значение.

Или Byte1('b')

Идентифицирует данные как двоичное форматированное значение.

Int32

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

Byten

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