56.9. Форматы сообщений логической репликации #
В этом разделе подробно описывается формат каждого сообщения логической репликации. Эти сообщения или выдаются через SQL-интерфейс слота репликации или передаются процессом walsender. Когда их передаёт walsender, они помещаются внутрь WAL-сообщений протокола репликации, описанных в Разделе 56.4, и в общем следуют тому же потоку сообщений, что и сообщения физической репликации.
- Begin #
- Byte1('B')
Указывает, что это начальное сообщение.
- Int64 (XLogRecPtr)
Окончательный LSN транзакции.
- Int64 (TimestampTz)
Время фиксации транзакции. Значение задаётся в микросекундах, прошедших с начала эпохи PostgreSQL (2000-01-01).
- Int64 (TransactionId)
Идентификатор транзакции.
- Сообщение #
- Byte1('M')
Указывает, что это сообщение логического декодирования.
- Int64 (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')
Указывает, что это сообщение об отношении.
- Int64 (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')
Указывает, что это сообщение о типе.
- Int64 (TransactionId)
Идентификатор транзакции (только для транзакций, передаваемых потоками). Это поле присутствует со 2-й версии протокола.
- Int32 (Oid)
OID типа данных.
- String
Пространство имён (пустая строка для
pg_catalog
).- String
Имя типа данных.
- Insert #
- Byte1('I')
Указывает, что это сообщение о добавлении данных.
- Int64 (TransactionId)
Идентификатор транзакции (только для транзакций, передаваемых потоками). Это поле присутствует со 2-й версии протокола.
- Int32 (Oid)
OID отношения, соответствующий идентификатору в сообщении об отношении.
- Byte1('N')
Обозначает следующее сообщение TupleData как содержащее новый кортеж.
- TupleData
Блок сообщения TupleData, представляющий содержимое нового кортежа.
- Update #
- Byte1('U')
Указывает, что это сообщение об изменении данных.
- Int64 (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')
Указывает, что это сообщение об удалении данных.
- Int64 (TransactionId)
Идентификатор транзакции (только для транзакций, передаваемых потоками). Это поле присутствует со 2-й версии протокола.
- Int32 (Oid)
OID отношения, соответствующий идентификатору в сообщении об отношении.
- Byte1('K')
Указывает, что следующий блок TupleData содержит ключ. Это поле присутствует, если таблица, в которой произошло удаление, использует индекс в качестве REPLICA IDENTITY.
- Byte1('O')
Указывает, что следующий блок TupleData содержит старый кортеж. Это поле присутствует, если у таблицы, в которой произошло удаление, свойство REPLICA IDENTITY равно FULL.
- TupleData
Блок сообщения TupleData, представляющий содержимое старого кортежа или первичного ключа, в зависимости от предыдущего поля.
Сообщение Delete может содержать либо блок 'K', либо блок 'O', но не оба сразу.
- Truncate #
- Byte1('T')
Указывает, что это сообщение об усечении отношений.
- Int64 (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')
Указывает, что это сообщение о начале потока.
- Int64 (TransactionId)
Идентификатор транзакции.
- Int8
1 означает, что это первый сегмент потока с этим идентификатором; 0, если это любой другой сегмент.
- Stream Stop #
- Byte1('E')
Указывает, что это сообщение об окончании потока.
- Stream Commit #
- Byte1('c')
Указывает, что это сообщение о фиксации транзакции в потоке.
- Int64 (TransactionId)
Идентификатор транзакции.
- Int8(0)
Флаги; в настоящее время не используются.
- Int64 (XLogRecPtr)
LSN записи фиксации.
- Int64 (XLogRecPtr)
Конечный LSN транзакции.
- Int64 (TimestampTz)
Время фиксации транзакции. Значение задаётся в микросекундах, прошедших с начала эпохи Postgres Pro (2000-01-01).
- Stream Abort #
- Byte1('A')
Указывает, что это сообщение о прерывании транзакции в потоке.
- Int64 (TransactionId)
Идентификатор транзакции.
- Int64 (TransactionId)
Идентификатор подтранзакции (для транзакций верхнего уровня совпадает с идентификатором транзакции).
- 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).
- Int64 (TransactionId)
Идентификатор транзакции.
- String
Пользовательский GID подготовленной транзакции.
- Prepare #
- Byte1('P')
Указывает, что это сообщение о подготовленной транзакции.
- Int8(0)
Флаги; в настоящее время не используются.
- Int64 (XLogRecPtr)
LSN подготовки транзакции.
- Int64 (XLogRecPtr)
Конечный LSN подготовленной транзакции.
- Int64 (TimestampTz)
Время подготовки транзакции. Значение задаётся в микросекундах, прошедших с начала эпохи PostgreSQL (2000-01-01).
- Int64 (TransactionId)
Идентификатор транзакции.
- String
Пользовательский GID подготовленной транзакции.
- Commit Prepared #
- Byte1('K')
Указывает, что это сообщение о фиксации подготовленной транзакции.
- Int8(0)
Флаги; в настоящее время не используются.
- Int64 (XLogRecPtr)
LSN фиксации подготовленной транзакции.
- Int64 (XLogRecPtr)
Конечный LSN фиксации подготовленной транзакции.
- Int64 (TimestampTz)
Время фиксации транзакции. Значение задаётся в микросекундах, прошедших с начала эпохи PostgreSQL (2000-01-01).
- Int64 (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).
- Int64 (TransactionId)
Идентификатор транзакции.
- String
Пользовательский GID подготовленной транзакции.
- Stream Prepare #
- Byte1('p')
Указывает, что это сообщение о подготовленной транзакции, передаваемой в потоке.
- Int8(0)
Флаги; в настоящее время не используются.
- Int64 (XLogRecPtr)
LSN подготовки транзакции.
- Int64 (XLogRecPtr)
Конечный LSN подготовленной транзакции.
- Int64 (TimestampTz)
Время подготовки транзакции. Значение задаётся в микросекундах, прошедших с начала эпохи PostgreSQL (2000-01-01).
- Int64 (TransactionId)
Идентификатор транзакции.
- String
Пользовательский GID подготовленной транзакции.
Описанные выше сообщения имеют следующие общие блоки.
- TupleData #
- Int16
Число столбцов.
Затем для каждого столбца (за исключением генерируемых) идёт одно из следующих вложенных сообщений:
- Byte1('n')
Обозначает данные как значение NULL.
Или
- Byte1('u')
Обозначает неизменённое значение TOAST (само значение не передаётся).
Или
- Byte1('t')
Обозначает данные как значение в текстовом формате.
Или
- Byte1('b')
Обозначает данные как значение в двоичном формате.
- Int32
Длина значения столбца.
- Byte
n
Значение столбца в двоичном или текстовом формате, определённом предшествующим байтом формата. Переменная
n
задаёт длину значения.