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
Длина содержимого.
- Byte
n
Содержимое сообщения логического декодирования.
- 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
Длина значения столбца.
- Byte
n
Содержимое столбца, либо в двоичном, либо в текстовом формате. (Как указано в предыдущем байте формата).
n
- это вышеуказанная длина.