Форматы сообщений логической репликации
В этом разделе описывается подробный формат каждого логического сообщения репликации. Эти сообщения либо возвращаются 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 - длина, указанная выше.