54.9. Форматы сообщений логической репликации #
В этом разделе подробно описывается формат каждого сообщения логической репликации. Эти сообщения или выдаются через SQL-интерфейс слота репликации или передаются процессом walsender. Когда их передаёт walsender, они помещаются внутрь WAL-сообщений протокола репликации, описанных в Разделе 54.4, и в общем следуют тому же потоку сообщений, что и сообщения физической репликации.
- Begin #
 - Byte1('B')
 Указывает, что это начальное сообщение.
- Int64 (XLogRecPtr)
 Окончательный LSN транзакции.
- Int64 (TimestampTz)
 Время фиксации транзакции. Значение задаётся в микросекундах, прошедших с начала эпохи PostgreSQL (2000-01-01).
- Int32 (TransactionId)
 Идентификатор транзакции.
- Сообщение #
 - Byte1('M')
 Указывает, что это сообщение логического декодирования.
- Int32 (TransactionId)
 Идентификатор транзакции (только для транзакций, передаваемых потоками). Это поле присутствует со 2-й версии протокола.
- Int8
 Флаги; либо 0, если флагов нет, либо 1, если сообщение логического декодирования передано как транзакционное.
- Int64 (XLogRecPtr)
 LSN сообщения логического декодирования.
- String
 Префикс сообщения логического декодирования.
- Int32
 Длина содержимого сообщения.
- Byte
n Содержание сообщения логического декодирования.
- Commit #
 - Byte1('C')
 Указывает, что это сообщение о фиксации.
- Int8(0)
 Флаги; в настоящее время не используются.
- Int64 (XLogRecPtr)
 LSN записи фиксации.
- Int64 (XLogRecPtr)
 Конечный LSN транзакции.
- Int64 (TimestampTz)
 Время фиксации транзакции. Значение задаётся в микросекундах, прошедших с начала эпохи Postgres Pro (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).
- Тип #
 - 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)
 Время фиксации транзакции. Значение задаётся в микросекундах, прошедших с начала эпохи Postgres Pro (2000-01-01).
- Stream Abort #
 - Byte1('A')
 Указывает, что это сообщение о прерывании транзакции в потоке.
- Int32 (TransactionId)
 Идентификатор транзакции.
- Int32 (TransactionId)
 Идентификатор подтранзакции (для транзакций верхнего уровня совпадает с идентификатором транзакции).
- Int64 (XLogRecPtr)
 LSN операции прерывания, существует только если задано значение
parallel. Это поле присутствует с 4-й версии протокола.- Int64 (TimestampTz)
 Время прерывания транзакции, существует только если задано значение
parallel. Значение задаётся в микросекундах, прошедших с начала эпохи 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)
 Идентификатор транзакции.
- String
 Пользовательский GID подготовленной транзакции.
- Prepare #
 - Byte1('P')
 Указывает, что это сообщение о подготовленной транзакции.
- Int8(0)
 Флаги; в настоящее время не используются.
- Int64 (XLogRecPtr)
 LSN подготовки транзакции.
- Int64 (XLogRecPtr)
 Конечный LSN подготовленной транзакции.
- Int64 (TimestampTz)
 Время подготовки транзакции. Значение задаётся в микросекундах, прошедших с начала эпохи PostgreSQL (2000-01-01).
- Int32 (TransactionId)
 Идентификатор транзакции.
- String
 Пользовательский GID подготовленной транзакции.
- Commit Prepared #
 - Byte1('K')
 Указывает, что это сообщение о фиксации подготовленной транзакции.
- Int8(0)
 Флаги; в настоящее время не используются.
- Int64 (XLogRecPtr)
 LSN фиксации подготовленной транзакции.
- Int64 (XLogRecPtr)
 Конечный LSN фиксации подготовленной транзакции.
- Int64 (TimestampTz)
 Время фиксации транзакции. Значение задаётся в микросекундах, прошедших с начала эпохи PostgreSQL (2000-01-01).
- Int32 (TransactionId)
 Идентификатор транзакции.
- 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)
 Идентификатор транзакции.
- String
 Пользовательский GID подготовленной транзакции.
- Stream Prepare #
 - Byte1('p')
 Указывает, что это сообщение о подготовленной транзакции, передаваемой в потоке.
- Int8(0)
 Флаги; в настоящее время не используются.
- Int64 (XLogRecPtr)
 LSN подготовки транзакции.
- Int64 (XLogRecPtr)
 Конечный LSN подготовленной транзакции.
- Int64 (TimestampTz)
 Время подготовки транзакции. Значение задаётся в микросекундах, прошедших с начала эпохи PostgreSQL (2000-01-01).
- Int32 (TransactionId)
 Идентификатор транзакции.
- String
 Пользовательский GID подготовленной транзакции.
Описанные выше сообщения имеют следующие общие блоки.
- TupleData #
 - Int16
 Число столбцов.
Затем для каждого столбца (за исключением генерируемых) идёт одно из следующих вложенных сообщений:
- Byte1('n')
 Обозначает данные как значение NULL.
Или
- Byte1('u')
 Обозначает неизменённое значение TOAST (само значение не передаётся).
Или
- Byte1('t')
 Обозначает данные как значение в текстовом формате.
Или
- Byte1('b')
 Обозначает данные как значение в двоичном формате.
- Int32
 Длина значения столбца.
- Byte
n Значение столбца в двоичном или текстовом формате, определённом предшествующим байтом формата. Переменная
nзадаёт длину значения.