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

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

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

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

Begin #
Byte1('B')

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

Int64 (XLogRecPtr)

Последний LSN транзакции.

Int64 (TimestampTz)

Метка времени коммита транзакции. Значение указано в количестве микросекунд с момента начала эпохи PostgreSQL (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)

Метка времени коммита транзакции. Значение указано в количестве микросекунд с момента начала эпохи PostgreSQL (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 отношения, соответствующего ID в сообщении отношения.

Byte1('N')

Определяет следующее сообщение TupleData как новый кортеж.

TupleData

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

Update #
Byte1('U')

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

Int32 (TransactionId)

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

Int32 (Oid)

OID отношения, соответствующего ID в сообщении отношения.

Byte1('K')

Определяет следующее подсообщение TupleData как ключ. Это поле является необязательным и присутствует только в том случае, если обновление изменило данные в любом из столбцов, которые являются частью индекса REPLICA IDENTITY.

Byte1('O')

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

TupleData

TupleData часть сообщения, представляющая содержимое старой кортежи или первичного ключа. Присутствует только если предыдущая часть 'O' или 'K' присутствует.

Byte1('N')

Определяет следующее сообщение TupleData как новый кортеж.

TupleData

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

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

Delete #
Byte1('D')

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

Int32 (TransactionId)

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

Int32 (Oid)

OID отношения, соответствующего ID в сообщении отношения.

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)

Метка времени коммита транзакции. Значение указано в количестве микросекунд с момента начала эпохи PostgreSQL (2000-01-01).

Stream Abort #
Byte1('A')

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

Int32 (TransactionId)

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

Int32 (TransactionId)

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

Int64 (XLogRecPtr)

LSN отката. Это поле доступно начиная с версии протокола 4.

Int64 (TimestampTz)

Метка времени прерывания транзакции. Значение указано в микросекундах с эпохи PostgreSQL (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)

Подготовьте временную метку транзакции. Значение указано в количестве микросекунд с начала эпохи PostgreSQL (2000-01-01).

Int32 (TransactionId)

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

String

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

Prepare #
Byte1('P')

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

Int8(0)

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

Int64 (XLogRecPtr)

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

Int64 (XLogRecPtr)

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

Int64 (TimestampTz)

Подготовьте временную метку транзакции. Значение указано в количестве микросекунд с начала эпохи PostgreSQL (2000-01-01).

Int32 (TransactionId)

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

String

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

Commit Prepared #
Byte1('K')

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

Int8(0)

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

Int64 (XLogRecPtr)

LSN (логический номер последовательности) коммита подготовленной транзакции.

Int64 (XLogRecPtr)

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

Int64 (TimestampTz)

Метка времени коммита транзакции. Значение указано в количестве микросекунд с момента начала эпохи PostgreSQL (2000-01-01).

Int32 (TransactionId)

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

String

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

Rollback Prepared #
Byte1('r')

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

Int8(0)

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

Int64 (XLogRecPtr)

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

Int64 (XLogRecPtr)

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

Int64 (TimestampTz)

Подготовьте временную метку транзакции. Значение указано в количестве микросекунд с начала эпохи PostgreSQL (2000-01-01).

Int64 (TimestampTz)

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

Int32 (TransactionId)

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

String

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

Stream Prepare #
Byte1('p')

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

Int8(0)

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

Int64 (XLogRecPtr)

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

Int64 (XLogRecPtr)

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

Int64 (TimestampTz)

Подготовьте временную метку транзакции. Значение указано в количестве микросекунд с начала эпохи PostgreSQL (2000-01-01).

Int32 (TransactionId)

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

String

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

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

TupleData #
Int16

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

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

Byte1('n')

Определяет данные как значение NULL.

Или

Byte1('u')

Определяет неизмененное значение TOASTed (фактическое значение не отправляется).

Или

Byte1('t')

Определяет данные как значение в формате текста.

Или

Byte1('b')

Определяет данные как значение в бинарном формате.

Int32

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

Byten

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